我相信使用 PHP 的 password_hash() 函数散列的密码可能会转移到不同的系统,并且仍然可以成功地用于验证目的。
据我了解,bcrypt 哈希包含所有必要的组件,当与纯文本密码结合使用时,可以验证给定的密码。因此,可以将散列带到任何具有兼容实现的系统并用于验证目的。
我很快就会尝试这个,但在我这样做之前,我想知道我的理论是否正确。
它是否正确?
我相信使用 PHP 的 password_hash() 函数散列的密码可能会转移到不同的系统,并且仍然可以成功地用于验证目的。
据我了解,bcrypt 哈希包含所有必要的组件,当与纯文本密码结合使用时,可以验证给定的密码。因此,可以将散列带到任何具有兼容实现的系统并用于验证目的。
我很快就会尝试这个,但在我这样做之前,我想知道我的理论是否正确。
它是否正确?
是的,这是正确的。状态的文档password_verify
:
请注意,
password_hash()
返回算法、成本和盐作为返回哈希的一部分。因此,验证哈希所需的所有信息都包含在其中。这允许验证函数验证哈希,而无需单独存储盐或算法信息。
当然,通过检查 and 的输出也很容易看出这些信息是存在的(也就是说password_hash
,crypt
过度概括一下,大部分是相同的东西)。
是的,crypt()
基于哈希是可移植的;它们可以传输到任何系统,并且可以用于成功验证给定密码,因为它包含执行此验证所需的所有数据。
请注意,由于需要更多的迭代次数,高成本因素可能会导致较小的系统需要更长的时间来验证密码。
还要注意存储要求;如果您总是要使用 bcrypt,那么将密码哈希存储在varchar(60)
列中是安全的。否则varchar(255)
推荐。
bcrypt 算法包括它自己的向量和/或盐,应该是可移植的。hash 和 vecotor/salt 都不包含任何特定于系统的东西。
这也应该适用于不使用 vecotr(或除散列之外的其他元素)或在其输出中包含此散列的任何其他算法。
我不知道你想把哈希保存在哪里,但是如果你把它保存到数据库中,使用数据库自己的加密/哈希函数会抱怨它
示例(带加密)
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 ")