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

时间:2010-02-08 23:21:24

标签: php hash salt blowfish crypt

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

1 个答案:

答案 0 :(得分:15)

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

有关相关内容,请参阅Why does BCrypt.net GenerateSalt(31) return straight away?。 : - )