首页 > 解决方案 > bcrypt 比较另外两个字符串并返回 true

问题描述

我正在 Node.js 中编写刷新令牌 jwt。登录后,它会对它们进行哈希处理并将它们保存在数据库中。

  1. 第一个令牌:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1dWlkIjoiOWRiMTcwMmMtNDkyYy00MTJmLTkyM2QtM2Y5MWQyYzk0NTNjIiwicm9sZSI6IkNVU1RPTUVSX1JPTEUiLCJpYXQiOjE2MDU0NjA4NTksImV4cCI6MTYwNTQ2NDQ1OX0.p6LTPotLugZ-JWp4Xmt4chwWxtqqZRXuXDBhDdqLsLI

  1. 第二个令牌:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1dWlkIjoiOWRiMTcwMmMtNDkyYy00MTJmLTkyM2QtM2Y5MWQyYzk0NTNjIiwicm9sZSI6IkNVU1RPTUVSX1JPTEUiLCJpYXQiOjE2MDU0NjEzMjIsImV4cCI6MTYwNTQ2NDkyMn0.qMzg99DE1DvDjoMXeK08l12SlfbQd7GUSHEF5X8Mt4w

Bcrypt 哈希:

$2b$10$RTZbH4UONRaBnam.oALmhuIs/veX.h7e3CeMlmQjk9GVC4kKPGsBO

这两个令牌是不同的,bcrypt 在两种情况下表明它们与编码的哈希匹配。

我还通过网站调试了这个,同样的事情——两个不同的字符串都显示它们与哈希匹配——为什么?

这些是我的哈希方法:

  /**
   * generate hash from password or string
   * @param {string} password
   * @returns {Promise<string>}
   */
  static async generateHash(password: string): Promise<string> {
    return bcrypt.hash(password, 10);
  }

  /**
   * validate text with hash
   * @param {string} password
   * @param {string} hash
   * @returns {Promise<boolean>}
   */
  static async validateHash(password: string, hash?: string): Promise<boolean> {
    return bcrypt.compare(password, hash || '');
  }

标签: javascript

解决方案


bcrypt 限制为 72 个字符的“密码”

您的“密码”长度为 220 个字符,前 147 个字符相同(因为这只是 JWT 的标题和内容的第一部分,在两种情况下都是相同的)

因此,您的代码只是“散列”第一个相同的 72 个字符


推荐阅读