PBKDF2-HMAC-SHA2 测试向量

23

RFC6070中提供了PBKDF2-HMAC-SHA1的测试向量。在RFC4231中提供了HMAC-SHA2的测试向量。

但至今为止,我还没有找到任何关于PBKDF2-HMAC-SHA2的测试向量。

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


2
你可以考虑编写一个RFC,描述如何在RFC 2898中使用PBKDF2-HMAC-SHA256,并包括测试向量。你应该为所有SHA2哈希函数这样做。 - President James K. Polk
4个回答

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)

2
我能够使用SJCL库在JavaScript中正确地复现您的所有结果。 - Sebastian
3
除了改变输出大小外,在第5个测试用例中需要扩展输入大小,以达到与RFC测试向量相同的效果 - 长度为24字节的passwordPASSWORDpassword 超出了SHA1输出大小,但不超过您的SHA256输出大小。这可能会错过RFC测试向量遵循的某些代码路径 - 尽管可能不会; 我猜想在任何一种情况下,密码都必须超过64字节的块大小才能产生影响。 - James Hart
2
警告:PBKDF2的“默认”字符编码是UTF-8。您可能还想测试特殊字符。Java会失败,因为它只与Windows-1252(ASCII + 128个特殊字符)兼容。 - Maarten Bodewes
2
Java使用“Unicode”(实际上是UTF-16)来处理字符串和字符,并支持数百种编码与字节之间的转换,例如I/O和加密等。默认编码因平台而异;对于Windows,它通常是cp1252,但其他平台则不同。对于加密来说,确保数据可重现非常重要,因此您应该使用显式编码而不是默认编码,通常使用UTF-8以支持最广泛的数据,特别是在这里,2898推荐(但不要求)使用UTF-8。 - dave_thompson_085
2
有没有人考虑将这个放入RFC中? - Martin
显示剩余7条评论

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

我认为 dkLen = 20 反映了摘要大小,因此对于 SHA-256,您应该使用 32。dkLen = 25 应该大于摘要大小,以便它涵盖处理多个 T 块的代码路径;也许是40。 - aaz
4
@aaz:不是的,dkLen派生密钥长度。哈希长度由算法中的 hlen 指定,但它不是直接输入到 PBKDF2 函数中的。 - ircmaxell
@ircmaxell - 是的。我的意思是,测试用例中的“dkLen”被选择为与使用的PRF的“hLen”相匹配。因此,在将测试用例适应于不同的PRF时,应调整“dkLen”。 - aaz
dkLen < 32 是一个有效的测试,但是如果 dkLen >= 32 的话会更好,因为如果它小于 32,它只会裁剪掉额外的八位字节。 - Joe Plante
1
应该至少有一个测试> 32。另一方面,我没有问题复制上述测试值。 - Maarten Bodewes
适用于测试密钥长度大于hLen的情况。输入: P =“password”(8个八位组) S =“salt”(4个八位组) c = 4096 dkLen = 100输出: 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 f7 ad 98 c1 b4 58 ce 3f d7 4c a3 5b eb a3 cd a7 b8 d1 03 8d 6a 87 07 1b 91 8f 83 74 05 f3 fe 77 28 ff e7 f0 97 6f c3 5d d8 2f c0 e5 e4 6c e9 ce 26 a7 88 b2 c7 d1 83 fa 5b f8 d9 60 7e ec d7 1d 01 b4 f1 19 - user1763487

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(hashlib)
  • Python(warner的自定义代码)
  • C(OpenSSL)
  • C(PolarSSL)
  • C++(Cryptopp)
  • .NET 4.5(@Jither的DeriveBytes)
  • SQL Server(自定义代码,目前仅支持PBKDF2-HMAC-SHA-1和PBKDF2-HMAC-SHA-512)

考虑到我使用了5种不同的语言使用7个实现和多个主要的加密库,看到它们都提供了相同的结果,我非常有信心认为所提供的测试向量准确无误,而且所提供的实现可以用作一组来验证任何其他所需的测试向量集。如果它们都达成一致,那么就是正确的。


1
我认为如果您将测试向量分发到比ODS电子表格更易访问的格式中,人们会发现它们更有用 - 我认为JSON格式是理想的。 - Simon Kissane
测试向量可以在https://github.com/Anti-weakpasswords/PBKDF2-GCC-OpenSSL-library的pbkdf2_test.sh中找到,或者在任何相关的PBKDF2实现存储库中找到。 ODS电子表格明确用于“生成”测试向量;请随意编写= CONCATENATE语句以获取JSON或其他输出。 - Anti-weakpasswords

2
作为RFC-7914scrypt规范)的一部分,提供了PBKDF2 with HMAC-SHA-256的测试向量(因为scrypt在内部使用PBKDF2)。
以下是这些测试向量:

   PBKDF2-HMAC-SHA-256 (P="passwd", S="salt",
                       c=1, dkLen=64) =
   55 ac 04 6e 56 e3 08 9f ec 16 91 c2 25 44 b6 05
   f9 41 85 21 6d de 04 65 e6 8b 9d 57 c2 0d ac bc
   49 ca 9c cc f1 79 b6 45 99 16 64 b3 9d 77 ef 31
   7c 71 b8 45 b1 e3 0b d5 09 11 20 41 d3 a1 97 83

   PBKDF2-HMAC-SHA-256 (P="Password", S="NaCl",
                        c=80000, dkLen=64) =
   4d dc d8 f6 0b 98 be 21 83 0c ee 5e f2 27 01 f9
   64 1a 44 18 d0 4c 04 14 ae ff 08 87 6b 34 ab 56
   a1 d4 25 a1 22 58 33 54 9a db 84 1b 51 c9 b3 17
   6a 27 2b de bb a1 d0 78 47 8f 62 b3 97 f3 3c 8d


有趣的是,dkLen 超过了 32(即 SHA-256 块的大小),因此它确实测试了中间哈希块的串联是否有效。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接