Bcrypt,盐和成本是什么意思?

11

我过去一直使用MD5来加密密码,但是我读到了一个观点,认为这种方式不再安全,应该改用bcrypt。

我正在使用Zend Framework 2,在其中找到了如下描述bcrypt配置的内容:

$bcrypt = new Bcrypt(array(
    'salt' => 'random value',
    'cost' => 11
));

什么是Salt和Cost?它们如何使用?

1个回答

25

盐是添加到要散列的字符串中的随机文本。例如,您不会散列my_secret_password; 您将散列类似于1jfSLKe$ *@ SL $#)(Sslkfs $ 34:my_secret_password 的内容。原因是它使得即使整个哈希密码数据库被窃取,也很难设置“彩虹表”来暴力破解密码。如果每个密码都有不同的盐,那么只有非常弱的密码(如“password”或“123456”,您应该禁止使用)才会被猜测。

成本是运行散列的次数的度量-它运行速度有多慢。您希望它运行缓慢。同样,这是一种冗余的安全层,用于散列密码被窃取的情况。这使得暴力破解变得代价高昂。

您可以在此处阅读良好的描述:https://security.stackexchange.com/a/51983/35405


1
当用户在我的网站上注册时,Bcrypt会将一个随机文本添加到他的密码中,当他再次尝试登录时,我该如何验证登录密码与注册密码是否匹配(我不知道随机盐是什么)? - darroosh
2
此处所解释的那样,您将使用$bcrypt->verify($password, $storedPassword),其中$password是用户刚输入的值,而$storedPassword是保存的(加盐和哈希)值。当您创建哈希时,盐存储在返回值中,因此您不必单独存储它。 - elixenide
1
抱歉,我不明白你的意思:“在创建哈希时,盐被存储在返回值中”。当用户注册时创建哈希的返回值没有被存储...那么在验证用户时,我怎么知道盐呢?或者你是指我应该存储返回值中的盐? - darroosh
4
您必须存储您创建的哈希值;否则,您将无法验证用户的凭据。哈希密码将类似于“$P$BRQWcDaMVzgWrFUtP/ptynlewMDR5.1”。其中,“BRQWcDaMVzgWrFUtP”是盐值。请将整个字符串(“$P$BRQWcDaMVzgWrFUtP/ptynlewMDR5.1”)存储而不要将其拆开。若没有完整的字符串,您将无法检查用户的凭据。 - elixenide
3
假设你和另一个用户使用相同的密码,如果没有盐值加密,他们会拥有相同的哈希密码。因此,你可以猜测出另一个用户的密码。这就是“彩虹表”攻击的本质。彩虹表是一个预先生成的(非常大的)列表,其中包含最常见的密码(或者有时是所有长度小于给定值的密码)的哈希值。 - Shameer
简而言之:当更改密码时,服务器必须生成盐。所有其他情况都需要使用以 $ 开头的存储密码,其中包含更改密码时使用的原始盐和实际哈希值。 - Mikko Rantalainen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接