繁体   English   中英

PHP Salt 和密码散列

[英]PHP Salt and hashing of password

我正在尝试了解密码安全性和盐/散列,特别是与 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 盐的最佳方式吗?
  • 我意识到盐和两个生成的散列需要存储在 MySQL 中,但是需要两个散列吗? 这是矫枉过正还是倒退,还是结合了我需要的迭代方面,以及安全/推荐的 HMAC-SHA256 生成的哈希?
  • 按照 2018 年的标准,这些安全吗?
  • openssl_random_pseudo_bytes 是创建 CSPRNG 盐的最佳方式吗?

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

但是,无论如何您都不应该自己生成盐; 参见下文。

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

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

  • 按照 2018 年的标准,这些安全吗?

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

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

您应该使用的是 PHP 的专用密码哈希扩展(有关使用的更多信息,请参阅如何使用 password_hash ),它是专门为您的需要而设计的,并且其设计目的是安全的 - 这意味着它绝对可以自动化一切可能,从盐和散列时间安全验证。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM