首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP中的迁移散列算法

PHP中的迁移散列算法
EN

Stack Overflow用户
提问于 2021-06-02 04:14:10
回答 2查看 60关注 0票数 1

我正在考虑迁移数据库中所有密码所使用的哈希算法,并寻找概念的证明。

我正在阅读一个非常友好的概念,它不会强迫任何人更改密码这里,这实际上允许通过散列哈希迁移数据库中的所有密码。

这个想法基本上是为了散列。与其等待用户在下一次登录时提供现有密码(p),不如立即对旧算法(H1)已经生成的现有散列使用新的散列算法(H1):hash =H2(散列)#,其中哈希以前在转换后等于H1(p),您仍然完全能够执行密码验证;只要用户尝试使用p‘登录时,只需计算H2( H1(p') )而不是以前的H1(p’)。

所以基本上我会:

  1. 使用新算法,重新散列当前存储在数据库中的所有密码,采用旧的哈希算法。
  2. 当用户试图进行身份验证时,用新算法包装旧算法以验证密码。

假设我要从SHA1迁移到BCRYPT,我使用11111111密码运行下面的测试

代码语言:javascript
复制
// 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段的结果应该是相同的,并且需要这样做--但它们不是。

我遗漏了什么吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-06-02 04:31:25

从理论上讲,上面第2和第3段的结果应该是相同的,并且需要这样做--但它们不是。

不,他们不应该,他们也不必这样。BCrypt生成自己的密码盐,这是唯一的和随机的,为相同的输入产生唯一的随机散列。

你不需要(也不想要!)每次都会产生相同的哈希。您仍然可以将候选密码(通过SHA*传递)与存储的bcrypt哈希进行比较。

您不运行password_hash(hash('SHA1', '11111111'), PASSWORD_BCRYPT)来针对存储的bcrypt哈希测试候选密码。您使用password_verify,它负责咸化输入和执行比较。

票数 2
EN

Stack Overflow用户

发布于 2021-06-02 04:21:20

这是因为每次password_hash生成哈希时都不同于以前生成的相同文本的散列。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67798829

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档