C# Encryption Functions
i have table in my database that have senestive data such as password field i want to encrypt data before inserting i开发者_运维问答t to table and then i want not to decrypt data but i want only to compare encrypted password with the input password without decrypting
I would recommend you hashing the passwords with salt and store the hashed password and the salt into the database. There's also another article on this topic.
If you don't need to decrypt the data you actually need hashing, e.g. SHA1 or similar algorithms provided by .NET in the System.Security.Cryptography namespace.
Use a hashing function like sha256:
using System.Security.Cryptography;
/// <summary>
/// Hash the given string with sha256
/// </summary>
/// <param name="password">the string to hash</param>
/// <returns>The hex representation of the hash</returns>
static string sha256(string password)
{
SHA256Managed crypt = new SHA256Managed();
string hash = String.Empty;
byte[] crypto = crypt.ComputeHash(Encoding.ASCII.GetBytes(password), 0, Encoding.ASCII.GetByteCount(password));
foreach (byte bit in crypto)
{
hash += bit.ToString("x2");
}
return hash;
}
It will always give the same output for the same input, so you can compare the hashed values. You should also consider salting the input (prepending or appending some value specific to your app/program to hopefully make rainbow tables less useful)
I have 2 functions to encrypt and decrypt data :
The first function is used to Decrypt data and the second one used to Encrypt data.
using System.Security.Cryptography;
using System.Collections.Generic;
using System.ComponentModel;
private static readonly byte[] _key = { 0xA1, 0xF1, 0xA6, 0xBB, 0xA2, 0x5A, 0x37, 0x6F, 0x81, 0x2E, 0x17, 0x41, 0x72, 0x2C, 0x43, 0x27 };
private static readonly byte[] _initVector = { 0xE1, 0xF1, 0xA6, 0xBB, 0xA9, 0x5B, 0x31, 0x2F, 0x81, 0x2E, 0x17, 0x4C, 0xA2, 0x81, 0x53, 0x61 };
private static string Decrypt(string Value)
{
SymmetricAlgorithm mCSP;
ICryptoTransform ct = null;
MemoryStream ms = null;
CryptoStream cs = null;
byte[] byt;
byte[] _result;
mCSP = new RijndaelManaged();
try
{
mCSP.Key = _key;
mCSP.IV = _initVector;
ct = mCSP.CreateDecryptor(mCSP.Key, mCSP.IV);
byt = Convert.FromBase64String(Value);
ms = new MemoryStream();
cs = new CryptoStream(ms, ct, CryptoStreamMode.Write);
cs.Write(byt, 0, byt.Length);
cs.FlushFinalBlock();
cs.Close();
_result = ms.ToArray();
}
catch
{
_result = null;
}
finally
{
if (ct != null)
ct.Dispose();
if (ms != null)
ms.Dispose();
if (cs != null)
cs.Dispose();
}
return ASCIIEncoding.UTF8.GetString(_result);
}
private static string Encrypt(string Password)
{
if (string.IsNullOrEmpty(Password))
return string.Empty;
byte[] Value = Encoding.UTF8.GetBytes(Password);
SymmetricAlgorithm mCSP = new RijndaelManaged();
mCSP.Key = _key;
mCSP.IV = _initVector;
using (ICryptoTransform ct = mCSP.CreateEncryptor(mCSP.Key, mCSP.IV))
{
using (MemoryStream ms = new MemoryStream())
{
using (CryptoStream cs = new CryptoStream(ms, ct, CryptoStreamMode.Write))
{
cs.Write(Value, 0, Value.Length);
cs.FlushFinalBlock();
cs.Close();
return Convert.ToBase64String(ms.ToArray());
}
}
}
}
I hope these 2 functions can help you.
精彩评论