Encryption B crypt,盐和成本是什么意思?

Encryption B crypt,盐和成本是什么意思?,encryption,zend-framework2,bcrypt,Encryption,Zend Framework2,Bcrypt,我一直使用MD5加密密码,但我读到它不应该再被使用,而是使用bcrypt 我使用的是zendframework 2,我发现它描述了bcrypt配置,如下所示: $bcrypt = new Bcrypt(array( 'salt' => 'random value', 'cost' => 11 )); 盐是什么?费用是多少?如何使用它们呢?salt是添加到要散列的字符串中的随机文本。例如,您不哈希我的密码;你散列一些东西,比如1jfSLKe$*@SL$#)(Sslkf

我一直使用MD5加密密码,但我读到它不应该再被使用,而是使用bcrypt

我使用的是zendframework 2,我发现它描述了bcrypt配置,如下所示:

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

盐是什么?费用是多少?如何使用它们呢?

salt是添加到要散列的字符串中的随机文本。例如,您不哈希
我的密码
;你散列一些东西,比如
1jfSLKe$*@SL$#)(Sslkfs$34:my_secret_password
。这是因为即使整个散列密码数据库被盗,也很难建立一个“彩虹表”来强制执行密码。如果每个密码都有不同的密码,那么只有最弱的密码(如“password”或“123456”),您无论如何都应该禁止)将被猜测

成本是对运行散列的次数的度量——它的速度有多慢。您希望它变慢。同样,如果散列密码被盗,这是一个冗余的安全层。这使得强制执行任何操作的成本高得让人望而却步


你可以在这里读到一个很好的描述:

因此,当用户在我的网站注册时,Bcrypt会在他的密码中添加一个随机文本,当他再次尝试登录时,我如何验证登录密码是否与注册密码匹配(我不知道随机密码),如前所述,你将使用
$Bcrypt->verify($password,$storedPassword)
,其中,
$password
是用户刚刚输入的内容,
$storedPassword
是保存的(salt和hash)值。创建哈希时,salt存储在返回值中,因此不必单独存储。抱歉,没有理解您的意思:“创建哈希时,salt存储在返回值中”,在未存储用户注册时创建哈希的返回值…因此,在验证用户时,我如何知道salt?或者您的意思是我应该存储返回值中的salt?您必须存储您创建的哈希;否则,您无法验证用户的凭据。哈希密码类似于
$P$BRQWcDaMVzgWrFUtP/ptynlewMDR5.1
BRQWcDaMVzgWrFUtP
是盐。储存整个东西(
$P$BRQWcDaMVzgWrFUtP/ptynlewMDR5.1
)不将其拆分。如果没有整个字符串,您就无法检查用户的凭据。@darroosh,假设您和另一个用户拥有相同的密码。如果没有salt,他们将拥有相同的哈希密码。因此您可以猜测另一个用户的密码。这是“彩虹表”攻击的本质。彩虹表是预哈希表(非常大)最常用密码列表(有时是小于给定长度的所有密码)