【问题标题】:How to check if a string is hashed by Laravel Hash?如何检查字符串是否被 Laravel Hash 散列?
【发布时间】:2017-02-23 08:32:36
【问题描述】:

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

$2y$10$ug8B6Pxs546eQBNICxsEOOH3NgpXjOIo.g4rf1FPZk2xJncWcFUpu

【问题讨论】:

  • 可能try-catch解密,如果失败,不是吗?
  • 这个库做了哪种加密?它是像另一种散列函数一样的单向加密还是可解密的双向加密?如果它是另一种单向加密,我猜你不走运。如果它是可解密的,您可以尝试解密所有哈希值,看看是否有异常。给出异常的很可能是默认的 Laravel 哈希
  • @Martins.A - 请参阅hash_password,这是这些天的标准。
  • @ArtisticPhoenix 不错,不知道 BCRYPT 算法始终具有 $2y$ id 的特性。猜猜OP很幸运,除非第二个算法相同并且也有id!
  • 是的,我不确定它是否一定是 bcrypt 或 hash_password 函数的一部分。它可以是密码函数的算法标识符。我不知道。但是哈希通常是单向加密,并且总是相同的长度,例如 md5 是 32,sha1 是 40,sha256 是 60。通常只需测试长度就足够了。

标签: php regex laravel laravel-5 bcrypt


【解决方案1】:

你可以检查长度

if( strlen($hash) == 60 )

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

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

此外,您还可以检查 $2y$ 标识符。像这样的正则表达式

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

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

例如

 $hash = '$2y$10$ug8B6Pxs546eQBNICxsEOOH3NgpXjOIo.g4rf1FPZk2xJncWcFUpu';

 if( strlen($hash) == 60 && preg_match('/^\$2y\$/', $hash ))

如果它以 $2y$ 开头并且长度为 60,那么您可以确信它是经过哈希处理的。您遇到类似情况的可能性可能非零,但几乎为零。

【讨论】:

  • strpos($hash, '$2y$') === 0 :)
  • 我需要这个来通过未散列密码的测试。谢谢。
猜你喜欢
  • 2015-12-14
  • 1970-01-01
  • 2010-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-01
  • 2015-05-31
  • 2017-05-03
相关资源
最近更新 更多