【问题标题】:PHP Salt and hashing of passwordPHP Salt和密码散列
【发布时间】:2018-07-29 16:22:45
【问题描述】:

我正在尝试了解密码安全性和盐/哈希,尤其是与 PHP 相关的内容(以将信息存储在 MySQL 中)。

通过以下基本代码,我想知道我是否掌握了这个概念或失败了!

<?php

$password = "password";
$iterations = 59999;
$salt = openssl_random_pseudo_bytes(16);

$hash = hash_pbkdf2("sha256", $password, $salt, $iterations, 20);
echo "hash_pbkdf2 (passord + salt + iteration count) = ", $hash;
echo "<br>";
echo "hash_hmac (above hash + password) =", hash_hmac('sha256', $hash, $password);

?>

我想知道的是;

  • openssl_random_pseudo_bytes 是创建 CSPRNG salt 的最佳方式吗?
  • 我意识到盐和生成的两个哈希值需要存储在 MySQL 中,但是需要两个哈希值吗?这是矫枉过正还是倒退,还是结合了我需要的迭代方面以及安全/推荐的 HMAC-SHA256 生成的哈希?
  • 这些是否符合 2018 年标准?

【问题讨论】:

  • @RaymondNijland 我不确定这两个是否有助于回答我的问题......在网上阅读了很多很多东西(不是特定于 PHP)之后,我被引导相信 HMAC-SHA256 hash 是最安全的,但我不相信 hash_pbkdf2 PHP 函数可以选择使用它,只是“基本”SHA256 哈希......这就是为什么我在我的代码中对事物进行两次哈希......
  • 当您将hash_pbkdf() 与 SHA256 一起使用时,这意味着它在内部使用 HMAC-SHA256。但这并不意味着什么......像“HMAC-SHA256 哈希是最安全的”这样的陈述显然是错误的。河豚更好的那个也是如此。这完全取决于如何使用它们以及在什么环境中使用。
  • HMAC-SHA256 并不那么安全,因为它可以很容易地在 GPU 上运行,因此 GPU 可以非常快速地暴力破解哈希。 .. password_hash 默认为 Blowfish。 Blowfish 的设计无法在 GPU 上高效运行
  • 为了澄清我之前的评论,SHA256 和 Blowfish 都是加密的原语。它们是积木;两者都不足以单独安全地散列密码(但确实,与使用 SHA256 相比,使用 Blowfish 需要更少的轮次)。

标签: php mysql hash passwords salt


【解决方案1】:
  • openssl_random_pseudo_bytes 是创建 CSPRNG salt 的最佳方式吗?

应该在大多数系统上就足够了,但并非总是如此,而且您并没有以防止不良情况的方式使用它,所以不 - 它不是。最好的工具是random_bytes()

然而,无论如何你都不应该自己生成盐;阅读下文。

  • 我意识到盐和生成的两个哈希值需要存储在 MySQL 中,但是需要两个哈希值吗?这是矫枉过正还是倒退,还是结合了我需要的迭代方面以及安全/推荐的 HMAC-SHA256 生成的哈希?

您当然不需要 2 个哈希值。特别是,我不知道您为什么认为您可能需要 HMAC。示例代码甚至没有显示您将如何使用它。
实际上,PBKDF2 中的迭代次数是指它在内部执行的 HMAC 轮次,因此您只是将迭代次数加一(尽管方式不完全相同)。 首先它需要这么多迭代的原因是因为 HMAC 密钥不像用户密码。密钥应该像盐一样——随机的、不可预测的原始二进制数据;密码通常很容易被用户记住,因此它没有相同级别的熵。

  • 这些是否符合 2018 年标准?

从技术上讲,PBKDF2 部分在保证加密安全的盐时是安全的。请注意,我说它技术上是安全的,并且有条件...

所有以hash_ 为前缀的函数都是通用散列扩展的一部分,但hash_pbkdf2() 是其中唯一可以创建安全密码散列的函数,而且并非没有外部帮助。 散列有很多工具,密码散列只是其中之一。 创建哈希是一部分,盐是另一部分,验证是第三部分;等等

您应该使用的是 PHP 的专用 Password Hashing extension(有关使用的更多信息,请参阅 How to use password_hash),它专为您的需要而设计,并且出于其目的而设计是安全的 - 这意味着它绝对可以自动化一切可能,从盐和散列到时间安全验证。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-19
    • 1970-01-01
    • 2011-06-15
    • 2017-12-26
    • 2017-04-11
    • 2015-08-13
    • 2012-05-30
    • 2014-03-26
    相关资源
    最近更新 更多