【问题标题】:Migrating SHA1 passwords generated in PHP to Bcrypt in JavaScript将 PHP 中生成的 SHA1 密码迁移到 JavaScript 中的 Bcrypt
【发布时间】:2020-06-27 01:23:45
【问题描述】:

我对加密方面的事情或多或少有些冷淡,在这方面花了几天时间,我需要帮助。

计划是向用户发送邮件,让他们登录,根据 SHA1 验证他们的密码,然后在 Bcrypt 中加密提供的密码,替换现有密码。

我有一个“用户”表,其中包含由 PHP 中的 IonAuthFlexiAuth 组合生成的密码,以及每个密码的相应盐值。

根据 IonAuth 的配置文件,密码应该是 SHA1。

我已经通过现有的 Bcrypt 方法运行了一个我知道的 SHA1 加密密码,并且它也为密码和带盐的密码提供了 false,所以我至少消除了 Bcrypt 作为一种可能的算法。

因此,出于测试目的,我使用了已知且有效的用户名和密码。

我已经用Vue、Node、Express等重新编写了应用程序,并尝试过:

let password = passwordHash.verify(providedPassword + user.salt, user.password)
console.log("Users:password", password)

…但是密码和加盐的密码都是错误的。

我正在为 Node 使用古老的 passwordHash 模块,因为我找不到其他任何东西,而且我怀疑这不会起作用,因为它会在其哈希字符串前面加上“sha1”

作为参考,“users”表中的哈希密码字符串以:“$2a$08$...”开头,而 Bcrypt 在 Node 中生成的密码字符串以:“$2a$10$...”开头

有什么想法吗?

【问题讨论】:

  • passwordHash 在内部生成自己的盐——您无需提供自己的盐,API 会为您完成。 user.password 应该是数据库中的密码。请在生产代码中don't log user passwords
  • 嗨@TheGreatContini,如上所述,我不是在尝试恢复密码,而是在检查每个用户输入的密码,如果有效,将它们移动到 Bcrypt。
  • 如果你不使用 bcrypt 来检查密码,那么使用它是没有意义的。 Bcrypt 应该检查密码,我不知道你为什么使用passwordHash,它在六年前就被弃用了。

标签: php node.js bcrypt sha


【解决方案1】:

我不知道你在问什么:

根据 IonAuth 的配置文件,密码应该是 SHA1。

好的。可以是他们决定的任何东西;猪拉丁,如果他们愿意的话。

我已经通过现有的 Bcrypt 方法运行了一个我知道的 SHA1 加密密码,并且它也为密码和带盐的密码提供了 false,所以我至少消除了 Bcrypt 作为一种可能的算法。

SHA-1 不是加密;这是散列。您是否通过 bcrypt 运行了 SHA-1 散列 密码?或者您是否通过 bcrypt 运行了密码

它也为密码和带盐的密码提供了 false

盐是什么意思? bcrypt 提供盐。你不提供盐。 好的,所以你已经消除了 bcrypt。

但是问题是什么?您无法登录吗?您的底层框架无法验证自己的凭据?您是否收到身份验证错误?

简短版:我知道你在做什么。

但是

  • 不管这个 Ion Framework 怎么说
  • 不考虑 SHA-1
  • 不管盐与否(?!)盐
  • 无论将密码与密码的 sha-1 哈希值传递给 bcrypt:

您似乎要求识别某人在某处生成的散列密码。

两者:

  • $2a$08$…
  • $2a$10$…

绝对是 bcrypt。

第一个是 bcrypt,成本系数为 8(即 28 轮)。
第二个是 bcrypt,成本因子为 10(即 210 轮)。

不管它是什么,它应该使用 12 的成本因子(以便生成大约需要 250 毫秒)。

所以我会从消除这个框架提供的所有“有用的”“有用” 开始 - 并调用 bcrypt。

我不再使用 javascript,也不知道这是什么 bcrypt 库。但是每个值得一提的 bcrypt 库都有一个类似的功能:

String hash = bcrypt.hashPassword("hunter2", 12);

Boolean passwordMatch = bcrypt.verifyPassword("hunter2", hash);

有人试图在密码中添加盐:

providedPassword + user.salt

绝对错误。

不管

如果没有别的:您显示的那些保存的字符串 bcrypt。

  • $1$: 基于 MD5 的 crypt ('md5crypt')
  • $2$: 基于 Blowfish 的 crypt ('bcrypt')
  • $2a$: bcrypt;更新为文档 UTF8 和空终止符
  • $2b$: bcrypt;由 OpenBSD 生成,在其早期版本中没有错误
  • $2x$:由一个有缺陷的 php 实现生成的 bcrypt 哈希
  • $2y$:由一个固定的 php 实现生成的 bcrypt 哈希
  • $sha1$:基于 SHA-1 的加密('sha1crypt')
  • $5$:基于 SHA-256 的加密('sha256crypt')
  • $6$:基于 SHA-512 的加密('sha512crypt')

你说你已经淘汰了 bcrypt。

我向你保证 bcrypt。

我建议你得到这个花哨的框架,并直接使用 bcrypt。一旦你确认你可以正确:

  • 散列
  • 商店
  • 验证

使用 bcrypt 的密码,然后您可以尝试调试这个未记录的离子库。

【讨论】:

  • 嗨,我已经在开场白中解释了我在做什么以及背后的目的。我已经尝试使用 Bcrypt 使用和不使用盐的密码,但它的出现是错误的。
  • 正如我在开头所说的那样:“我在加密方面或多或少有点冷。”我已经明确了目的,添加任何其他内容都会让我说同样的话。我很感激你的努力。
猜你喜欢
  • 2012-06-02
  • 2017-01-26
  • 2013-04-24
  • 2019-03-23
  • 1970-01-01
  • 2019-10-30
  • 2011-07-12
  • 2013-10-10
  • 1970-01-01
相关资源
最近更新 更多