【问题标题】:salt + sha512 + md5 encryption [duplicate]salt + sha512 + md5 加密 [重复]
【发布时间】:2014-01-26 23:13:35
【问题描述】:

我有以下代码:(只是一个用于加密/散列的测试文件)

<!doctype html>
<html>
<head></head>
<body>

  <?php

    error_reporting('off');

    if (isset($_POST['submit'])) {
        $salt = "2bZ@<^$";
        $hash = hash("sha512", $_POST['hash']);
        $hash = $salt . $hash;
        $hash  = md5($hash);
        echo $hash;
        $hashLen = strlen($hash);
        echo "<br>The length of the hashed word is " . $hashLen . " characters long!";
    }

    ?>

    <form action="hashed.php" method="post">
      <input type="text" name="hash">
      <input type="submit" value="Hash" name="submit">
    </form>

</body>
</html>

这有多安全? 我知道这很可能会被黑客入侵,但需要多长时间? 我目前正在制作一个 php/mysqli 注册表单,并希望使用户的密码尽可能安全,这样黑客就需要很长时间才能破解其中一个用户密码。为了进一步加密它,我可以使用它,例如:

使用 sha512、md5(md5) 对其进行散列,添加不同的盐,另外两个 sha512,另一个 md5 和另一个不同的盐!

这听起来有多安全?黑客破解该密码需要多长时间? 请您建议我使用非常非常安全的加密方法。另外,我想让用户使用 cookie 保持登录状态:需要一种安全的方式将他们的信息存储在 cookie 中!

提前致谢:)

【问题讨论】:

  • 增加了复杂性!= 增加了安全性。对所有密码使用相同的盐是完全不安全的。 password_hash() 是安全的,并且具有嵌入式安全盐。

标签: php security hash passwords password-protection


【解决方案1】:

这是不安全的。它类似于Dave's home brew hash/kinda stupid algorithm,答案解释了它的问题所在。在你的情况下,我只会说你只使用非常快的哈希值进行 2 次计算,这远远不足以击败基于 GPU 的破解。

另外,你应该never roll your own cryptography,当然这同样适用于散列函数。而是使用 PHP 附带的标准且经过充分测试的 password hashing functions

$password = "HelloStackOverflow"; // example password

$hash = password_hash($password, PASSWORD_BCRYPT); // here's the hash of the previous password

// you can set the "complexity" of the hashing algorithm, it uses more CPU power
// but it'll be harder to crack, even though the default is already good enough

$hash = password_hash($password, PASSWORD_BCRYPT, ["cost" => 10]); 

if (password_verify($password, $hash)) { // checking if a password is valid
    echo "Welcome back !"; // valid password
} else {
    echo "You're not the one you're pretending to be..."; // invalid password
}

如果您的 PHP 安装太旧 (password_* 函数,您可以使用 this library 提供与这些函数的前向兼容性;用法与上面的示例相同。

【讨论】:

    【解决方案2】:

    我目前正在制作一个 php/mysqli 注册表单,并希望使用户的密码尽可能安全,这样黑客就需要很长时间才能破解其中一个用户的密码

    关于良好密码存储系统的要素(以及它们所防御的威胁),请参阅 John Steven 为 OWASP 撰写的 Secure Password Storage Cheat SheetSecure Password Storage paper。它将带您了解整个威胁模型,并解释为什么事情会以特定方式完成。

    使用 sha512、md5(md5) 对其进行散列,添加不同的盐,另外两个 sha512,另一个 md5 和另一个不同的盐! ... 这有多安全?

    嗯,有标准和公认的做事方式,也有非标准的做事方式。我认为你的方案属于后者。

    也许使用被广泛接受的东西是个好主意。

    黑客破解该密码需要多长时间?

    破解并不是这里唯一的威胁。很有可能,试图闯入您组织的人将使用从 Adob​​e 泄露、LinkedIn 泄露、Last.fm 泄露、 泄露中收集的数百万个密码中的顶级密码之一。 ...例如:

    当您有数千个顶级密码可供使用时,为什么还要使用暴力破解?

    所以你的FIRST最好的防御是使用一个单词列表来过滤用户的错误密码选择。也就是说,首先不要让用户选择弱密码或已知密码。

    如果有人逃脱了您的密码数据库,那么他或她将使用这些相同的密码列表来尝试猜测您用户的密码。他或她可能甚至不会打扰暴力破解,因为他或她将使用密码列表恢复这么多密码。

    据我了解,这些单词列表在实现为布隆过滤器时非常小。即使有数百万个密码,它们的大小也只有 KB。请参阅 Peter Gutmann 的 Engineering Security 进行深入讨论。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-09
      • 2014-03-09
      • 2014-08-01
      • 2019-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多