我的C#RSA / AES /盐/ IV最佳做法是否缺少任何内容?

问题描述

| 虽然我不是密码学家,但我确实认为自己是有关[a]对称加密,散列和加密随机生成的最佳实践的最新作者。我已经搜索并找到了许多帖子,无论是在SO还是其他地方,都与加密数据,salt和IV的持久性有关。我要的是对我正在做的事情进行回顾,以确保将我放在一起的东西正确,即安全地放在一起。这是我的计划: 在C#中,我使用RSACryptoServiceProvider生成一个漂亮的,大型的4096位密钥对。为了持久保存到磁盘/数据库,我使用了包含私钥信息的ToXmlString(true)方法。然后,我按照此处所述,使用AES加密整个Xml文档:http://msdn.microsoft.com/zh-cn/library/sb7w85t6(v=VS.90).aspx,使用从Rfc2898DeriveBytes派生的密钥(使用10,000回合)和从RNGCryptoServiceProvider生成的64位盐。但是现在的问题是,储存盐和IV。我知道食盐可以公开使用,而且我很确定IV也可以。因此,最简单的处理方法似乎是将它们与加密的Xml一起推入纯文本Xml文档中,并用它来完成。 我所缺少的一切吗? Edit0:是,IV不必保密:http://www.w3.org/TR/xmlenc-core/#sec-Nonce。 Edit1:盐现在是由密码产生的(填充后至少使用64位,至少使用10k回合),因此不会单独保留它。 IV自动添加到CipherValue的前缀。     

解决方法

        IV和盐应为安全的随机数,并可以公开存储。迭代计数也可以公开存储,尽管通常是硬编码的。请注意,您应保持迭代次数的上限,否则可能会遭到拒绝服务攻击。 所以基本上您做得很好。如果对XML进行加密,那么我会遵守XML加密规范,并使用(建议的)GCM模式加密(如果可用)。但是,请确保在解密时检查所有参数。