bcrypt compara duas outras strings e retorna verdadeiro

Nov 15 2020

Estou programando um token de atualização jwt em Node.js. Depois de fazer login, ele faz o hash e os salva no banco de dados.

  1. Primeiro token:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1dWlkIjoiOWRiMTcwMmMtNDkyYy00MTJmLTkyM2QtM2Y5MWQyYzk0NTNjIiwicm9sZSI6IkNVU1RPTUVSX1JPTEUiLCJpYXQiOjE2MDU0NjA4NTksImV4cCI6MTYwNTQ2NDQ1OX0.p6LTPotLugZ-JWp4Xmt4chwWxtqqZRXuXDBhDdqLsLI

  1. Token Secound:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1dWlkIjoiOWRiMTcwMmMtNDkyYy00MTJmLTkyM2QtM2Y5MWQyYzk0NTNjIiwicm9sZSI6IkNVU1RPTUVSX1JPTEUiLCJpYXQiOjE2MDU0NjEzMjIsImV4cCI6MTYwNTQ2NDkyMn0.qMzg99DE1DvDjoMXeK08l12SlfbQd7GUSHEF5X8Mt4w

Hash Bcrypt:

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

Os dois tokens são diferentes e bcrypt mostra, em dois casos, que eles correspondem ao hash codificado.

Eu também depurei isso através do site e a mesma coisa - ambas as strings diferentes mostram que correspondem ao hash - por quê?

Estes são meus métodos de hashing:

  /**
   * 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 || '');
  }

Respostas

1 Bravo Nov 16 2020 at 00:38

bcrypt é limitado a uma "senha" de 72 caracteres

Suas "senhas" têm 220 caracteres e as primeiras 147 são idênticas (uma vez que é apenas o cabeçalho e a primeira parte do conteúdo do JWT que é idêntica em ambos os casos)

Então, seu código está apenas "fazendo hash" dos primeiros 72 caracteres idênticos