我已经阅读了PHP Manual Entry forcrypt()
中提供的信息,但我发现自己仍然不确定触发 Blowfish 算法的盐的格式。
根据手动输入,我应该使用 '$2$' 或 '$2a$' 作为 16 个字符的字符串的开头。但是,在后面给出的示例中,他们使用了更长的字符串:' $2a$07$usesomesillystringforsalt$
',这向我表明,我提供的任何字符串都将被切片和切块以适合模型。
我遇到的问题实际上是触发 Blowfish 算法与STD_DES
. 例子:
$foo = 'foo';
$salt = '$2a$' . hash('whirlpool', $foo); // 128 characters, will be truncated
$hash = crypt($foo, $salt);
// $hash = $26HdMTpoODt6
该哈希显然不是漩涡,实际上STD_DES
只有盐的前两个字符用于盐。但是,在 PHP 手册的示例中,它们的 salt 以 ' $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 函数使用河豚方法。
根据手册,' $2a$
'应该足以指导crypt()
使用河豚方法;那么,以下三个字符的意义是什么?那么,如果这三个字符如此重要,那么盐的正确格式是什么?