我过去一直使用MD5来加密密码,但是我读到了一个观点,认为这种方式不再安全,应该改用bcrypt。
我正在使用Zend Framework 2,在其中找到了如下描述bcrypt配置的内容:
$bcrypt = new Bcrypt(array(
'salt' => 'random value',
'cost' => 11
));
什么是Salt和Cost?它们如何使用?
我过去一直使用MD5来加密密码,但是我读到了一个观点,认为这种方式不再安全,应该改用bcrypt。
我正在使用Zend Framework 2,在其中找到了如下描述bcrypt配置的内容:
$bcrypt = new Bcrypt(array(
'salt' => 'random value',
'cost' => 11
));
什么是Salt和Cost?它们如何使用?
盐是添加到要散列的字符串中的随机文本。例如,您不会散列my_secret_password
; 您将散列类似于1jfSLKe$ *@ SL $#)(Sslkfs $ 34:my_secret_password
的内容。原因是它使得即使整个哈希密码数据库被窃取,也很难设置“彩虹表”来暴力破解密码。如果每个密码都有不同的盐,那么只有非常弱的密码(如“password”或“123456”,您应该禁止使用)才会被猜测。
成本是运行散列的次数的度量-它运行速度有多慢。您希望它运行缓慢。同样,这是一种冗余的安全层,用于散列密码被窃取的情况。这使得暴力破解变得代价高昂。
您可以在此处阅读良好的描述:https://security.stackexchange.com/a/51983/35405
$bcrypt->verify($password, $storedPassword)
,其中$password
是用户刚输入的值,而$storedPassword
是保存的(加盐和哈希)值。当您创建哈希时,盐存储在返回值中,因此您不必单独存储它。 - elixenide$
开头的存储密码,其中包含更改密码时使用的原始盐和实际哈希值。 - Mikko Rantalainen