如何检查一个字符串是否被Laravel哈希


How to check if a string is hashed by Laravel Hash?

在我使用Laravel 5.1的项目中,除了Hash默认类外,我还使用了我的库来散列密码。那么我如何检查一个字符串是否被Laravel哈希?
示例:

$2y$10$ug8B6Pxs546eQBNICxsEOOH3NgpXjOIo.g4rf1FPZk2xJncWcFUpu

可以查看长度

if( strlen($hash) == 60 )

PASSWORD_BCRYPT -使用CRYPT_BLOWFISH算法创建哈希。这将使用"$2y$"生成一个标准的crypt()兼容的散列标识符。结果将始终是一个60个字符的字符串,或者FALSE在失败。

http://php.net/manual/en/function.password-hash.php

另外,您可以检查$2y$标识符。使用像这样的regx

  preg_match('/^'$2y'$/', $hash );

或者甚至是strpos($hash, '$2y$'),虽然我不确定它会给我的头顶什么偏移。

例如

 $hash = '$2y$10$ug8B6Pxs546eQBNICxsEOOH3NgpXjOIo.g4rf1FPZk2xJncWcFUpu';
 if( strlen($hash) == 60 && preg_match('/^'$2y'$/', $hash ))

你可以很有信心,如果它以$2y$开头,长度为60,那么它是散列的。你可能会有非零的机会遇到类似的东西,但实际上是零。

在最新版本的Laravel中,您可以使用Hash::info(...)。当algo键为nullalgoName键为"unknown"时,则不进行散列:


use Illuminate'Support'Facades'Hash;
Hash::info('Non Hashed String');
//= [
//    "algo" => null,
//    "algoName" => "unknown",
//    "options" => [],
//   ]
Hash::info('$2y$10$HUaJYd/zq.V8DKPXMQPzPuICfdm1uqvASgnBc9Ri4nnvmp/PDuE22');
//= [
//    "algo" => "2y",
//    "algoName" => "bcrypt",
//    "options" => [
//      "cost" => 10,
//    ],
//  ]

注意:在Laravel 5.8 algo0而不是null

所以,你可以使用!Hash::info($value)['algo'];:
$isNotHashed = !Hash::info($value)['algo'];
// Or
$isNotHashed = Hash::info($value)['algoName'] === 'unknown';

您可以使用Hash::needsRehash($input)方法来检查字符串是否散列