【发布时间】:2011-09-03 15:38:07
【问题描述】:
虽然我不是密码学家,但我确实认为自己在 [a] 对称加密、散列和加密随机数生成方面的最佳实践大多是最新的。我已经搜索并发现了许多关于 SO 和其他地方的帖子,这些帖子都与加密数据、salt 和 IV 的持久性有关。我所要求的是查看我正在做的事情,以确保我正在拼凑的部分正确地拼凑在一起,即安全地拼凑在一起。这是我的计划:
在 C# 中,我使用 RSACryptoServiceProvider 生成一个漂亮的、大的 4096 位密钥对。为了持久保存到磁盘/数据库,我使用了包含私钥信息的 ToXmlString(true) 方法。然后我使用 AES 加密整个 Xml 文档,如下所述:http://msdn.microsoft.com/en-us/library/sb7w85t6(v=VS.90).aspx,使用从 Rfc2898DeriveBytes 派生的密钥,使用从 RNGCryptoServiceProvider 生成的 10,000 轮和 64 位盐。但现在的问题是,储存盐以及静脉输液。我知道盐可以是公开的,我很确定 IV 也可以。因此,最简单的处理方法似乎是将它们与加密的 Xml 一起放入纯文本 Xml 文档中并完成。
我还缺少什么吗?
Edit0:是的,IV 不需要保密:http://www.w3.org/TR/xmlenc-core/#sec-Nonce。
Edit1:盐现在是从密码产生的(在填充到至少 64 位后仍然使用 10k 轮),因此它不会单独保存。 IV 会自动添加到 CipherValue 的前缀。
【问题讨论】:
-
为了更好地了解您的方法,我的问题是,您打算如何保留密码?
-
Aes 加密的密码通常是手动输入的。不幸的是,我们也必须将它包含在 web.config 中。
-
我很好奇您为什么将密码保存在单独的存储库中?这只是加密的另一种设置,您可能正在创建另一个故障点。
-
只是一个想法:所以在客户端,您只需保留加密数据,然后您就有一个存储过程或 Web 服务将为您解密这些数据,使用的加密参数将是存储在其他地方,只有 SP/WS 可以访问。
-
不应该从密码生成盐,它破坏了盐的全部目的(可能除了防止现有彩虹表)