0

我试图找出一种使用 C# 为我的 Web 应用程序加密数据库中几个字段的安全方法。

我需要找到一个执行加密/解密的脚本和一种存储密钥的方法。我读到你可以使用机器钥匙作为钥匙,对吗?

有自动生成和非自动生成的机器密钥。我想我宁愿使用非自动生成的,因为这样可以很容易地将我的 Web 应用程序部署到不同的服务器中。我找到了这个工具,它为你生成了一个:

http://aspnetresources.com/tools/machineKey

什么加密/解密脚本可以使用这个机器密钥?

我还想知道,将非自动生成的机器密钥存储在 web.config 文件中有多安全?如果有人可以看到 web.config 文件,为什么在 appSettings 中使用 machinekey 而不是“普通”键?

4

1 回答 1

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);
}

关于你的第二个问题,生成的机器密钥是一个人类可读的十六进制字符串,但你无法弄清楚。

我希望这会有所帮助。

于 2011-12-09T12:32:21.237 回答