Php 在Bcrypt之前使用512哈希?

Php 在Bcrypt之前使用512哈希?,php,bcrypt,sha512,Php,Bcrypt,Sha512,我想在我的系统中使用Bcrypt进行密码加密。但所有的例子都是这样的: $password = $_POST['password']; $salt = substr(str_replace('+', '.', base64_encode(sha1(microtime(true), true))), 0, 22); $hash = crypt($password, '$2a$12$'.$salt); 这看起来很安全,但我想知道,在每个例子中,没有人在使用Bcrypt之前对密码进行哈希运算 由于独

我想在我的系统中使用Bcrypt进行密码加密。但所有的例子都是这样的:

$password = $_POST['password'];
$salt = substr(str_replace('+', '.', base64_encode(sha1(microtime(true), true))), 0, 22);
$hash = crypt($password, '$2a$12$'.$salt);
这看起来很安全,但我想知道,在每个例子中,没有人在使用Bcrypt之前对密码进行哈希运算

由于独特的salt,Rainbow表不应该能够一次破解所有密码。但是,如果黑客获取一条记录并用该特定记录的盐创建一个彩虹表,他应该能够破解一个弱密码


因此,如果有人使用弱密码(比如“foo”),在使用Bcrypt之前,先用SHA-512对其进行散列会更安全。我说得对吗?或者这看起来更安全?

crypt()
是单向字符串哈希,而不是加密机制。要使用SHA-512哈希,必须使用
hash()
函数。Bcrypt需要一个PHP扩展。对于存储密码,为什么要使其可逆,而不仅仅是散列?这就不那么安全了——如果有人得到了你的密钥和DB,他们就拥有了所有的密码,但是一个SHA512哈希表是非常无用的。

crypt()
是一个单向字符串哈希,而不是一个加密机制。要使用SHA-512哈希,必须使用
hash()
函数。Bcrypt需要一个PHP扩展。对于存储密码,为什么要使其可逆,而不仅仅是散列?这就不那么安全了——如果有人得到了你的密钥和数据库,他们就拥有了所有的密码,但是一个SHA512哈希表是非常无用的。

bcrypt已经使用了salt,它在内部的功能比SHA512强很多。在bcrypt之上添加SHA512的迭代(和/或额外的一层盐)不会给您带来明显更强的结果。如果这两个函数以错误的方式交互,以这种方式组合它们实际上可能会产生一个较弱的散列函数。

bcrypt已经使用了salt,并且它在内部的功能比SHA512强很多。在bcrypt之上添加SHA512的迭代(和/或额外的一层盐)不会给您带来明显更强的结果。如果这两个函数以错误的方式交互,以这种方式组合它们实际上可能会产生一个较弱的散列函数。

先散列不会有帮助。坏密码是指攻击者认为更可能出现的密码,并将其放在其密码列表的前面以供尝试

Bcrypt合并了salt以消除预先计算的查找表(彩虹表就是一个例子)。为什么攻击者要为单个记录构建彩虹表?不,当攻击加密密码时,攻击者只需通过其最有可能的密码的有序列表,重复哈希算法以查看是否匹配

他能在该列表中工作多远取决于哈希算法执行所需的时间。在您的示例中,Bcrypt使用“成本”因子-12来控制这一点(这是可以的,但可能是我使用的最小值)。额外的SHA-512回合并没有增加任何东西。您已经在执行4096个昂贵的bcrypt迭代。添加1个便宜的SHA-512迭代可以忽略不计


如果您选择列表中的第一个密码,它将在几分之一秒内被破解。如果你选择了第十亿个密码,攻击者在几十年内都不会破解它。

先散列也无济于事。坏密码是指攻击者认为更可能出现的密码,并将其放在其密码列表的前面以供尝试

Bcrypt合并了salt以消除预先计算的查找表(彩虹表就是一个例子)。为什么攻击者要为单个记录构建彩虹表?不,当攻击加密密码时,攻击者只需通过其最有可能的密码的有序列表,重复哈希算法以查看是否匹配

他能在该列表中工作多远取决于哈希算法执行所需的时间。在您的示例中,Bcrypt使用“成本”因子-12来控制这一点(这是可以的,但可能是我使用的最小值)。额外的SHA-512回合并没有增加任何东西。您已经在执行4096个昂贵的bcrypt迭代。添加1个便宜的SHA-512迭代可以忽略不计


如果您选择列表中的第一个密码,它将在几分之一秒内被破解。如果你选择第十亿个密码,攻击者在几十年内不会破解它。

事实上答案必须是,它不会使哈希在加密意义上显著增强。您可能知道,bcrypt(尽管要使用的函数名为
crypt
)本身是一个散列函数,而不是加密函数

在bcrypt中,您传递了一个成本因子,它定义了要进行多少次迭代(通常是数百次)。这会减慢散列的计算速度,这使得暴力攻击变得不切实际。以前使用SHA-512,只会再添加一次迭代

您所说的salt是正确的,但当然,如果您必须为每个密码构建一个彩虹表,您只需使用蛮力,直到找到匹配项,而无需构建整个彩虹表


如果攻击者控制了数据库和代码,那么额外的SHA-512将毫无帮助(只需再进行一次迭代)。如果他只有没有代码的数据库(SQL注入),那么他将识别bcrypt散列。他现在可以使用bcrypt进行暴力攻击,但由于SHA-512没有任何弱密码。这就像SHA-512散列是破解密码一样,所以字典是没有用的。这是默默无闻的安全性,但只要不知道代码,它就会有效。在将bcrypt与唯一salt一起使用之前,通过添加一个固定硬编码salt(key)可以更容易地获得相同的效果。

实际上,答案必须是,这并不会使哈希在加密意义上显著增强。您可能知道,bcrypt(尽管要使用的函数名为
crypt