1

让我首先说....是的,过去两天我在这里阅读了大量帖子。不,我对加密一无所知,所以不要打扰......你不应该玩火评论......

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

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

它工作正常。它加密照片并将它们解密为一个新文件,一切都很好。“on the fly 版本”也可以工作并返回一个 MemoryStream,我可以将它用于我的 WebImage。但是,正如您所看到的,该示例是一次加密和解密,并且密钥是一个全局变量(我不知道它是什么,我只是在测试时使用了自动生成的密钥。

所以,我需要有人告诉我如何为每个用户在数据库中存储生成的密钥(我猜是 IV?告诉你我对 enc 一无所知......),然后提取那个(那些)值退出以用于动态解密。我不会费心发布我所有的代码,因为它几乎与上述网站上的相同。

我在这里阅读了另一篇文章,它说要使用:

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

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

RMCrypto.Key = Convert.FromBase64String(x);

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

也许我完全不在基地,或者可能是三行代码......如果需要更多信息,请告诉我。

谢谢!

4

2 回答 2

0

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

于 2012-07-19T21:55:53.083 回答
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,然后将其存储起来,这样如果有人我们至少要获得一个密钥,他们就不会公开您的所有数据。祝你好运!

于 2012-07-20T02:36:36.880 回答