Шифрование - машинный ключ
Я пытаюсь найти безопасный способ шифрования пары полей в моей базе данных, используя C# для моего веб-приложения.
Мне нужно найти скрипт, который выполняет шифрование / дешифрование и способ хранения ключа. Я читал, что вы можете использовать машинный ключ в качестве ключа, это правильно?
Существуют автоматические и неавтоматизированные механические ключи. Я думаю, что я предпочел бы пойти с не сгенерированным автоматически, так как это будет легко развернуть мое веб-приложение на разных серверах. Я нашел этот инструмент, где он генерирует один для вас:
http://aspnetresources.com/tools/machineKey
Какой сценарий шифрования / дешифрования будет работать с этим автоматом?
Также мне было интересно, насколько безопасно хранить неавтоматизированный ключ компьютера в файле web.config? Если кто-то может увидеть файл web.config, зачем использовать machinekey вместо "обычного" ключа в appSettings, например?
Спасибо
1 ответ
В соответствии с этой статьей генерируется 256-битный ключ дешифрования и 512-битный ключ проверки, и они идут с алгоритмом Rijndael, поэтому вам нужна его реализация на C#, которая уже находится в System.Security.Cryptography
Пространство имен.
Вот две функции, которые делают работу:
private static string EncryptString(string clearText,
string strKey, string strIv) {
byte[] plainText = Encoding.UTF8.GetBytes(clearText);
byte[] key = Encoding.UTF8.GetBytes(strKey);
// a simple initialization vector
byte[] iv = Encoding.UTF8.GetBytes(strIv);
RijndaelManaged rijndael = new RijndaelManaged();
//Define the Mode
rijndael.Mode = CipherMode.CBC;
ICryptoTransform aesEncryptor = rijndael.CreateEncryptor(key, iv);
MemoryStream ms = new MemoryStream();
// writing data to MemoryStream
CryptoStream cs = new CryptoStream(ms, aesEncryptor, CryptoStreamMode.Write);
cs.Write(plainText, 0, plainText.Length);
cs.FlushFinalBlock();
byte[] CipherBytes = ms.ToArray();
ms.Close();
cs.Close();
return Convert.ToBase64String(CipherBytes);
}
А также:
public static string DecryptString(string cipherText,
string strKey, string strIv) {
byte[] cipheredData = Convert.FromBase64String(cipherText);
byte[] key = Encoding.UTF8.GetBytes(strKey);
byte[] iv = Encoding.UTF8.GetBytes(strIv);
RijndaelManaged rijndael = new RijndaelManaged();
rijndael.Mode = CipherMode.CBC;
ICryptoTransform decryptor = rijndael.CreateDecryptor(key, iv);
MemoryStream ms = new MemoryStream(cipheredData);
CryptoStream cs = new CryptoStream(ms, decryptor, CryptoStreamMode.Read);
byte[] plainTextData = new byte[cipheredData.Length];
int decryptedByteCount = cs.Read(plainTextData, 0, plainTextData.Length);
ms.Close();
cs.Close();
return Encoding.UTF8.GetString(plainTextData, 0, decryptedByteCount);
}
И что касается вашего второго вопроса, сгенерированный машинный ключ - это шестнадцатеричная строка, которая читается человеком, но вы не можете ее понять.
Я надеюсь, что это поможет.