【问题标题】:Can password_hash create the same hash in different times with the same parameters?password_hash 可以在不同时间使用相同的参数创建相同的哈希吗?
【发布时间】:2018-05-18 13:40:38
【问题描述】:

我假装产生唯一的随机值。

您好,我一直在检查 password_hash 的功能,我想知道如果您使用相同的参数,是否可以生成相同的结果。

例如:

password_hash('12345678',PASSWORD_BCRYPT, ['cost' => 13]) -> $2y$13$8grJKASTBm87TU56QRGbTe7m4FHqis9xVYxBJ.1YL./EgOvu0TPvG

如果我重复此操作“n”次,是否可以复制相同的结果?或将始终更改值。

如果无法确定它总是不同的,那么这个修改(添加 time())能否解决总是得到不同值的问题?

password_hash('12345678'.time(),PASSWORD_BCRYPT, ['cost' => 13]);

所有这些问题都是为了尝试获得一种简单的方法来获得唯一的“令牌”,而无需使用典型系统(如果该值存在于 bbdd 生成另一个)避免查询太多次。

【问题讨论】:

  • 不要在自己的密码中添加自己的盐。你不是密码学专家。
  • 所有这些问题都是为了尝试获得一种简单的方法来获得唯一的“令牌”,而无需使用典型系统(如果此值存在于 bbdd 生成另一个)避免查询太多次。因此,如果包含所有这些值的表中已经存在,那么您将如何避免检查我生成的随机值。
  • 不要重新发明轮子。您认为使密码哈希独一无二的东西只是一个随机值。您可以直接获取随机值,而无需通过密码散列。另外,还有专门针对这个问题的算法,即UUID
  • “那么你将如何做到这一点,避免在任何时候检查我生成的随机值是否已经存在于包含所有这些值的表中。” - 如果它绝对,肯定(AK47,不接受替代品)必须是唯一的基本上永远不会)。

标签: php php-password-hash


【解决方案1】:

password_hash 将添加一个随机盐值。唯一的盐值会以非常非常高的概率产生唯一的哈希值。随机盐将取自系统上可用的最佳随机数生成器,因此它唯一的概率非常非常高

不,没有保证盐是唯一的,或者哈希是唯一的。但是您极不可能找到重复的,除非您每秒生成数十亿个哈希值。

如果您只对 唯一令牌 感兴趣,只需获取一个随机数,而不是滥用密码哈希函数来处理它们并非设计的东西。最好使用random_bytes

【讨论】:

  • bin2hex(random_bytes(40) 或 bin2hex(random_bytes(40).time()... 但是...我可以确定表格里面没有这些值吗?
  • 你想要time()做什么?!它比任何随机值随机性小得多
  • 再次,您在这里处理概率。来自一个好的随机数生成器的足够长的值极不可能被复制。这对于经常使用来说已经足够了。如果您需要更多的保证而不是“几乎不可能找到重复”,那么您需要将值存储在具有UNIQUE 约束的数据库中。
  • 好吧,我再重复一遍……似乎人们不听……我想避免检查 bbdd 内包含所有这些随机唯一值的表。所以我可以生成一个完全独特的值。我虽然秒数会有所帮助。而且我也明白 password_hash 不适合我想要的功能。那么......你知道任何方法来生成这个“id”,但外观是随机值吗?
  • 怎么说... 没有人可以诚实地说不可能生成两个相同的随机值。 但是实际上使用random_bytes 完全没问题! 或者正如我上面指出的,UUID。许多人依赖随机值是唯一的,而事实确实如此。你只需要熟悉概率的概念。不,您可能没有如此独特的情况,您必须将 id 存储在数据库中以保证它们是唯一的。
【解决方案2】:

默认情况下,password_hash 使用随机的 128 位盐。所以是的,如果你重复这个操作 340,282,366,920,938,000,000,000,000,000,000,000,000 次,你肯定会开始看到重复的结果。实际上,这不是您需要担心的事情(即使考虑到birthday paradox)。

time() 添加到初始值不是一个明智的想法。除非您还记录了每个散列所用的时间,否则您将永远无法可靠地重新创建输入,这会破坏散列它的意义。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-21
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-30
    • 1970-01-01
    相关资源
    最近更新 更多