密码哈希,BCrypt到SHA1/MD5

Ozz*_*zzy 2 php encryption hash sha1 bcrypt

我一直在考虑升级我的一个应用程序的密码哈希安全性,因为我一直在阅读有关暴力攻击的速度比以前快得多.目前我正在使用sha1(md5($password)),我看到使用bcrypt + salt的好处.我的问题是,如果我要做以下事情会更安全吗?

场景1:

$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
Run Code Online (Sandbox Code Playgroud)

场景2:

$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.
Run Code Online (Sandbox Code Playgroud)

这两个中的任何一个都会增加哈希的安全性吗?我不是加密大师,远非它,我只想简单解释它是否会起作用,如果没有,为什么.

谢谢

编辑

经过一点阅读之后,似乎bcrypt受到青睐,因为它的缓慢使我在生成哈希之前使cpu/gpu工作的时间更长.

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

我把这个函数作为一个例子:

function bsha1($data, $salt) {

$hash = $data;

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

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

}
Run Code Online (Sandbox Code Playgroud)

为它提供一个salt,它将返回一个sha1哈希,其中每个迭代都是哈希哈希和盐.这与bcrypt大致相同.这会安全吗?

M8R*_*w5r 11

你最好升级到password_hash().

因为你可能还没有使用PHP 5.5(我想你此时可能已经用于测试目的了),你可以使用Ircmaxell为PHP 5.3+编写PHP用户区实现password_hash().

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

将多个哈希相互结合或链接起来 - 我担心我在你的问题中读到 - 是你永远不应该考虑的完全愚蠢.散列算法彼此不兼容,并且在散列上使用哈希就是这样做错误:sha1(md5($password))等等有效地减少了输出空间,这使得它更容易被攻击 - 这是你想要在将来阻止的东西.

因此,请使用PHP中的新密码哈希API,并且好好睡一觉.