什么是scrypt输出的最大长度?

时间:2014-06-01 23:31:17

标签: scrypt

我想在数据库中存储scrypt - 哈希密码。我可以期待的最大长度是多少?

2 个答案:

答案 0 :(得分:9)

根据https://github.com/wg/scrypt,输出格式为$s0$params$salt$key,其中:

  • s0表示格式的版本0,具有128位salt和256位派生密钥。
  • params是一个32位十六进制整数,包含log2(N)(16位),r(8位)和p(8位)。
  • salt是base64编码的盐。
  • key是base64编码的派生密钥。

根据https://stackoverflow.com/a/13378842/14731,base64编码字符串的长度为4*ceil(n/3),其中n表示正在编码的字节数。

让我们打破这个:

  • 美元符号组成4个字符。
  • 版本号由2个字符组成。
  • 每个十六进制字符代表4位( log2(16) = 4 ),因此params字段组成(32位/ 4位)= 8个字符。
  • 128位盐相当于16个字节。 base64编码格式构成(4 * ceil(16 / 3)) = 24个字符。
  • 256位派生密钥相当于32个字节。 base64编码格式构成(4 * ceil(32 / 3)) = 44个字符。

综上所述,我们得到:4 + 2 + 8 + 24 + 44 = 82个字符

答案 1 :(得分:2)

在Colin Percival自己的implementation中,tarsnap scrypt标头是96个字节。这包括:

  • 6字节'scrypt'
  • 10字节N,r,p参数
  • 32字节盐
  • 16字节SHA256校验和字节0-47
  • 字节0-63的32字节HMAC哈希(使用scrypt哈希作为密钥)

这也是node-scrypt使用的格式。有关stackexchange的校验和和HMAC哈希背后的基本原理的解释。

作为base64编码的字符串,这会产生128个字符。