虽然我不是密码学家,但我认为自己大多数都是关于[a]对称加密,哈希和加密随机数生成的最佳实践。我搜索并发现了许多帖子,这些帖子都在SO和其他地方,与加密数据,盐和IV的持久性有关。我要求的是查看我正在做的事情,以确保我正在组装的部件正确地放在一起,即安全地放在一起。这是我的计划:
在C#中,我使用RSACryptoServiceProvider生成一个很好的,大的,4096位的密钥对。为了持久化到磁盘/数据库,我正在使用包含私钥信息的ToXmlString(true)方法。然后,我使用AES加密整个Xml文档,如下所述:http://msdn.microsoft.com/en-us/library/sb7w85t6(v=VS.90).aspx,使用从Rfc2898DeriveBytes派生的密钥,使用10,000轮和从RNGCryptoServiceProvider生成的64位salt。但现在的问题是,储存盐,以及静脉注射。我知道盐可以公开,我很确定IV也可以。因此,最简单的做事方式似乎是将它们推入纯文本Xml文档,以及加密的Xml,并完成它。
我什么都想念?
编辑0:是的,IV不需要保密:http://www.w3.org/TR/xmlenc-core/#sec-Nonce。
Edit1:盐现在是从密码生成的(填充后仍然使用10k轮到最小64位),因此它不会单独保存。 IV自动以CipherValue为前缀。
答案 0 :(得分:0)
IV和盐应该是安全的随机数,可以公开存储。迭代计数也可以公开存储,尽管它通常是硬编码的。请注意保持迭代计数的上限,否则您可能容易受到拒绝服务攻击。
所以基本上你做得很好。如果加密XML,我将遵循XML加密规范,使用(建议的)GCM模式加密(如果可用)。确保在解密时检查所有参数。