C# AES算法 - 密钥和IV应该存储在哪里?如何存储?

4

我正在使用AES算法对密码进行加密和解密,当PasswordFormat为asp.net成员系统中的Encrypted时。如果格式为Hashed,则会为每个密码生成唯一的盐值,并将其存储在存储密码的表中的一个列中。但是对于加密,我的担忧如下:

1

如果我为每个密码生成独特的IVKey,那么我必须在某个地方维护它们。从安全角度来看,这种方法是否正确?

2

如果我在应用程序配置(web.config)文件中硬编码IVKey,那么当上述任何一对发生更改时,我将不得不担心会发生什么情况?我该如何处理这种情况?

3

请给我你的想法。我会在这里记录它们 :)


2
你为什么要加密密码而不是哈希它? - Ben Robinson
@BenRobinson 你有没有注意到WHEN加粗了吗?这是特别为了回答你的疑问,格式是可配置的,我不能总是做那个人。这取决于客户,我只能给他们最少的建议。还有什么我可以帮助你的吗? - Deeptechtons
假设您选择加密它,那么您肯定有理由,这个理由会影响到正确的答案。例如,如果您只需要密码可解密,但不需要该功能作为应用程序的一部分,则答案将与您需要应用程序能够自动解密该密码作为其功能的情况不同。为什么很重要,因为答案也可能是不要这样做,因为您进行此操作的原因是错误的。 - Ben Robinson
1个回答

3

答案:

  1. 不需要为每个密码设置唯一密钥 - 这样做也没有用,因为您的密钥必须存储在某个地方。您可以将密码存储在安全系统中。

  2. 您不应该将密钥与密码放在同一系统中并具有相同的访问条件。这将使加密存储无效。您应该将密钥放在其他受保护免遭滥用的地方,并在该系统内执行加密。

最好选择像PBKDF2这样的函数并存储其结果。密钥管理是一个棘手的问题,不应该在没有良好想法的情况下选择(如果您采取这种方式,请聘请专业人士)。

最后,IV的整个概念是在使用“相同”的密钥时保护明文。如果每个明文/密文对都有一个密钥,则可以将IV设置为全零。但是,使用单个密钥(存储在某个安全位置)和与密文一起存储的随机IV是更好的选择。

正如所说,如果您以前不知道这一点,那么您的方案是不安全的,因为还有许多其他要考虑的事情,而您可能没有考虑到。

PS Microsoft有一些安全存储密钥的方法,您可能需要在stackoverflow上搜索相关内容。但我不是关于MS API的专家。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接