2011-05-27 52 views
2

虽然我不是密码学家,但我确实认为自己大多掌握了关于[a]对称加密,散列和加密随机数生成的最佳实践。我在SO和其他地方搜索并发现了许多帖子,涉及加密数据,salt和IV的持久性。我所要求的是看看我正在做什么,以确保我放在一起的作品被正确地放在一起,即安全地放在一起。这是我的计划:我的C#RSA/AES/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位salt。但现在的问题是,储存盐以及IV。我知道盐可以是公开的,我相当肯定IV也可以。所以,最简单的做事方式似乎是将它们与加密的Xml一起推送到纯文本Xml文档中,并用它完成。

什么都没有我失踪?

编辑0:是的,IV不需要保密:http://www.w3.org/TR/xmlenc-core/#sec-Nonce

编辑1:盐现在从密码生成(仍然使用填充后的10k轮到最少64位),因此它不会单独保存。 IV将自动添加到CipherValue的前缀中。

+0

为了更好地了解您的方法,我的问题是,您打算如何坚持密码? – 2011-05-28 16:48:21

+0

通常会手动输入Aes加密的密码。不幸的是,我们还必须将其包含在web.config中。 – joe 2011-05-30 20:44:36

+0

我很好奇你为什么在一个单独的存储库中持久化密码?这只是加密的另一个设置,你可能是创建失败点和失败点。 – 2011-05-31 07:23:08

回答

0

IV和盐应该是安全的随机数并可以公开存储。迭代计数也可以公开存储,虽然它通常是硬编码的。请小心保持迭代计数的上限,否则可能容易受到拒绝服务攻击。

所以基本上你做得很好。如果加密XML,我会遵守XML加密规范,如果可用,使用(建议的)GCM模式加密。请确保在解密时检查的所有参数