【问题标题】:PHP different one way hashes for password securityPHP 不同的单向哈希用于密码安全
【发布时间】:2011-04-07 04:21:53
【问题描述】:

我想知道使用不同的可用方法在 PHP 中对密码进行哈希处理,并将它们组合起来以提高安全性。 我想知道这是否可行..?

$pass = "***";
$salt = "!@)#%%@(#&@_!R151";
$pass = sha1($pass.$salt);
$pass = md5($pass);

【问题讨论】:

  • 我不认为md5()-ing sha1() 哈希是个好主意...
  • 是的,这行得通。但请确保每个密码的盐值都是唯一的。

标签: php security md5 sha1 password-protection


【解决方案1】:

除此之外,您可以使用更强的散列算法,例如 sha512 结合强盐和UserID:这样做: p>

 echo hash('sha512', 'MyPassword' . $StrongSalt . $UserID);

SHA512 实际上是没有发现冲突的 SHA-2。请参阅wikipedia

【讨论】:

  • 嗯,这不是重点吗?由于microtime() 不可重现,您只是创建了一个无法验证的哈希(除非您将其存储在某处)...
  • @ircmaxell,哦,是的,我只是忘记了那部分。谢谢提醒。修复它:)
  • 盐应该是随机的,或者,如果可能的话,每个条目都是唯一的,并与原始密码一起存储,以便您稍后可以比较哈希。 Salts 的目的是避免彩虹表攻击或避免泄露具有相同密码的两个用户。我不相信存在“强盐”之类的东西,因为它无论如何都是在原始文本中,强度依赖于哈希算法,因为即使输入字符串中的微小变化也会产生截然不同的输出哈希。
  • @Kilnky,通过附加$UserID,它使每个用户的销售都是独一无二的。
  • 我认为 whirlpool 是相当优秀的,就哈希而言。出于某种原因,它是我的最爱,并且受到 PHP hash 函数的支持。
【解决方案2】:

不。组合不会增加任何安全性。
实际上你让它变得不那么安全了。理论上,但无论如何。

我觉得哈希问题被高估了。
没有人关心任何其他安全问题,但每个人都渴望在十亿年内使哈希值牢不可破。放松,伙计。还有数千种其他方法可以破坏您的应用程序。

【讨论】:

  • 您可以使用其他方式为您的密码添加安全性,例如拆分散列密码并将其存储在其他地方。 (在gallery2中看到了这种技术)
  • @sheeks 唯一的问题 - 你真的需要它吗?
  • 没有。 :) 只是分享。可能对他有用。
【解决方案3】:

我想加盐就够了,但如果你想要更多,可以这样做:

sha1($salt. sha1($salt. $pass));

$salt 包含一些非打印字符、任意二进制数据或类似的东西。

再一次,我想这不会增加太多,因为我看到实现只添加了 $salt,但为什么不为未来的时代提供更多的安全性:)

【讨论】:

    【解决方案4】:

    您的密码很可能永远不会 100% 安全。

    尝试查看应为每个用户生成的nonce.

    【讨论】:

    • 你的意思是每个盐都应该是一个随机数?
    【解决方案5】:

    如果你要这样做,不要只对结果进行 MD5:

    $pass = "***";
    $salt = "!@)#%%@(#&@_!R151";
    $pass = sha1($pass.$salt);
    $pass = md5($pass);
    

    相反,对结果和输入运行 md5...

    $pass = "***";
    $salt = "!@)#%%@(#&@_!R151";
    $tmp = sha1($pass.$salt);
    $pass = md5($tmp . $pass . $salt);
    

    原因是如果你这样做md5(sha1()),你基本上会增加碰撞的机会。原因是所有sha1 冲突将自动成为md5 调用中的冲突(因此它是冲突的超集)。通过重新输入密码和盐,您可以防止这种情况发生,从而创建一个“更强”的哈希而不是一个更弱的哈希......

    【讨论】:

    • 如果我对这些事情的理解正确,当我蛮力这个pass时,第一次MD5碰撞会让我进去,不管它是什么参数。我哪里错了?
    • @Col:是的,第一次md5 冲突会让你进入。情况总是如此。但是如果你只做md5(sha1(stuff)),你可以找到md5 碰撞 sha1 碰撞。要么会让你很好。而如果你这样做md5(sha1(stuff) . stuff),你正在消除这个问题。至于为什么要多次hash,你可以看more about it in this question/answer...哦,我也不建议使用这种方法(md5(sha1())),只是IF用了。。 .
    • 又是这种奇怪的行为。如果您自己不建议您的答案,为什么要回答呢?我受不了了。
    • @Col:我的意思是,如果他一开始就要做,那么他最好做对。我不会亲自去做(我宁愿做几轮sha512),但这并不意味着这样做是“坏事”。我给出的答案指出了他提供的解决方案中的一个根本缺陷(尽管很小)......
    猜你喜欢
    • 2010-09-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多