【发布时间】: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