Hasher генерирует разные хэши для одного и того же пароля в петле?

Я использую петлевой хэшер как

import { PasswordHasher } from './hash.password.bcryptjs';

У этого есть функция генерации хэша

credentials.password = await this.passwordHasher.hashPassword(credentials.password);

Я ввожу ввод как pass@1010 для пароля для генерации хэша, но он каждый раз генерирует разные хеши. Но хэш для одной и той же строки должен быть одинаковым.

Код для класса

import { genSalt, hash } from 'bcryptjs';
import { compare } from 'bcryptjs';
import { inject } from '@loopback/core';
import { PasswordHasherBindings } from '../keys';

/**
 * Service HashPassword using module 'bcryptjs'.
 * It takes in a plain password, generates a salt with given
 * round and returns the hashed password as a string
 */
export type HashPassword = (
  password: string,
  rounds: number,
) => Promise<string>;
// bind function to `services.bcryptjs.HashPassword`
export async function hashPassword(
  password: string,
  rounds: number,
): Promise<string> {
  const salt = await genSalt(rounds);
  return await hash(password, salt);
}

export interface PasswordHasher<T = string> {
  hashPassword(password: T): Promise<T>;
  comparePassword(providedPass: T, storedPass: T): Promise<boolean>;
}

export class BcryptHasher implements PasswordHasher<string> {
  constructor(
    @inject(PasswordHasherBindings.ROUNDS)
    private readonly rounds: number,
  ) { }

  async hashPassword(password: string): Promise<string> {
    const salt = await genSalt(10);
    return await hash(password, salt);
  }

  async comparePassword(
    providedPass: string,
    storedPass: string,
  ): Promise<boolean> {
    const passwordIsMatched = await compare(providedPass, storedPass);
    return passwordIsMatched;
  }
}

person TechChain    schedule 14.11.2019    source источник
comment
Итак, как я могу сохранить его таким же?   -  person TechChain    schedule 14.11.2019
comment
Почему тебя это волнует и зачем тебе это? Весь смысл случайной соли как раз в том, чтобы убедиться, что два одинаковых пароля не ведут к одному и тому же хешу. Это функция безопасности.   -  person JB Nizet    schedule 14.11.2019
comment
Я хочу избежать sql-запроса. На данный момент мы извлекаем хэш передачи из базы данных и сравниваем его с передачей строки. Я не могу понять, как это сравнить   -  person TechChain    schedule 14.11.2019
comment
bcrypt - это одностороннее хеширование, поэтому вам нужно сохранить хешированный пароль в базе данных, а затем сравнить, взять соль из хешированного пароля и использовать ее для хеширования заданной строки. Затем оба хэша сравниваются.   -  person MjZac    schedule 14.11.2019
comment
Это сравнение путем получения случайной соли, сохраненной в хешированном пароле, затем соления и хэширования данного пароля с этой сохраненной солью и проверки, равен ли новый результат хеширования сохраненному. en.wikipedia.org/wiki/Bcrypt   -  person JB Nizet    schedule 14.11.2019
comment
Могу ли я получить определение для того, чтобы сделать то же самое, чтобы я мог сравнивать вручную? Могу ли я написать свою собственную функцию, чтобы получить соль из хэша и декодировать ее в строку   -  person TechChain    schedule 14.11.2019
comment
BCrypt имеет открытый исходный код. Вы можете переопределить его самостоятельно, если хотите. Но зачем тебе это?   -  person JB Nizet    schedule 14.11.2019


Ответы (1)


Проблема в том, что вы используете новую соль с каждым хешем. Если вы хотите получить стабильный хэш, вам нужно сгенерировать соль один раз, а затем повторно использовать ее в следующем раунде.

person hackape    schedule 22.11.2019