【问题标题】:PHP password_hash and password_verify incorrect false positive?PHP password_hash 和 password_verify 不正确误报?
【发布时间】:2017-05-12 06:51:57
【问题描述】:

我是 PHP 密码函数的新手,但这对我来说似乎不正确。

<?php
$peppa = "ahsd88ah31qnaksdn9325h9asdgh3no1i3859173o5bnn789a79on352390sfm!89235n@n90a&*^T#&*$#$!*$#)";
$pw = 'jesustake-thewheel';
$peppered = $pw . $peppa;

$passhash = password_hash($peppered, PASSWORD_BCRYPT);
var_dump($passhash);

echo "<br>";

$should_fail = $pw . $peppa . ".1asd223";
echo password_verify($should_fail, $passhash);

?>

如您所见,我在 should_fail 密码测试的末尾添加了一些额外的随机字符,但它仍然返回 True 以进行匹配

我希望这会失败,因为末尾有其他字符不应该与原始字符匹配...我在这里遗漏了一些明显的东西还是这是 php 中的错误(可能是我的 php)

版本 15.6.30

【问题讨论】:

  • 这不是bug.... PHP只取密码字符串的前72个字符进行哈希和验证;这是limit of the bcrypt hashing algorithm
  • 啊,好吧,我在文档中错过了你 - 所以如果我想使用任何类型的附加类型安全尾随“胡椒”,我必须将密码限制为 ~60,然后有一个最大值12chr 胡椒 - 除非,随机盐是否计入该限制?还是不包括在内?
  • 在实践中无论如何都不需要胡椒;如果它的价值被发现一次,它不会让攻击者的生活变得更加困难。真正的安全性来自password_hash 自动添加的每个哈希的唯一盐。它使攻击哈希的复杂性比辣椒高出几个数量级。
  • 这个 72 字节的限制是密码函数传递给 bcrypt 的胡椒/密码字符串的整个长度。其他算法可能有不同的限制,但目前密码功能只支持bcrypt

标签: php hash passwords password-protection verify


【解决方案1】:

正如 MarkBaker 在他的评论中已经提到的,这是 BCrypt 算法的一个限制,它将密码截断为 72 个字符。对于密码来说,这已经绰绰有余,而且不是安全问题,但在你的情况下,你似乎达到了这个限制,因为你想加点胡椒。

绝不应该因为添加胡椒而截断密码。一个辣椒可以increase security of weak passwords。假设辣椒的大小是合理的,达到限制的密码是非常强大的,对于那些密码,辣椒是不必要的。所以如果你把辣椒放在最后,你会失去一部分辣椒,这比失去一部分密码要好。

也就是说,添加胡椒粉的方法要好得多。您可以从使用服务器端密钥加密(双向)散列中获得相同的好处。此密钥实际上类似于胡椒,但您的优势是您可以在必要时交换密钥(胡椒成为密码的一部分,在下次登录之前无法更改)。我试图在关于safely storing passwords 的教程末尾解释这一点。如果加密不是您的选择,那么至少使用 HMAC 将辣椒与密码结合起来。

【讨论】:

  • 谢谢 - 我在martinstoeckli.ch/php/php.html#bcrypt 看到你的例子 - 快速提问。在这种情况下,服务器端密钥不是用 SSL 或任何东西专门生成的东西吗?只是任何类型的随机字符?
  • 嘿 - 所以我使用了我上面发布的链接中的加密方法以及 password_hash 并验证 - 但即使我在加密/解密之前和之后的 password_hash 在我打印它们时看起来相同,验证返回 False...知道为什么吗?
  • @aescript - 是的,它与私钥/公钥无关,密钥只是一系列随机字符(对称加密)。不过,大多数加密算法对密钥的长度都有自己的要求。
  • 忽略我的最后一个问题 - 工作到很晚没有睡觉,我使用哈希值与 has 值进行密码验证......而不是 str 密码与哈希值。我的错。昏昏欲睡的错误。谢谢大家的帮助!
  • 还有一个问题-您的加密示例的返回类型...如果我对其执行 bin2hex,我可以将其存储为 varchar,但我无法将其输入到二进制字段中mysql - 我应该使用什么字段类型?
猜你喜欢
  • 2022-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-30
  • 1970-01-01
  • 1970-01-01
  • 2013-02-06
相关资源
最近更新 更多