我使用Python中的标准hashlib和hmac模块实现了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)
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我应该终于发布一下我以前根据这个问题所做的事情!
在我的Github存储库中,我编制了以下测试向量:
测试始于RFC6070和@ChristianAichinger上面关于PBKDF2-HMAC-SHA-256的回答,然后添加了几十个其他测试用例,实现了更严格的测试,例如密码和盐(15/16/17字节、63/64/65字节、127/128/129字节、1025字节等)的某些大小周围的边界条件,大迭代计数、大输出大小计数等等。
然后我收集了许多PBKDF2的实例,并验证了这些测试向量对我能够找到的每一个主要实现进行了验证(所有这些都包含在上述存储库中,有时包括Windows MinGW可执行文件,并一般包括Linux编译说明),包括:
考虑到我使用了5种不同的语言使用7个实现和多个主要的加密库,看到它们都提供了相同的结果,我非常有信心认为所提供的测试向量准确无误,而且所提供的实现可以用作一组来验证任何其他所需的测试向量集。如果它们都达成一致,那么就是正确的。
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 块的大小),因此它确实测试了中间哈希块的串联是否有效。