15

我已经阅读了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()使用河豚方法;那么,以下三个字符的意义是什么?那么,如果这三个字符如此重要,那么盐的正确格式是什么?

4

1 回答 1

15

后面的数字2a指定要执行的轮数的 log2。例如,10 表示进行 1024 轮。通常,10 是正常的。不要使用太大的数字,否则您的密码将需要很长时间才能验证。

请参阅为什么 BCrypt.net GenerateSalt(31) 会立即返回?对于相关的东西。:-)

于 2010-02-08T23:27:40.403 回答