Cryptography 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

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

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

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

作为(scrypt规范)的一部分,有针对PBKDF2的HMAC-SHA-256测试向量(因为scrypt在内部使用PBKDF2)

有趣的是,
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,您应该使用32
dkLen=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格式将是理想的。