首先让我说....是的,我在过去两天里已经阅读了很多帖子。不,我对加密一无所知,所以不要打扰......你不应该玩火评论。
我有一个asp.net MVC3应用程序,并希望使用每个用户的密钥加密用户上传的照片。我想保存此密钥,并将其用于同一用户的任何进一步上传和解密。 (虽然,我想我可以为每张照片存储一个关键字,与此问题无关,但......)
我从这里开始使用代码: http://www.codeproject.com/Articles/33344/Photo-Video-Viewer-with-Encryption-Capability
工作正常。它加密照片并将它们解密为新文件,一切都很顺利。 “on the fly version”也可以工作并返回一个可以用于我的WebImage的MemoryStream。但是,你可以看到这个例子是一次加密和解密,而密钥是一个全局变量(我不知道它是什么,我在测试时只使用了自动生成的密钥。
所以,我需要有人告诉我如何在每个用户的数据库中存储生成的密钥(以及我想知道???告诉你我对enc ...一无所知)然后拉出那些(那些)值(s)退出用于即时解密。我不打算发布我的所有代码,因为它几乎与上面的网站上的相同。
我在这里读了另一篇文章并且说要使用:
string x = Convert.ToBase64String(RMCrypto.Key);
然后,当我想解密时,我使用了:
RMCrypto.Key = Convert.FromBase64String(x);
我以这种方式将密钥和IV存储在我的SQL DB中,但是当我拉取值并尝试解密时,我得到的错误是数据不是预期的长度。
也许我完全偏离基地或者可能是三行代码......如果需要更多信息,请告诉我。
谢谢!
答案 0 :(得分:0)
您应该在数据库中存储实际的字节数组(是;键和IV) 你完全不需要字符串。
答案 1 :(得分:0)
您可以将它们存储为二进制列值。可以说,加密数据的保护只能像保护加密数据一样安全。换句话说,存储密钥与您保护的数据是一种守护着鸡舍的东西。但是,如果您不担心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,保护然后存储它,这样如果有人,我们至少得到一个密钥就不会有你的所有数据张大。祝你好运!