Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 加密机_.net_Encryption_Cryptography_Machinekey - Fatal编程技术网

.net 加密机

.net 加密机,.net,encryption,cryptography,machinekey,.net,Encryption,Cryptography,Machinekey,我正试图找到一种安全的方法,用C#为我的web应用程序加密数据库中的几个字段 我需要找到一个进行加密/解密的脚本以及存储密钥的方法。我听说你可以用机关枪当钥匙,对吗 有自动生成和非自动生成的机器键。我想我宁愿使用非自动生成的,因为这样可以很容易地将我的web应用部署到不同的服务器上。我发现这个工具可以为您生成一个: 什么加密/解密脚本可以使用此machinekey 我还想知道,在web.config文件中存储非自动生成的机器密钥有多安全?如果有人可以看到web.config文件,那么为什么要在

我正试图找到一种安全的方法,用C#为我的web应用程序加密数据库中的几个字段

我需要找到一个进行加密/解密的脚本以及存储密钥的方法。我听说你可以用机关枪当钥匙,对吗

有自动生成和非自动生成的机器键。我想我宁愿使用非自动生成的,因为这样可以很容易地将我的web应用部署到不同的服务器上。我发现这个工具可以为您生成一个:

什么加密/解密脚本可以使用此machinekey

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


感谢

根据那篇文章,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);
}
以及:

关于你的第二个问题,生成的machinekey是一个十六进制字符串,它是人类可读的,但是你无法理解它


我希望这能有所帮助。

这些和机关枪在哪里匹配?字符串strKey,字符串strIvstrKey是你的机器键。代表初始化向量字符串的strIv是一个简单的字符串,您可以传递任何您想要的值。那么我可以硬编码strIv吗?此外,strKEy应该匹配validationKey或decryptionKey?decryptionKey用于加密和解密数据。此链接可以更好地解释问题:
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);
}