什么';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
,其中:

  • s0
    表示格式的版本0,包含128位salt和256位派生密钥
  • params
    是一个32位十六进制整数,包含log2(N)(16位)、r(8位)和p(8位)
  • salt
    是base64编码的salt
  • key
    是base64编码的派生密钥
根据base64编码字符串的长度,其中
n
表示编码的字节数

让我们来分析一下:

  • 美元符号由4个字符组成
  • 版本号由2个字符组成
  • 每个十六进制字符表示4位
    (log2(16)=4)
    ,因此
    params
    字段由(32位/4位)=8个字符组成
  • 128位salt相当于16个字节。base64编码格式包含
    (4*ceil(16/3))
    =24个字符
  • 256位派生密钥相当于32字节。base64编码格式构成
    (4*ceil(32/3))
    =44个字符
综上所述,我们得到:
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哈希作为键)
这也是所使用的格式。有一个关于校验和和和HMAC散列的基本原理的解释


作为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