【问题标题】:Is my C# RSA/AES/salt/IV best practices approach missing anything?我的 C# RSA/AES/salt/IV 最佳实践方法是否遗漏了什么?
【发布时间】: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 可以访问。
  • 不应该从密码生成盐,它破坏了盐的全部目的(可能除了防止现有彩虹表)

标签: rsa aes salt rijndael


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-18
    • 2023-02-03
    • 1970-01-01
    • 2013-05-07
    • 2021-02-24
    • 2022-01-01
    • 1970-01-01
    • 2010-09-22
    相关资源
    最近更新 更多