PHP密码哈希:密码哈希在不同系统之间是否可移植?

3

我认为使用PHP的password_hash ()函数哈希的密码可以转移到不同系统并仍可成功用于验证目的。

据我了解,bcrypt哈希包含所有必要的组件,当与纯文本密码组合时,给定的密码可以进行验证。由于这一点,哈希可以被带到任何具有兼容实现的系统中,并用于验证目的。

我很快就会尝试这个方法,但在此之前,我想知道我的理论是否正确。

这个理论正确吗?

4个回答

5
是的,这是正确的。关于password_verify的文档说明如下:
注意password_hash()返回算法、成本和盐作为返回哈希的一部分。因此,验证哈希所需的所有信息都包含在其中。这使得验证函数可以在不需要单独存储盐或算法信息的情况下验证哈希。
当然,通过检查password_hashcrypt的输出(大体上是相同的)也很容易看到这些信息。

谢谢您提供文档链接。我已经阅读了password_hash()的文档,但没有想到去查看password_verify()函数的相关资料。 - michaelward82

2
是的,基于 crypt() 的哈希值是可移植的;它们可以传输到任何系统,并且它们包含执行此验证所需的所有必要数据,因此可以成功验证给定的密码。
请注意,高成本因素可能会导致较低的系统需要更多的迭代次数来验证密码,从而需要更长时间。
还要注意存储要求;如果您总是使用 bcrypt,则安全地将密码哈希值存储在 varchar(60) 列中。否则建议使用 varchar(255)

我知道成本问题,但很高兴你提到了它。我选择使用二进制(60)来存储哈希值 - 请参见https://dev59.com/i2025IYBdhLWcg3wpXse。 - michaelward82
@michaelward82 我通常在不存储区域敏感值的表上使用 latin1 校对规则,但是 binary 也完全可以胜任 :) - Ja͢ck

1
bcrypt算法包含自己的向量和/或盐,并且应该是可移植的。哈希和向量/盐都不包含系统特定的任何内容。
这也适用于任何其他算法,其不使用向量(或其他元素)或将此哈希包含在其输出中。

-2

我不知道你想把哈希值保存在哪里,但如果你要保存到数据库中,使用数据库自己的加密/哈希函数是最好的选择。

例如(使用加密)

INSERT INTO table (pass_hash,....) VALUES ( MD2 | MD4 | MD5 | SHA | SHA1 | SHA2_256 | SHA2_512 (" $password ") )
SELECT * FROM table WHERE pass_hash = MD2 | MD4 | MD5 | SHA | SHA1 | SHA2_256 | SHA2_512 (" $password ")

我们已经在使用哈希。我需要知道是否有任何原因,我不能将哈希值存储到其他系统中,并仍然期望哈希值能够验证。我看不出这个答案的相关性。 - michaelward82

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接