我想在数据库中存储一个scrypt哈希密码。我可以预期的最大长度是多少?
问问题
3827 次
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编码字符串的长度是指
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 回答