清理password_hash()字符串

时间:2014-04-29 03:42:12

标签: php regex bcrypt password-encryption

我希望能够提供一种安全且前瞻性的方法来清理最初由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 ;来自另一个系统的输入:)

1 个答案:

答案 0 :(得分:2)

嗯,password_hash()基本上只是crypt()函数的一个更好的实现,默认情况下使用Blowfish算法:

crypt('somepassword', '$2y$10$randomlygeneratedsalt$');

crypt()函数返回一个如下所示的字符串:

$2y$10$randomlygeneratedsalte2uDLvp1Ii2e./U9C8sBjqp8I90dH6hi

它使用$分隔符来分隔细分:

  1. 算法
  2. 费用
  3. 盐/哈希组合
  4. 来自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);
    }]);