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
使用2y
unicode感知BCrypt算法.您可以使用2a
,这是早期PHP版本的最佳替代方案.我做了很多评论的例子,也许你也想看看它.
PS表达式"salt"和"cost factor" password_hash()
在crypt()函数中正确使用,但是对所有crypt参数使用单词salt,这有点误导.