Asp.net mvc 3 如何将RijndaelManaged生成的密钥和IV存储在数据库中以供以后使用?

Asp.net mvc 3 如何将RijndaelManaged生成的密钥和IV存储在数据库中以供以后使用?,asp.net-mvc-3,encryption,rijndaelmanaged,Asp.net Mvc 3,Encryption,Rijndaelmanaged,让我先说……是的,在过去的两天里,我在这里读了很多帖子。不,我对加密一无所知,所以不用麻烦了…你们不应该玩火评论 我有一个asp.net MVC3应用程序,希望为每个用户使用密钥加密用户上传的照片。我想保存这个密钥,并将其用于同一用户的任何进一步上传和解密。(虽然,我想我可以为每张照片存储一个密钥,但与此问题无关,但…) 我从这里开始编写代码: 它很好用。它对照片进行加密并将其解密为一个新文件,一切正常。“即时版本”也可以工作并返回一个MemoryStream,我可以将其用于我的WebImag

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

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

我从这里开始编写代码:

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

因此,我需要有人告诉我如何在数据库中为每个用户存储生成的密钥(我猜是IV???告诉过你我对enc一无所知),然后将这些值拉回来用于即时解密。我现在还不想费心发布我的所有代码,因为它几乎与上述网站上的内容相同

我在这里读了另一篇文章,上面说:

string x = Convert.ToBase64String(RMCrypto.Key);
然后,当我想要解密时,我使用:

RMCrypto.Key = Convert.FromBase64String(x);
我以这种方式在我的SQL DB中存储了密钥和IV,但是当我提取值并尝试解密时,我得到一个错误,即数据不是预期的长度

也许我完全偏离了基准,或者可能是三行代码……如果需要更多信息,请告诉我


谢谢!

您应该在数据库中存储实际的字节数组(是的;包括key和IV)。

您根本不需要字符串。

您可以将它们存储为二进制列值。也就是说,加密数据的保护只与密钥保护数据一样安全。换句话说,将密钥与您保护的数据一起存储就像狐狸保护鸡舍一样。但是,如果您不担心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(图)保护您的数据,然后将其存储起来,这样,如果有人想获得一个密钥,至少他们不会完全打开您的所有数据。祝您好运!

我确实使用Convert.ToBase64String将生成的值存储在数据库的二进制列中。但是,当我将它们拉回来用于解密方法时,无法使用它们。这就是我需要帮助的地方。如果您能告诉我如何从上面的链接(codeproject链接)将其添加到加密和解密方法中我会很高兴地寄给你100美元。谢谢。KAlso,只需注意datatbase和文件在不同的服务器上,因此我认为在数据库中存储密钥不会有任何错误。因为每个用户的文件都有不同的密钥,即使有人破坏了一个,他们也只能访问该文件,而不能访问其他文件,所以他们会很高兴我必须从头开始。在某些情况下,他们从一台服务器获取所有文件,并在另一台服务器上入侵SQL,他们必须将文件与密钥匹配。是否完美?不…对我来说足够安全…是的。你可以将其转换回字节[]使用System.Security.Cryptography.RijndaelManaged mng=new System.Security.Cryptography.RijndaelManaged();mng.Key=System.Convert.FromBase64String(stringInBase64);我当然不想要付款:)只需投票和标记作为答案,那就足够了,谢谢!所以…你的答案是我已经知道的,但它让我想…如果这是你应该做的,也许是别的。这是一个AWF***时刻。因为我只是在测试,所以我没有自动将文件名更改为数据库中的加密名称,而是手动更改,更改了错误的该死的记录。它试图解密一个未加密的文件。嘟嘟嘟嘟!但是谢谢你的回复。你不喜欢这样的日子吗?:)如果你能告诉我如何从上面的链接(codeproject链接)将其添加到加密和解密方法中,我将很高兴地向你发送$100。大家一致认为这是一个。请尊重本网站的价值观。@GregS-理解。压力过大(