我正在考虑迁移数据库中所有密码所使用的哈希算法,并寻找概念的证明。
我正在阅读一个非常友好的概念,它不会强迫任何人更改密码这里,这实际上允许通过散列哈希迁移数据库中的所有密码。
这个想法基本上是为了散列。与其等待用户在下一次登录时提供现有密码(p),不如立即对旧算法(H1)已经生成的现有散列使用新的散列算法(H1):hash =H2(散列)#,其中哈希以前在转换后等于H1(p),您仍然完全能够执行密码验证;只要用户尝试使用p‘登录时,只需计算H2( H1(p') )而不是以前的H1(p’)。
所以基本上我会:
假设我要从SHA1迁移到BCRYPT,我使用11111111密码运行下面的测试
// 1. Old hash algorithm used to store the password in the database and authenticate the login
hash('SHA1', '11111111')
// result: a642a77abd7d4f51bf9226ceaf891fcbb5b299b8
// 2. This would be run to update the hashed values in the database to the new algorithm
password_hash('a642a77abd7d4f51bf9226ceaf891fcbb5b299b8', PASSWORD_BCRYPT)
//result: $2y$10$zetRoEVYvjug73Ee8k/cSOSLxFBLs0fNYGJDrdqFkyqGoe41baJ46
// 3. This would be run to authenticate a user after the database passwords have been updated to the new algorithm
password_hash(hash('SHA1', '11111111'), PASSWORD_BCRYPT)
// result: $2y$10$xANTOzHQaKxfKKqzTn9lVeJIgHH3YQok/eOegIeRmrHHUTJkx7pDS从理论上讲,上面第2和第3段的结果应该是相同的,并且需要这样做--但它们不是。
我遗漏了什么吗?
发布于 2021-06-02 04:31:25
从理论上讲,上面第2和第3段的结果应该是相同的,并且需要这样做--但它们不是。
不,他们不应该,他们也不必这样。BCrypt生成自己的密码盐,这是唯一的和随机的,为相同的输入产生唯一的随机散列。
你不需要(也不想要!)每次都会产生相同的哈希。您仍然可以将候选密码(通过SHA*传递)与存储的bcrypt哈希进行比较。
您不运行password_hash(hash('SHA1', '11111111'), PASSWORD_BCRYPT)来针对存储的bcrypt哈希测试候选密码。您使用password_verify,它负责咸化输入和执行比较。
发布于 2021-06-02 04:21:20
这是因为每次password_hash生成哈希时都不同于以前生成的相同文本的散列。
https://stackoverflow.com/questions/67798829
复制相似问题