11

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

4

2 回答 2

10

根据https://github.com/wg/scrypt的输出格式是$s0$params$salt$key

  • s0表示格式的版本 0,具有 128 位盐和 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 characters

于 2014-06-01T23:31:17.337 回答
2

在 Colin Percival 自己的实现中,tarsnap scrypt 标头为 96 字节。这包括:

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

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

作为 base64 编码的字符串,这包含 128 个字符。

于 2016-11-12T00:57:19.253 回答