-1

我一直在考虑用可能的 bcrypt 或类似的东西替换 SHA1 作为密码加密,我似乎无法找到一个分步、易于遵循的教程来实现这一点。我在 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:

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

问题2:

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

问题 3:

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

任何建议表示赞赏..

4

2 回答 2

2

我建议使用 PHP 的新功能password_hashpassword_verify功能。

由于您可能没有 PHP >= 5.5.0,因此有一个PHP 实现可以为旧版本的 PHP 添加对即将推出的函数的支持。

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

于 2013-05-18T13:50:56.290 回答
1
  1. 不,盐作为散列密码的一部分存储。请注意,散列是针对彩虹攻击(预先准备的散列字典)或类似攻击进行的。

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

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

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

于 2013-05-18T13:50:33.897 回答