password_hash 能否在不同时间用相同的参数创建相同的散列?

Can password_hash create the same hash in different times with the same parameters?

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

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

例如:

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

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

如果无法确定始终不同,此修改(添加 time())能否解决始终获得不同值的问题?

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

所有这些问题都是为了尝试获得一个简单的方法来获得一个唯一的 "token" 而不使用典型的系统(如果这个值存在于 bbdd 中生成另一个)避免查询太多次。

password_hash 将添加一个 随机盐值 。唯一的盐值将产生具有非常非常高的概率的唯一散列。随机盐将从系统上可用的最佳随机数生成器中获取,因此它是唯一的概率非常非常高

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

如果您只对 唯一令牌 感兴趣,只需获取一个随机数,而不是将密码散列函数滥用到非设计用途。最好为此使用 random_bytes

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

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