我已经阅读了PHP Manual Entry for crypt()
上提供的信息,但我发现自己仍然不确定盐的格式是否会触发Blowfish算法。
根据手册输入,我应该使用'$ 2 $'或'$ 2a $'作为16个字符串的开头。但是,在稍后给出的示例中,它们使用了更长的字符串:'$2a$07$usesomesillystringforsalt$
',这表明我提供的任何字符串都将被切片并切块以适合模型。
我遇到的问题实际上是触发了Blowfish algo vs STD_DES
。例如:
$foo = 'foo';
$salt = '$2a$' . hash('whirlpool', $foo); // 128 characters, will be truncated
$hash = crypt($foo, $salt);
// $hash = $26HdMTpoODt6
该哈希显然不是漩涡,事实上STD_DES
只有盐的前两个字符用于盐。但是,在PHP手册的例子中,他们的盐以'$2a$07$
'开头,所以如果我将这三个字符添加到相同的代码中,我会得到以下内容:
$foo = 'foo';
$salt = '$2a$' . hash('whirlpool', $foo); // 128 characters, will be truncated
$hash = crypt($foo, $salt);
// $hash = $2a$07$b1b2ee48991281a439da2OHi1vZF8Z2zIA.8njYZKR.9iBehxLoIC
我注意到我可以在字符中提供一些差异,这些字符在此处显示为“07$
”,例如04$
和15$
都有效,但是01$
通过03$
无效(生成空白字符串),而99$
和85$
等值会使其再次恢复为STD_DES
。
在“$2a$
”字符串后面这三个字符的重要性是什么,正如我通过手册所指示的那样,它指示crypt函数使用blowfish方法。
根据手册,“$2a$
”应该足以指示crypt()
使用河豚方法;那么,以下三个字的重要性是什么?那么,如果这三个字符如此重要,那么盐的正确格式是什么?
答案 0 :(得分:15)
2a
后面的数字指定要执行的轮数的log2。例如,10表示1024轮。通常,10是正常的。不要使用太大的数字,否则您的密码将永远需要验证。
有关相关内容,请参阅Why does BCrypt.net GenerateSalt(31) return straight away?。 : - )