2

我一直在考虑升级我的一个应用程序的密码哈希安全性,因为我一直在阅读关于蛮力攻击比以前快得多的信息。目前我正在使用sha1(md5($password)),我看到了使用 bcrypt + salt 的好处。我的问题是,如果我执行以下操作会更安全:

场景一:

$password -> sha1 -> bcrypt -> sha1
// This would enable me to keep all existing passwords and just 
// regenerate all the hashes without waiting for the user to re login

场景二:

$password -> bcrypt -> sha1
// I would have to add an extra column for the new hash until every
// user has logged in but the hash will still be sha1.

这两者中的任何一个都会增加哈希的安全性吗?我不是密码学大师,远非如此,我只想简单解释一下它是否可行,如果不可行,以及为什么。

谢谢

编辑

在阅读了更多内容之后,似乎 bcrypt 受到青睐,因为它的速度很慢,因为 i 使 cpu/gpu 在生成哈希之前工作的时间更长。

在 sha1 与 bcrypt 的情况下,sha1 大约比 bcrypt 快 300000 倍。这就引出了一个问题,如果 bcrypts 的优势是速度慢,那么使用 sha1 300000 次的递归散列函数肯定会和 bcrypt 一样安全吗?

我以这个函数为例:

function bsha1($data, $salt) {

$hash = $data;

for ($i = 0; $i < 300000; ++$i) {

$hash = sha1($hash . $salt);

}

为它提供一个盐,它会返回一个 sha1 散列,其中每次迭代都是一个散列散列和盐。这需要与 bcrypt 大致相同的时间。这会一样安全吗?

4

4 回答 4

12

你最好升级到password_hash().

由于您可能还没有使用 PHP 5.5(我假设您此时可能已经出于测试目的),您可以使用Ircmaxell 为 PHP 5.3+ 编写的PHP 用户空间实现password_hash()

要在登录时升级密码哈希,请从数据库中获取哈希并首先针对新的哈希进行测试。如果它返回 FALSE,您将针对旧的散列进行测试。如果返回 TRUE,则您使用新的新散列重新散列密码并将其存储回数据库。

将多个散列相互组合或链接起来——我担心我在你的问题中读到了这一点——是你永远不应该考虑的完全愚蠢的行为。散列算法彼此不兼容,并且以这种方式在散列上使用散列是错误sha1(md5($password))的:等等有效地减少了输出空间,这使得攻击更容易 - 你希望将来防止这种情况。

因此,请使用 PHP 中的新密码哈希 API 并睡个好觉。

于 2013-04-30T11:17:14.333 回答
0

与 bcrypt 相比,这两种情况都没有给你很大的安全余地。也就是说,bcrypt 绝对是一种能够抵抗暴力破解的散列算法,因为具有足够高的成本因素,它需要比任何基于 SHA 的散列方案更长的时间来散列。

说了这么多,场景 1 可能是要走的路,因为您现在可以保护您的数据库,而不是在用户登录时零碎地保护您的数据库。尽管 M8R-1jmw5r 在他/她的回答中说了什么,但结合散列算法并没有给您任何额外的安全性,但它也不会真正对您的安全性产生负面影响。

于 2013-04-30T11:33:02.743 回答
-2

您可以使用任何标准散列算法,但作为标准散列函数,它们可以回溯并且存在潜在的安全风险。

您最好使用任何散列函数,但将其与盐与您的个人密钥结合使用。这是链接

http://www.php.net/manual/en/faq.passwords.php#faq.passwords.fasthash

于 2013-04-30T11:19:28.393 回答
-3

简短的回答是肯定的,它会有所帮助。然而,长答案是否定的,因为 SHA-1 和 MD5 现在只是弱散列算法。最好只使用 SHA-2 算法,或者等待更长时间并直接使用 SHA-3。

问题出在散列函数中。三层肯定会阻止某人,但老实说,大多数时候一层足以让大多数人甚至不打扰。如果有人非常想进入,我至少会使用 SHA-2,否则你应该对你拥有的东西没问题。

编辑::

好的,澄清以上内容。将 SHA1 与 Bcrypt 一起使用并不是最好的方法。我会使用带有 bcrypt 的 SHA-2 算法,这将比使用 SHA-1 更安全。另外,层我的意思是 Bcrypt 是一个哈希传递,SHA-1 是一个哈希传递,第二个 SHA-1 是另一个哈希传递。我真的不明白为什么这是错误的?抱歉,关于图层的语义存在差异。

编辑2::

$Password -> Bcrypt -> SHA-2Bcrypt(SHA-2($Password))哪里SHA-2是 SHA-2 系列散列算法之一。

代码比使用 SHA-2 而不是 SHA-1 的 Bcrypt 更清晰。

于 2013-04-30T11:12:14.503 回答