【问题标题】:Is Deriving a 128 bits AES Key with PBKDF2 using SHA-256 possible是否可以使用 SHA-256 使用 PBKDF2 导出 128 位 AES 密钥
【发布时间】:2019-07-09 15:29:31
【问题描述】:

我正在开发一个加密协议,我必须在 CTR 模式下创建一个 AES 密钥。我决定将密钥长度保持在 128 位,因为较短的密钥长度意味着移动设备的计算能力较低。

现在,要创建此密钥,我使用 PBKDF2,它允许我设置其某些参数,例如散列函数和迭代次数,因为它使用初始信息(例如密码)派生密钥,这就是我所拥有的。由于 SHA-1 损坏,我想将 SHA-256 用于密钥派生函数的密钥散列,但我不明白这是否可能。由于我希望密钥为 128 位,而 SHA-256 生成 256 位,PBKDF2 是否能够做到这一点?

【问题讨论】:

    标签: encryption aes password-encryption pbkdf2 webcrypto-api


    【解决方案1】:

    AES-256 并不比 AES-128 慢多少,keysetup 稍慢,每个块只需要多 4 轮(11 到 15)。所以它最多会慢 40%,而现代手机具有专用的 AES 指令集可能更慢。

    PBKDF2 可以输出几乎任何大小的密钥,并且主要使用 HMAC-SHA1 或 HMAC-SHA256(不是直接的 SHA1 或 SHA256,但大多数 API 只接受哈希函数作为参数并隐式执行 HMAC)作为构建块“随机函数”。但是任何一个都可以生成 256、128 或 10000 字节的密钥(并不是说您需要那么大的密钥)。使用 HMAC-SHA256,导出 256 位或 128 位密钥同样便宜或昂贵(后者是前者的截断版本,但这没问题);这是同样的工作。使用 HMAC-SHA1(与 PBKDF2 的 HMAC-SHA256 一样安全)获得 256 位密钥的工作量更大,因为 256 比摘要大小更多。

    所以使用 AES-256 和 PBKDF2-(HMAC)-SHA256,应该没有性能问题。

    【讨论】:

      【解决方案2】:

      首先,AES-256 与 AES-128 相比并没有那么慢。见Cryptography

      CPU 开销(192 位密钥 +20%,256 位密钥 +40%:

      PBKDF2 的输出大小等于使用的 PRF 函数,在您的情况下,它是一个哈希函数,如 SHA-256。因此输出将是 256 位大小。

      PBKDF2 的函数需要一个dkLen 参数 - 所需的密钥长度。

      PBKDF2(PRF、密码、Salt、c、dkLen)

      当您将 128 放入此参数时,您将获得 128 位。输出是完整的 256 位输出的子字符串。您将获得第一个 128 位。

      你可以从实现中看到它here

      【讨论】:

      • 非常感谢您的回答,所以如果这 256 位被修剪并取了前 128 位,这是否意味着密钥不太安全?
      • 简短的回答是否定的。哈希函数的设计实现了这一点。可以看到有 SHA-224 有不同的初始参数,但结果被截断为 224 位。
      猜你喜欢
      • 2010-11-24
      • 2011-09-26
      • 2011-05-23
      • 2017-02-13
      • 2015-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多