什么';s是scrypt输出的最大长度?
我想在数据库中存储散列密码。我能期望的最大长度是多少?根据输出格式是什么';s是scrypt输出的最大长度?,scrypt,Scrypt,我想在数据库中存储散列密码。我能期望的最大长度是多少?根据输出格式是$s0$params$salt$key,其中: s0表示格式的版本0,包含128位salt和256位派生密钥 params是一个32位十六进制整数,包含log2(N)(16位)、r(8位)和p(8位) salt是base64编码的salt key是base64编码的派生密钥 根据base64编码字符串的长度,其中n表示编码的字节数 让我们来分析一下: 美元符号由4个字符组成 版本号由2个字符组成 每个十六进制字符表示4位(
$s0$params$salt$key
,其中:
表示格式的版本0,包含128位salt和256位派生密钥s0
是一个32位十六进制整数,包含log2(N)(16位)、r(8位)和p(8位)params
是base64编码的saltsalt
是base64编码的派生密钥key
n
表示编码的字节数
让我们来分析一下:
- 美元符号由4个字符组成
- 版本号由2个字符组成
- 每个十六进制字符表示4位
,因此(log2(16)=4)
字段由(32位/4位)=8个字符组成params
- 128位salt相当于16个字节。base64编码格式包含
=24个字符(4*ceil(16/3))
- 256位派生密钥相当于32字节。base64编码格式构成
=44个字符(4*ceil(32/3))
4+2+8+24+44
=82个字符在科林·珀西瓦尔自己的作品中,tarsnap scrypt头是96个字节。这包括:
- 6字节“scrypt”
- 10字节N、r、p参数
- 32字节盐
- 16字节SHA256字节0-47校验和
- 32字节0-63字节的HMAC哈希(使用scrypt哈希作为键)
作为base64编码字符串,它包含128个字符。应该注意的是,没有使用scrypt存储密码的标准。有不同的编码格式、不同的salt长度和不同的派生字节密码长度。但是世界似乎确实被
wg-scrypt
格式所吸引。不确定为什么wg的crypt格式允许值log2(N)为16位数字。该实现对N使用int
,因此log2(N)的最大实际值为31(0x1F
)。即使使用了long
,也不需要额外的数字。该实现使用Java的toString
将参数转换为十六进制字符串,以16为基数,没有填充,因此它永远不能实际使用规范允许的8个字符。参数的实际最大值为6个字符,因此整个字符串的实际最大值为80。@您说得对。具体实现的答案是80个字符,但我宁愿在规范规定的最大限制下出错(以防随着时间的推移实现发生变化)。@Gili当然,您对规范所说的绝对正确。但这不仅仅是int
和long
之间的区别0x100
表示N为2^256,即1x10^77!即使实现算法来执行那么多的迭代,也不可能这样做。我真正想说的是,log2(N)的16位没有意义。这似乎是规范中的一个错误。@原因是他们使用的是32位DWORD。8位表示r
,8位表示p
。剩下16位:将其用作轮数因子。当您可以直接使用0xnnrrpp
时,为什么还要设计0x00nnrrpp
。