我希望能够提供一种安全且前瞻性的方法来清理最初由password_hash()
生成的哈希字符串。
password_hash()
将在我的系统上使用默认算法PASSWORD_DEFAULT整数实现,这将是bcrypt()
加密,但它可以在PHP的未来版本中更改。
我读过的所有手册页都没有明确说明此算法可能生成的字符。
任何人都可以建议最低限度的消毒吗?也许...
filter_var( $hashedPassword, FILTER_SANITIZE_STRING );
或
preg_replace( '/^[a-zA-Z0-9-\$\=]*$/', '', $hashedPassword );
如果您有特定于bcrypt的内容,但不一定是PHP将来更改的内容,并且我将来必须更新我的正则表达字符串,以及那些休息时间,请告诉我并且我'我会考虑的。
感谢您的帮助。
P.S。如果你想知道为什么要打扰消毒它们,好吧因为它在两个系统中被传递了一些,因为我们从一个系统到另一个系统进行了一些密码迁移,它只是感觉很脏而没有消毒我的功能&#39 ;来自另一个系统的输入:)
答案 0 :(得分:2)
嗯,password_hash()
基本上只是crypt()
函数的一个更好的实现,默认情况下使用Blowfish算法:
crypt('somepassword', '$2y$10$randomlygeneratedsalt$');
crypt()
函数返回一个如下所示的字符串:
$2y$10$randomlygeneratedsalte2uDLvp1Ii2e./U9C8sBjqp8I90dH6hi
它使用$
分隔符来分隔细分:
来自documentation(强调是我的):
[...] Blowfish用盐进行散列如下:“$ 2a $”,“$ 2x $”或“$ 2y $”,两位数的成本参数“$”和22个字符从字母“./0-9A-Za-z”。 [...]两位数的成本参数[...]必须在04-31 [...]范围内
哈希本身是一个base64编码的字符串,使用.
和/
作为最后两个字符。
换句话说,password_hash()
生成的哈希包含:
[a-zA-Z0-9$/.]
它长达60个字符。
我不知道你为什么要对它进行消毒(哈希值永远不应该被修改,所以不应该有任何消毒),但这样的事情应该有效:
$sanitized = filter_var($hash, FILTER_CALLBACK, ['options' => function($hash) {
return preg_replace('/[^a-zA-Z0-9$\/.]/', '', $hash);
}]);