2015-01-06 62 views
4

我一直在阅读关于这个password_hash()的所有类型的论坛和教程,这对于密码保护似乎很好。PHP中的password_hash()怎么样

但现在我想知道,如果它是更好地做出自己的盐和哈希函数像

$options = [ 
    'cost' => 11, 
    'salt' => mcrypt_create_iv(22, MCRYPT_DEV_URANDOM), 
]; 
password_hash($password, PASSWORD_BCRYPT, $options); 

或者只是让功能做到这一点:

password_hash($password, PASSWORD_DEFAULT); 

好像有很多关于使用自己的盐是好还是坏的讨论。

有人可以解释为什么它不好(或不)用你自己的盐?

+4

从[docs](http://php.net/manual/en/function.password-hash.php),“小心 - 强烈建议您不要为此功能生成自己的盐。将自动为您创建一个安全的盐,如果你没有指定一个。“文档中有很多关于自动生成盐的密码安全性以及创建自己的问题的评论。 *允许函数创建盐更安全。 –

+0

谢谢@JayBlanchard – Refilon

回答

3

因为如果你不创建自己的盐,它会自动为你创建一个安全的盐。

从文档:

注意

强烈建议您不要生成自己的 此功能的盐。如果您没有指定 ,它会自动为您创建一个安全盐。

因此,为了回答你的问题,如果你不知道更多关于盐或其他......只是不要使用你自己的盐,这个功能足够强大!

+0

非常感谢。我也读过这个,但是想在使用它的网站上做100%的确定。当我可以的时候,我会标记你的答案是正确的。 – Refilon

+0

不客气;) –

1

盐只是防止彩虹表攻击的保护。
它不会让一个哈希更难打破,而是更大的整体。
如果您为每个散列使用不同的盐,攻击者将需要为每个密码创建一个彩虹表。
这是不切实际的工作和时间。
使用pseudorandom-rng生成一个盐将完成保护整个密码的工作。
https://crypto.stackexchange.com/questions/1776/can-you-help-me-understand-what-a-cryptographic-salt-is

由于功能已经产生不建议用RNG这实际上是更糟糕的生成自己的安全盐。
只需让该功能产生强烈的盐分,它就会很好,而且成本也较低,因为您不必自己制造盐。从以前的链接
Correct way of creating salted hash password

报价:

建议您不要通过自己的盐,而不是让该函数从操作系统的随机源创建一个加密的安全盐。

盐会包含在生成的哈希值中,因此您不必单独存储它。只需在数据库中创建一个60字符的字符串字段并存储散列值。函数password_verify()将从存储的散列值中提取使用的salt。欲了解更多信息,你可以看看我的教程有关存储密码。