【问题标题】:What is the correct format for a blowfish salt using PHP's crypt?使用 PHP 的 crypt 的河豚盐的正确格式是什么?
【发布时间】:2010-02-09 07:40:27
【问题描述】:

我已阅读 PHP Manual Entry for crypt() 上提供的信息,但我发现自己仍然不确定触发 Blowfish 算法的盐的格式。

根据手动输入,我应该使用 '$2$' 或 '$2a$' 作为 16 个字符的字符串的开头。但是,在后面给出的示例中,他们使用了更长的字符串:'$2a$07$usesomesillystringforsalt$',这表明我提供的任何字符串都将被切片和切块以适合模型。

我遇到的问题实际上是触发 Blowfish 算法 vs 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()使用河豚方法;那么,以下三个字符的意义是什么?那么,如果这三个字符如此重要,那么盐的正确格式是什么?

【问题讨论】:

    标签: php hash salt blowfish crypt


    【解决方案1】:

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

    请参阅Why does BCrypt.net GenerateSalt(31) return straight away? 了解相关信息。 :-)

    【讨论】:

    • 啊,完美!这是有道理的,我猜像 01-03 这样的数字太小而无法考虑,而像 99 这样的数字太大而无法考虑。感谢您的快速响应!
    • 来自手册:两位数的成本参数是底层基于 Blowfish 的散列算法的迭代计数的以 2 为底的对数,并且必须在 04-31 范围内,超出此范围的值将导致 crypt() 失败。
    猜你喜欢
    • 2011-06-08
    • 1970-01-01
    • 2012-11-13
    • 1970-01-01
    • 1970-01-01
    • 2012-01-10
    • 2016-04-29
    • 1970-01-01
    • 2012-04-26
    相关资源
    最近更新 更多