在我使用Laravel 5.1
的项目中,除了Hash默认类外,我还使用了我的库来散列密码。那么我如何检查一个字符串是否被Laravel
哈希?
示例:
$2y$10$ug8B6Pxs546eQBNICxsEOOH3NgpXjOIo.g4rf1FPZk2xJncWcFUpu
可以查看长度
if( strlen($hash) == 60 )
http://php.net/manual/en/function.password-hash.phpPASSWORD_BCRYPT -使用CRYPT_BLOWFISH算法创建哈希。这将使用"$2y$"生成一个标准的crypt()兼容的散列标识符。结果将始终是一个60个字符的字符串,或者FALSE在失败。
另外,您可以检查$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
键为null
或algoName
键为"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 algo
是0
而不是null
。
!Hash::info($value)['algo'];
:
$isNotHashed = !Hash::info($value)['algo'];
// Or
$isNotHashed = Hash::info($value)['algoName'] === 'unknown';
您可以使用Hash::needsRehash($input)
方法来检查字符串是否散列