使用PHP的crypt的河豚盐的正确格式是什么?

Der*_*sed 15 php hash crypt blowfish salt

我已经阅读了PHP手册输入中crypt()提供的信息,但我发现自己仍然不确定触发Blowfish算法的salt的格式.

根据手动输入,我应该使用'$ 2 $'或'$ 2a $'作为16个字符串的开头.然而,在以后的例子中,他们使用更长的字符串:" $2a$07$usesomesillystringforsalt$",这表明,我认为任何字符串我提供将切片和切块以适应模型.

我遇到的问题实际上是触发河豚算法中VS STD_DES.例:

$foo = 'foo';
$salt = '$2a$' . hash('whirlpool', $foo); // 128 characters, will be truncated
$hash = crypt($foo, $salt); 
// $hash = $26HdMTpoODt6
Run Code Online (Sandbox Code Playgroud)

那哈希显然不是漩涡,事实上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
Run Code Online (Sandbox Code Playgroud)

我发现我可以提供在此处显示为"人物存在一些差异07$",例如04$15$两个工作,但01$通过03$不工作(生成一个空字符串),和值等99$,并85$使其恢复到STD_DES再次.

问题:

这些三个字符跟在' $2a$'字符串之后的意义是什么,正如我通过手册所指示的那样,指示crypt函数使用blowfish方法.

根据手册," $2a$应该足以指示crypt()使用河豚方法; 那么,以下三个字的重要性是什么?那么,如果这三个字符如此重要,那么盐的正确格式是什么?

Chr*_*ung 15

后面的数字2a指定要执行的轮数的log2.例如,10表示1024轮.通常,10是正常的.不要使用太大的数字,否则您的密码将永远需要验证.

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