【问题标题】:How to store a RijndaelManaged generated KEY and IV in the database for later use?如何将 RijndaelManaged 生成的 KEY 和 IV 存储在数据库中以备后用?
【发布时间】:2012-07-20 10:41:38
【问题描述】:

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

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

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

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

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

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

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

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

RMCrypto.Key = Convert.FromBase64String(x);

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

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

谢谢!

【问题讨论】:

  • 共识似乎是这是一个bad idea。请尊重本网站的价值观。
  • @GregS - 明白了。压力过大。 :(

标签: asp.net-mvc-3 encryption rijndaelmanaged


【解决方案1】:

您可以将它们存储为二进制列值。话虽如此,加密数据的保护与保护它的密钥一样安全。换句话说,将密钥与您保护的数据一起存储有点像狐狸守卫鸡舍之类的事情。但是,如果您不担心 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 美元寄给你。谢谢你。 K
  • 另外,请注意数据库和文件位于不同的服务器上,因此我认为将密钥存储在数据库中没有任何问题。而且由于我将为每个用户文件拥有不同的密钥,因此即使有人破坏了一个文件,他们也只能访问该文件而不能访问其他文件,因此他们必须从头开始。在某些奇怪的情况下,他们从一台服务器获取所有文件并在另一台服务器上破解 SQL,他们必须将文件与密钥匹配。完美吗?不...对我来说足够安全吗...是的。
  • 您可以使用 System.Security.Cryptography.RijndaelManaged mng = new System.Security.Cryptography.RijndaelManaged() 将其转换回 byte[]; mng.Key = System.Convert.FromBase64String(stringInBase64);我当然不想付款 :) 只需投票并标记为答案,这将非常感谢!
  • 所以.....你的答案是我已经得到的但它让我觉得......好吧,如果这是你应该做的,也许它是别的东西。这是那些 AWWWW F*** 时刻之一。由于我只是在测试,我并没有自动将文件名更改为数据库中的加密名称,而是手动更改它,并且更改了错误的该死记录。它试图解密一个未加密的文件。呜呜呜!但感谢您的回复。你不喜欢这样的日子吗? :)
【解决方案2】:

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

【讨论】:

  • 如果您能告诉我如何从上面的链接(codeproject 链接)中将其添加到加密和解密方法中,我很乐意将 100 美元寄给您。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多