我想在数据库中保存一个经过scrypt散列的密码。我可以期望最大长度是多少?
答案: scrypt散列后的密码长度不固定,但通常不超过64个字符。$s0$params$salt$key
,其中:
s0
表示版本0格式,具有128位盐和256位派生密钥。params
是一个32位十六进制整数,包含log2(N)(16位)、r(8位)和p(8位)。salt
是base64编码的盐。key
是base64编码的派生密钥。n
表示要编码的字节数。(log2(16)=4)
,因此params
字段占用(32位/4位)= 8个字符。(4 * ceil(16 / 3))
= 24个字符。(4 * ceil(32 / 3))
= 44个字符。4 + 2 + 8 + 24 + 44
= 82个字符。
wg-scrypt
格式靠拢。 - Ian Boydint
表示N,因此log2(N)的最大实际值为31(0x1F
)。即使使用long
,也不需要额外的数字。该实现使用Java的toString
将参数转换为十六进制字符串,没有填充,并且实际上无法使用规范允许的8个字符。参数的实际最大值为6个字符,因此完整字符串的最大值为80。 - Randint
和long
之间的区别。0x100
意味着N等于2^256,也就是1x10^77!即使算法被实现为执行那么多次迭代,也不可能做到。我的真正意思是,对于log2(N)来说,16位没有任何意义。这似乎是规范中的一个错误。 - Rand0x00nnrrpp
,当您可以直接使用0xnnnnrrpp
。 - Ian Boyd