【问题标题】:Replacing SHA1 with BCRYPT [duplicate]用 BCRYPT 替换 SHA1 [重复]
【发布时间】:2013-05-18 21:50:56
【问题描述】:

我一直在考虑用可能的 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 更安全,还是我应该使用更好的方法?

任何建议表示赞赏..

【问题讨论】:

    标签: mysql codeigniter hash bcrypt crypt


    【解决方案1】:

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

    由于您可能没有 PHP >= 5.5.0,因此有一个 PHP implementation 为旧版本的 PHP 添加了对即将推出的功能的支持。

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

    【讨论】:

    • 我有 PHP 5.3.0 - 我应该升级到 5.5 并使用这些功能吗?那是你推荐的吗?这些函数在后台使用 bcrypt 吗??
    • @DJDonaL3000 我链接的实现在 PHP 5.3 中运行良好,因此您无需升级。如果您在password_hash(第二个参数)中指定它,它将使用 bcrypt。
    • 链接的 PHP 实现适用于 5.3.7+。并且可能在带有向后移植修复的实现上工作。但是,如果您仍在使用 5.3.0,我强烈建议您尽可能升级到至少最新的 5.3.x 版本。
    【解决方案2】:
    1. 不,盐作为散列密码的一部分存储。请注意,哈希是针对彩虹攻击(预先准备好的哈希字典)或类似攻击进行的。

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

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

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

    【讨论】:

      猜你喜欢
      • 2015-05-13
      • 2013-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-24
      • 2011-10-26
      • 1970-01-01
      相关资源
      最近更新 更多