【问题标题】:C# PasswordDeriveBytes ConfusionC# PasswordDeriveBytes 混淆
【发布时间】:2012-03-03 03:45:53
【问题描述】:

我在 C# 中有以下代码

PasswordDeriveBytes DerivedPassword = new PasswordDeriveBytes(Password, SaltValueBytes, HashAlgorithm, PasswordIterations);
byte[] KeyBytes = DerivedPassword.GetBytes(32);

我正在使用“SHA1”哈希算法。

根据 SHA1 定义,它生成 160 位(20 字节)的密钥。我的问题是 GetBytes 方法如何从 DerivedPassword 中获取 32 个字节,GetBytes 方法背后使用了什么算法?

【问题讨论】:

    标签: c# cryptography pbkdf2


    【解决方案1】:

    Microsoft 对原始 PKCS#5(又名 PBKDF1)的实现包括 insecure 扩展,以提供比散列函数所能提供的更多的字节(请参阅错误报告 herehere)。

    即使它没有错误,您也应该避免对标准进行未记录的专有扩展(或者您将来可能永远无法解密您的数据 - 至少不能在 Windows 之外。)

    强烈建议您使用较新的 Rfc2898DeriveBytes,它实现了自 .NET 2.0 起可用的 PBKDF2 (PKCS#5 v2)。

    【讨论】:

      【解决方案2】:

      GetBytes 方法背后使用了什么算法?

      它使用算法 PBKDF1,稍作修改以允许任意密钥长度。替换类 Rfc2898DeriveBytes 使用 PBKDF2。

      您可以阅读Wikipedia Article on PBKDF2,大致了解哪些基本概念使这项工作发挥作用。

      【讨论】:

      • 此方法如何从 20 个字节中派生出 32 个字节(由 'SHA1' 哈希算法生成)。
      • @Siddiqui @`HenrickHellstrom 解释得很好。
      【解决方案3】:

      密钥派生函数使用称为Key Stretching的功能。 (不要费心在 Wikipedia 上查找它,因为当前的文章将这个概念与密钥强化混淆了,这是完全不同的东西。)

      密钥拉伸通常通过在 CTR 模式下应用 PRF(例如哈希函数或密码)或通过迭代它并连接中间输出来完成。

      例如,如果您使用 CTR 过程,SHA-1 作为 PRF,并且想要 32 字节的伪随机输出,则将 SHA1(keymaterial,0) 与 SHA1(keymaterial,1) 的前 12 字节连接。

      【讨论】:

      • 感谢您的重播,您能否给我更多关于 CTR 程序的解释。
      • 在这种情况下,数字 0 和 1 可以用单个位表示(请记住 SHA-1 操作位串作为输入),但通常 (keymaterial,0) 等定义为例如(a) 在末尾附加一个字节(或字)0 的密钥材料,或 (b) 一个完整的 64 字节输入块,首先是密钥材料,一些填充(通常是值为 0 的字节)和一个值为 0 的单个字节结束。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-25
      • 2021-01-26
      • 2011-09-04
      • 2016-03-08
      • 2022-01-13
      相关资源
      最近更新 更多