我正在尝试使用C#为我的网络应用程序找出加密数据库中几个字段的安全方法。
我需要找到一个执行加密/解密的脚本以及一种存储密钥的方法。我读到你可以使用machinekey作为密钥,这是正确的吗?
有自动生成和非自动生成的机器密钥。我想我宁愿选择非自动生成,因为这样可以很容易地将我的Web应用程序部署到不同的服务器中。我发现这个工具可以为你生成一个:
http://aspnetresources.com/tools/machineKey
使用此计算机密钥可以使用哪种加密/解密脚本?
另外我想知道,将非自动生成的机器密钥存储在web.config文件中有多安全?如果有人可以看到web.config文件,为什么在appSettings中使用machinekey而不是“普通”键呢?
由于
答案 0 :(得分:0)
根据那篇文章,生成了一个256位的解密密钥和一个512位的验证密钥,它们与Rijndael算法一致,所以你需要一个已经在System.Security.Cryptography
命名空间中的C#实现
这是完成这项工作的两个功能:
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);
}
关于你的第二个问题,生成的machinekey是一个十六进制的字符串,它是人类可读的,但你无法弄明白。
我希望这有帮助。