PBKDF2-HMAC-SHA2测试载体

Chr*_*ger 21 cryptography sha2 hmac pbkdf2

RFC6070中有针对PBKDF2-HMAC-SHA1的测试向量.RFC4231中有HMAC-SHA2的测试向量.

但到目前为止,我还没有在任何地方找到PBKDF2-HMAC-SHA2的测试向量.

我对SHA256最感兴趣,所以我会发布一些我用我的实现计算的向量.如果有人可以验证/确认,或者自己贡献,我会很高兴.

aaz*_*aaz 17

我使用Python中的标准hashlibhmac模块实现了PBKDF2,并根据RFC 6070向量和您发布向量检查输出- 它匹配.

下面是我用更大的矢量dkLen来匹配更大的摘要输出大小.这是输出pbkdf2-test-vectors.py sha256,大约需要10分钟才能运行.

PBKDF2 HMAC-SHA256 Test Vectors

Input:
  P = "password" (8 octets)
  S = "salt" (4 octets)
  c = 1
  dkLen = 32

Output:
  DK = 12 0f b6 cf fc f8 b3 2c
       43 e7 22 52 56 c4 f8 37
       a8 65 48 c9 2c cc 35 48
       08 05 98 7c b7 0b e1 7b (32 octets)


Input:
  P = "password" (8 octets)
  S = "salt" (4 octets)
  c = 2
  dkLen = 32

Output:
  DK = ae 4d 0c 95 af 6b 46 d3
       2d 0a df f9 28 f0 6d d0
       2a 30 3f 8e f3 c2 51 df
       d6 e2 d8 5a 95 47 4c 43 (32 octets)


Input:
  P = "password" (8 octets)
  S = "salt" (4 octets)
  c = 4096
  dkLen = 32

Output:
  DK = c5 e4 78 d5 92 88 c8 41
       aa 53 0d b6 84 5c 4c 8d
       96 28 93 a0 01 ce 4e 11
       a4 96 38 73 aa 98 13 4a (32 octets)


Input:
  P = "password" (8 octets)
  S = "salt" (4 octets)
  c = 16777216
  dkLen = 32

Output:
  DK = cf 81 c6 6f e8 cf c0 4d
       1f 31 ec b6 5d ab 40 89
       f7 f1 79 e8 9b 3b 0b cb
       17 ad 10 e3 ac 6e ba 46 (32 octets)


Input:
  P = "passwordPASSWORDpassword" (24 octets)
  S = "saltSALTsaltSALTsaltSALTsaltSALTsalt" (36 octets)
  c = 4096
  dkLen = 40

Output:
  DK = 34 8c 89 db cb d3 2b 2f
       32 d8 14 b8 11 6e 84 cf
       2b 17 34 7e bc 18 00 18
       1c 4e 2a 1f b8 dd 53 e1
       c6 35 51 8c 7d ac 47 e9 (40 octets)


Input:
  P = "pass\0word" (9 octets)
  S = "sa\0lt" (5 octets)
  c = 4096
  dkLen = 16

Output:
  DK = 89 b6 9d 05 16 f8 29 89
       3c 69 62 26 65 0a 86 87 (16 octets)
Run Code Online (Sandbox Code Playgroud)

  • 除了改变输出大小外,可能还需要扩展测试用例5中的输入大小以使其具有与RFC测试向量相同的效果 - 在24个八位字节的passwordPASSWORDpassword超过SHA1输出的输出大小,但不超过SHA256输出的大小.这可能会错过RFC测试向量所遵循的一些代码路径 - 尽管可能没有; 我怀疑密码必须超过64字节的块大小才能在两种情况下产生差异. (3认同)
  • 我能够使用[SJCL库](https://github.com/bitwiseshiftleft/sjcl)在JavaScript中正确地重现所有结果. (2认同)
  • **警告**:PBKDF2的"默认"字符编码为UTF-8.您可能还想测试特殊字符.Java会失败,因为它只符合Windows-1252(ASCII + 128特殊字符). (2认同)
  • @MaartenBodewes Java对字符串和字符使用"Unicode"(实际上是UTF-16),并支持数百种来自/来自字节的编码,用于I/O和类似的事情,如加密.*default*编码各不相同; 对于Windows它(通常?)cp1252,但其他平台是不同的.对于加密完全可重现的数据至关重要,因此您应该使用显式编码而不是默认编码,通常使用UTF-8来支持最广泛的数据,尤其是2898推荐(但不要求)UTF-8的情况. (2认同)
  • 有没有人考虑过将其放入 RFC 中? (2认同)

Chr*_*ger 7

PBKDF2-HMAC-SHA256的测试载体:

输入值取自RFC6070; c是轮数.

Input:
 P = "password" (8 octets)
 S = "salt" (4 octets)
 c = 1
 dkLen = 20
Output:
 DK = 12 0f b6 cf fc f8 b3 2c 43 e7 22 52 56 c4 f8 37 a8 65 48 c9


Input:
 P = "password" (8 octets)
 S = "salt" (4 octets)
 c = 2
 dkLen = 20
Output:
 DK = ae 4d 0c 95 af 6b 46 d3 2d 0a df f9 28 f0 6d d0 2a 30 3f 8e


Input:
 P = "password" (8 octets)
 S = "salt" (4 octets)
 c = 4096
 dkLen = 20
Output:
 DK = c5 e4 78 d5 92 88 c8 41 aa 53 0d b6 84 5c 4c 8d 96 28 93 a0


Input:
 P = "password" (8 octets)
 S = "salt" (4 octets)
 c = 16777216
 dkLen = 20
Output:
 DK = cf 81 c6 6f e8 cf c0 4d 1f 31 ec b6 5d ab 40 89 f7 f1 79 e8


Input:
 P = "passwordPASSWORDpassword" (24 octets)
 S = "saltSALTsaltSALTsaltSALTsaltSALTsalt" (36 octets)
 c = 4096
 dkLen = 25
Output:
 DK = 34 8c 89 db cb d3 2b 2f 32 d8 14 b8 11 6e 84 cf
      2b 17 34 7e bc 18 00 18 1c


Input:
 P = "pass\0word" (9 octets)
 S = "sa\0lt" (5 octets)
 c = 4096
 dkLen = 16
Output:
 DK = 89 b6 9d 05 16 f8 29 89 3c 69 62 26 65 0a 86 87
Run Code Online (Sandbox Code Playgroud)

  • @aaz:不.`dkLen`是[*Derived Key Length*](http://tools.ietf.org/html/rfc2898#section-2).摘要大小在算法中由`hlen`指定,它不是直接输入PBKDF2函数的... (4认同)

Ant*_*rds 5

我可能最终应该根据这个问题发布我前一段时间所做的事情!

我的 Github 存储库中,我为

  • PBKDF2-HMAC-SHA-512
  • PBKDF2-HMAC-SHA-384
  • PBKDF2-HMAC-SHA-256
  • PBKDF2-HMAC-SHA-224
  • PBKDF2-HMAC-SHA-1 对于疯狂的或那些甚至没有 SHA-1 支持的古老系统的人:
  • PBKDF2-HMAC-MD5

测试从 RFC6070 开始,以及上面 @ChristianAichinger 对 PBKDF2-HMAC-SHA-256 的回答中的测试,并添加了几十个以实现更严格的测试,例如围绕特定大小的密码和盐的边界条件 (15/16/ 17 字节、63/64/65 字节、127/128/129 字节、1025 字节等)、大迭代计数、大输出大小计数等等。

然后我收集了许多 PBKDF2 实例,并针对我能找到的每个主要实现验证了这些测试向量(所有这些都包含在上述存储库中,有时包括 Windows MinGW 可执行文件,通常包括 Linux 编译指令),包括

  • Python(哈希库)
  • Python(warner 的自定义代码)
  • C (OpenSSL)
  • C (极地SSL)
  • C++ (Cryptopp)
  • .NET 4.5(@Jither 的 DeriveBytes)
  • SQL Server(自定义代码,现在只有 PBKDF2-HMAC-SHA-1 和 PBKDF2-HMAC-SHA-512)

鉴于我在使用多个主要加密库的 5 种不同语言的 7 个实现中看到相同的结果,我非常有信心不仅提供的测试向量是准确的,而且提供的实现可以用作一组来验证任何其他所需的测试向量集。如果他们都同意,那就是正确的。