用BCRYPT替换SHA1

时间:2013-05-18 13:39:38

标签: mysql codeigniter hash bcrypt crypt

我一直在考虑将SHA1替换为可能是bcrypt或类似的密码加密,我似乎无法找到一步一步,易于遵循的教程来实现这一点。 我在youtube上做了一个快速教程,它产生了以下代码:

$username = 'myusername';
$password = 'pa55w0rd';

$str  = substr($username, 0, 6);
$salt = '$2a$12$rU8E3fsI9rsKh3V2'.$str.'$';
$pass = crypt($password, $salt);

echo $salt . '<br>' . $pass;

当我在浏览器中运行代码时,得到输出:

$2a$12$rU8E3fsI9rsKh3V2myuser$
$2a$12$rU8E3fsI9rsKh3V2myuseeMSOT1BADLFs/ncqHx5aG2q953uqp.Tu

问题1:

我是否正确假设两个字符串都是为用户生成的,并且两个字符串都需要存储在例如users表中作为“salt”和“pass”列?

问题2:

为什么在salt和pass中可以看到用户名的一部分?这是正常的,还是需要采取一些额外步骤来消除这种情况?

问题3:

这种散列密码的方法是否比md5和sha1更安全,还是我应该使用更好的方法?

任何建议都值得赞赏..

2 个答案:

答案 0 :(得分:2)

我建议使用PHP的新password_hashpassword_verify函数。

由于你可能没有PHP&gt; = 5.5.0,所以有一个PHP implementation可以为旧版本的PHP添加对即将推出的函数的支持。

更多信息:https://gist.github.com/nikic/3707231

答案 1 :(得分:1)

  1. 不,盐是作为哈希密码的一部分存储的。请注意,散列是针对彩虹攻击(预先准备好的哈希字典)或类似的。

    为了检查有效密码,crypt函数可以将哈希密码本身作为salt,因为它知道如何从哈希中分割盐。 请参阅:Comparing passwords with crypt() in PHP

  2. 不,没关系,见上文。

  3. SHA1比MD5更好更强,虽然最好使用SHA-2。