在PHP 5.5中生成密码哈希并设置成本选项

cry*_*c ツ 17 php passwords bcrypt php-password-hash

我知道PHP 5.5是alpha版本,但我正在制作的这个类只是通过使用function_exists()来提前使用它的散列特性.

我查看了password_hash文档.第三个参数是$ options,它目前支持两个选项,'salt'和'cost'.

它陈述如下:

cost,表示应该使用的算法成本.可以在crypt()页面上找到这些值的示例.

当我进入crypt()页面时,它提供的文档是:

Blowfish使用盐进行散列如下:"$ 2a $","$ 2x $"或"$ 2y $",两位数的成本参数"$"和字母表中的22位数字"./0-9A-Za -z".在salt中使用此范围之外的字符将导致crypt()返回零长度字符串.两位数的成本参数是底层基于Blowfish的散列算法的迭代计数的基数2对数,并且必须在04-31范围内,超出此范围的值将导致crypt()失败.5.3.7之前的PHP版本仅支持"$ 2a $"作为salt前缀:PHP 5.3.7引入了新的前缀来修复Blowfish实现中的安全漏洞.有关安全修复程序的完整详细信息,请参阅»此文档,但总而言之,仅针对PHP 5.3.7及更高版本的开发人员应使用"$ 2y $"优先于"$ 2a $".

我似乎无法把头包裹起来.它说PHP 5.3.7及更高版本应该使用$ 2y $,但是我用什么成本来获得那个并且它是最好的选择值?他们提供的示例使用的值为7,但根据上述情况,它可以达到31,使用说4与31相比有什么不同?

mar*_*kli 17

该函数password_hash()只是函数的包装器crypt(),并且可以更容易正确地使用它.它负责生成安全的随机盐,并提供良好的默认值.

使用此功能的最简单方法是:

$hash = password_hash($password, PASSWORD_DEFAULT);
Run Code Online (Sandbox Code Playgroud)

这意味着,该函数将使用BCrypt(算法2y)散列密码,生成随机盐,并使用默认成本(此时此值为10).这些是很好的默认值,特别是我不会生成你自己的盐,很容易在那里犯错误.

如果要更改成本参数,可以这样做:

$hash = password_hash($password, PASSWORD_BCRYPT, ["cost" => 11]);
Run Code Online (Sandbox Code Playgroud)

将cost参数增加1,可以将计算哈希值所需的时间加倍.cost参数是迭代计数的对数(base-2),表示:

$iterations = 2 ^ $cost;
Run Code Online (Sandbox Code Playgroud)

编辑:

我错过了这一点,你想要生成自己的课程.对于PHP 5.3.7及更高版本,存在一个兼容包,来自制作该password_hash()功能的同一作者.您可以直接使用此代码,也可以查看精心设计的实现.对于5.3.7之前的PHP版本,不支持crypt使用2yunicode感知BCrypt算法.您可以使用2a,这是早期PHP版本的最佳替代方案.我做了很多评论的例子,也许你也想看看它.

PS表达式"salt"和"cost factor" password_hash()在crypt()函数中正确使用,但是对所有crypt参数使用单词salt,这有点误导.