我试图了解密码安全性和salt / hashing,特别是与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);
?>
我想知道的是;
答案 0 :(得分:2)
- openssl_random_pseudo_bytes是创建CSPRNG盐的最佳方式吗?
在大多数系统上都应该足够了,但并非总是如此,而且你并没有以防止坏情况的方式使用它,所以不 - 它不是。这项工作的最佳工具是random_bytes()
。
然而,你不应该自己生成盐;请阅读以下内容。
- 我意识到盐和两个生成的哈希需要存储在MySQL中,但需要两个哈希吗?这是过度杀伤还是倒退,还是结合我需要的迭代方面,以及安全/推荐的HMAC-SHA256生成哈希?
你当然不需要2个哈希。特别是,我不知道为什么你认为你可能需要HMAC。示例代码甚至没有显示您如何使用它 实际上,PBKDF2中的迭代次数是指它在内部执行的HMAC轮次数,因此您只需将迭代次数增加一次(尽管不完全相同)。 它首先需要这么多迭代的原因是因为HMAC密钥不像用户密码。密钥应该像盐 - 随机,不可预测的原始二进制数据;密码通常易于被用户记住,因此它没有相同的熵级别。
- 这是否符合2018年的标准?
从技术上讲,当保证加密安全盐时,PBKDF2本身是安全的。请注意,我说技术上安全并且带有条件......
所有hash_
- 前缀函数都是通用散列扩展的一部分,但hash_pbkdf2()
是唯一可以创建安全密码散列的函数,而不是没有外援
Hashing有很多设备,密码哈希只是其中之一。 创建哈希是一部分,盐 - 另一部分,验证 - 第三部分;等
您应该使用的是PHP的专用Password Hashing extension(有关使用的更多信息,请参阅How to use password_hash),这是专门为您所需要的而设计的,并且因其设计而安全目的 - 意味着它可以完全自动化所有可能的东西,从盐和散列到时间安全的验证。