Php 在bcrypt中含盐的点

Php 在bcrypt中含盐的点,php,bcrypt,Php,Bcrypt,对不起,如果这是一个愚蠢的问题,我只想知道:bcrypt的盐有什么意义?我的意思是,如果您有以下用于从密码创建哈希的代码: function generateSalt() { $salt = '$2a$13$'; $salt = $salt . '1111111111111111111111'; return $salt; } function generateHash($salt, $password) { $hash = crypt($password, $salt); return $

对不起,如果这是一个愚蠢的问题,我只想知道:bcrypt的盐有什么意义?我的意思是,如果您有以下用于从密码创建哈希的代码:

function generateSalt() {
$salt = '$2a$13$';
$salt = $salt . '1111111111111111111111';
return $salt;
}

function generateHash($salt, $password) {
$hash = crypt($password, $salt);

return $hash;
}

$salt = generateSalt();

$providedPassword = generateHash($salt, rand(3,29));

echo $providedPassword;
例如,上述输出:

$2a$13$111111111111 UDDPSICwCrewynueskxKniy5206FW

$2a$13$111111111111 UDCVRNT9QUPUKFR18./jXRzDGfE9lw0W


因此,您可以清楚地看到salt的结尾,如果有人获得了数据库,那么salt就没有意义了,因为他们只需删除salt部分并搜索散列密码即可。那么,我是不是用错了bcrypt?(静态salt只是为了显示它在我的散列中出现的位置),或者这有什么原因?

在主机之间在线发送散列时,对散列进行salt是一种增强散列抵御攻击的方法,这种攻击可能会使散列反转为其原始值。在这种情况下,窃听者可以捕获散列,但如果不知道salt值,则无论采用何种技术,都无法反转散列。

a背后的思想是,即使两个输入相同,只要每次使用不同的salt,散列也不会相同

例如,许多用户选择相同的密码。如果您只存储密码的散列,数据库将包含许多相同的散列-因此,如果攻击者只找到一次密码,他就可以轻松地将其用于所有这些用户。但是,如果对每个用户使用不同的salt值对密码进行散列,则攻击者必须破解存储区中存储的每个散列


我不确定您正在使用的代码是什么(那是什么
crypt
函数?),但是如果它将salt值预先添加到实际的hash中就可以了,只要hash本身也是使用salt计算的。无论如何,您都需要存储原始salt,以验证新输入(密码)是否与存储的哈希匹配。但是,只要在每次哈希使用之间更改salt值,就无法轻松收集原始输入的信息。

但是,salt只是在开始时与实际哈希分开,如我所示,还是密码与salt一起哈希?@FrankThomas:这不完全正确。salt并不是用来加强散列,而是让预计算攻击变得不可行。基本上,它可以防止“彩虹表”攻击,并保护碰巧使用相同密码的用户。它保护存储的密码。SSL通常用于保护导线上的信息。我在问题中显示了代码,并且我从这个站点获得了代码,也许我实现了错误,因为salt在“$2a$13$”之前的散列开始时结束,必须为每个密码随机生成salt。所有密码都有固定密码是毫无意义的。您正在使用的代码生成了一个固定的salt。我知道,但我想说明的是,salt最终并没有与被散列的值混合在一起,只是在创建salt的一开始。我说得通吗?hahaha
crypt($password,$salt)
part表示生成的哈希包含salt。当您将salt+散列存储在数据库中时,可以将它们连接起来。盐不是秘密(就这一点而言,散列也不是秘密)。你的意思是,散列包括我展示的开始的盐,以及在“$2a$13$”之后的实际散列中的盐吗?