如何使用河豚散列长密码(>72个字符)72 个字符的限制河豚和胡椒建议问题根本问题回到现实世界几乎结论至于使用“秘密”辣椒:
上周我读了很多关于密码散列的文章,Blowfish似乎是目前最好的散列算法之一 - 但这不是这个问题的主题!
72 个字符的限制
河豚只考虑输入密码中的前72个字符:
<?php
$password = "Wow. This is a super secret and super, super long password. Let's add some special ch4r4ct3rs a#d everything is fine :)";
$hash = password_hash($password, PASSWORD_BCRYPT);
var_dump($password);
$input = substr($password, 0, 72);
var_dump($input);
var_dump(password_verify($input, $hash));
?>
输出为:
string(119) "Wow. This is a super secret and super, super long password. Let's add some special ch4r4ct3rs a#d everything is fine :)"
string(72) "Wow. This is a super secret and super, super long password. Let's add so"
bool(true)
如您所见,只有前72个字符很重要。Twitter正在使用河豚又名bcrypt来存储他们的密码(https://shouldichangemypassword.com/twitter-hacked.php),并猜测什么:将您的twitter密码更改为超过72个字符的长密码,您只需输入前72个字符即可登录您的帐户。
河豚和胡椒
关于“胡椒”密码有很多不同的看法。有些人说这是不必要的,因为你必须假设秘密的胡椒串也是已知的/发布的,所以它不会增强哈希值。我有一个单独的数据库服务器,所以很可能只有数据库被泄漏,而不是恒定的pepper。
在这种情况下(胡椒没有泄露),你使基于字典的攻击更加困难(如果这不正确,请纠正我)。如果你的胡椒串也被泄漏了:不是那么糟糕 - 你仍然有盐,它和没有胡椒的哈希一样好。
所以我认为添加密码至少不是一个坏选择。
建议
我建议为超过72个字符(和胡椒)的密码获取Blowfish哈希,是:
<?php
$pepper = "foIwUVmkKGrGucNJMOkxkvcQ79iPNzP5OKlbIdGPCMTjJcDYnR";
// Generate Hash
$password = "Wow. This is a super secret and super, super long password. Let's add some special ch4r4ct3rs a#d everything is fine :)";
$password_peppered = hash_hmac('sha256', $password, $pepper);
$hash = password_hash($password_peppered, PASSWORD_BCRYPT);
// Check
$input = substr($password, 0, 72);
$input_peppered = hash_hmac('sha256', $input, $pepper);
var_dump(password_verify($input_peppered, $hash));
?>
这是基于这个问题:返回。password_verify
false
问题
什么是更安全的方法?首先获取 SHA-256 哈希(返回 64 个字符)还是仅考虑密码的前 72 个字符?
优点
- 用户无法仅通过输入前 72 个字符登录
- 您可以在不超过字符限制的情况下添加胡椒粉
- hash_hmac的输出可能比密码本身具有更多的熵
- 密码由两个不同的函数进行哈希处理
缺点
- 仅使用 64 个字符来构建河豚哈希
编辑 1:这个问题只涉及河豚/bcrypt的PHP集成。感谢您的评论!