Cryptography PBKDF2-HMAC-SHA2测试向量
中有PBKDF2-HMAC-SHA1的测试向量。中有HMAC-SHA2的测试向量 但到目前为止,我还没有找到PBKDF2-HMAC-SHA2的测试向量Cryptography PBKDF2-HMAC-SHA2测试向量,cryptography,hmac,sha2,pbkdf2,Cryptography,Hmac,Sha2,Pbkdf2,中有PBKDF2-HMAC-SHA1的测试向量。中有HMAC-SHA2的测试向量 但到目前为止,我还没有找到PBKDF2-HMAC-SHA2的测试向量 我对SHA256最感兴趣,所以我将发布一些用我的实现计算的向量。如果有人能够验证/确认它们,或者贡献自己的,我会很高兴。PBKDF2-HMAC-SHA256的测试向量: 输入值取自RFC6070;c是轮数 Input: P = "password" (8 octets) S = "salt" (4 octets) c = 1 dkLen
我对SHA256最感兴趣,所以我将发布一些用我的实现计算的向量。如果有人能够验证/确认它们,或者贡献自己的,我会很高兴。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
我使用Python中的标准和模块,并根据RFC6070向量和–它匹配的检查输出
以下是我使用更大的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-SHA-512
- PBKDF2-HMAC-SHA-384
- PBKDF2-HMAC-SHA-256
- PBKDF2-HMAC-SHA-224
- PBKDF2-HMAC-SHA-1 对于疯狂的人或那些没有SHA-1支持的古代系统的人:
- PBKDF2-HMAC-MD5
- Python(hashlib)
- Python(华纳的自定义代码)
- C(OpenSSL)
- C(PolarSSL)
- C++(Cryptopp)
- .NET 4.5(@Jither's DeriveBytes)
- SQL Server(目前仅限自定义代码PBKDF2-HMAC-SHA-1和PBKDF2-HMAC-SHA-512)
dkLen
超过了32
(SHA-256块的大小),因此它确实测试了中间散列块的串联是否有效
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
您可以考虑编写RFC,它描述了如何在RFC 2898中使用PBKDF2-HMAC-SAH256,并且还包括测试向量。对于所有的SHA2散列,您都应该这样做。我认为
dkLen=20
反映了摘要大小,因此对于SHA-256,您应该使用32dkLen=25
应该大于摘要大小,以便它覆盖处理多个T
块的代码路径;可能是40。@aaz:No.dkLen
是最合适的。摘要大小在算法中由hlen
指定,它不是PBKDF2函数的直接输入…@ircmaxell–Yes。我的意思是选择测试用例的dkLen
来匹配所使用的PRF的hLen
。因此,当为不同的PRF调整测试用例时,应该调整dkLen
。dkLen<32是一个有效的测试,但是dkLen>=32会有很大帮助,因为如果它小于32,它将只裁剪额外的八位字节。它们至少应该是一个>32的测试。另一方面,我在复制上述测试值时没有问题。我能够使用。在JavaScript中正确地复制所有结果,并改变输出大小,可能有必要扩展测试用例5中的输入大小,以便与RFC测试向量具有相同的效果-24个八位字节的PasswordPassword超过了SHA1输出的输出大小,但不超过SHA256输出的大小。这可能会遗漏RFC测试向量遵循的一些代码路径——尽管可能不会;我怀疑密码必须超过64字节块大小才能在任何情况下产生差异。警告:PBKDF2的“默认”字符编码为UTF-8。您可能还需要测试特殊字符。Java会失败,因为它只符合Windows-1252(ASCII+128个特殊字符)。@MaartenBodewes Java对字符串和字符使用“Unicode”(实际上是UTF-16),并支持对I/O字节进行数百种编码和类似的加密。默认编码不同;对于Windows,它(通常?)是cp1252,但其他平台则不同。对于完全正确的可重复数据是至关重要的,所以你应该使用一个明确的编码,而不是默认的,通常是UTF-8来支持最广泛的数据,特别是在这里2898建议(但不需要)UTF-8有人认为把它放入RFC,然而,我认为如果你以比ODS电子表格更容易访问的格式分发测试向量,人们会发现你的测试向量更有用——我认为JSON格式将是理想的。