我一直在考虑将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更安全,还是我应该使用更好的方法?
任何建议都值得赞赏..
答案 0 :(得分:2)
我建议使用PHP的新password_hash
和password_verify
函数。
由于你可能没有PHP&gt; = 5.5.0,所以有一个PHP implementation可以为旧版本的PHP添加对即将推出的函数的支持。
答案 1 :(得分:1)
不,盐是作为哈希密码的一部分存储的。请注意,散列是针对彩虹攻击(预先准备好的哈希字典)或类似的。
为了检查有效密码,crypt函数可以将哈希密码本身作为salt,因为它知道如何从哈希中分割盐。 请参阅:Comparing passwords with crypt() in PHP
不,没关系,见上文。
SHA1比MD5更好更强,虽然最好使用SHA-2。