如何将RijndaelManaged生成的KEY和IV存储在数据库中以备将来使用



让我先说。。。。是的,过去两天我在这里读了很多帖子。不,我对加密一无所知,所以不用麻烦。。。你们不应该玩火语。。

我有一个asp.net MVC3应用程序,希望使用每个用户的密钥加密用户上传的照片。我想保存这个密钥,并将其用于同一用户的任何进一步上传和解密。(尽管,我想我可以为每张照片存储一个密钥,这与这个问题无关,但…)

我从这里开始编写代码:http://www.codeproject.com/Articles/33344/Photo-Video-Viewer-with-Encryption-Capability

它运行良好。它对照片进行加密并解密到一个新文件中,一切都很好。"动态版本"也可以工作,并返回一个MemoryStream,我可以将其用于我的WebImage。然而,正如你所看到的,这个例子是一次加密和解密,密钥是一个全局变量(我不知道它是什么,我只是在测试时使用了自动生成的密钥。

因此,我需要有人告诉我如何在数据库中为每个用户存储生成的密钥(我想是IV??告诉过你我对enc一无所知…),然后将这些值提取出来用于即时解密。我还不打算麻烦发布我所有的代码,因为它几乎与上面网站上的代码完全相同。

我在这里读到了另一篇帖子,它说要使用:

string x = Convert.ToBase64String(RMCrypto.Key);

然后当我想解密时,我使用了:

RMCrypto.Key = Convert.FromBase64String(x);

我以这种方式将密钥和IV都存储在我的SQL数据库中,但当我提取值并尝试解密时,我会得到一个错误,即数据不是预期的长度。

也许我完全偏离了底线,也许是三行代码。。。如果需要更多信息,请告诉我。

谢谢!

您可以将它们存储为二进制列值。也就是说,对加密数据的保护只有与保护它的密钥一样安全。换句话说,将密钥与你保护的数据一起存储就像狐狸在看守鸡舍一样。但是,如果你不担心PCI合规性,那么这可能不是一笔太糟糕的交易。

如何将其转换为二进制

private void UpdateDb(byte[] key, byte[] iv)
{
    using (SqlConnection db = new SqlConnection(connectionString))
    using (SqlCommand cmd = new SqlCommand("insert into (key, iv) values (@key, @iv)", db))
    {
        db.Open();
        cmd.Parameters.AddWithValue("@key", key);
        cmd.Parameters.AddWithValue("@iv", iv);
        cmd.ExecuteNonQuery();
    }
}

更困难的是,你可以为你保护的每个记录(图像)生成一个新的密钥和IV,然后将其存储起来,这样,如果我们要获得一个密钥,他们就不会完全打开你的所有数据。祝你好运

您应该将实际的字节数组(yes;key和IV)存储在数据库中
你根本不需要字符串。

相关内容