【问题标题】:Hasher generating different hashes for same password in loopback?哈希器在环回中为相同的密码生成不同的哈希?
【发布时间】:2019-11-22 14:50:59
【问题描述】:

我正在使用环回哈希作为

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;
  }
}

【问题讨论】:

  • 那我怎样才能保持不变呢?
  • 你为什么在乎,你为什么要这样?随机盐的全部意义在于确保两个相同的密码不会导致相同的散列。这是一项安全功能。
  • 我想避免 sql 查询。到目前为止,我们从 db 获取 pass 哈希并将其与 string pass 进行比较。我无法理解它是如何比较的
  • bcrypt 是一种单向哈希,因此您必须将哈希密码存储在数据库中,然后进行比较,从哈希密码中获取盐值并使用它对给定字符串进行哈希处理。然后比较两个哈希值。
  • 它通过将随机盐存储到散列密码中进行比较,然后使用存储的盐对给定密码进行加盐和散列,并测试新的散列结果是否等于存储的结果。 en.wikipedia.org/wiki/Bcrypt

标签: typescript hash loopback loopback4


【解决方案1】:

问题是您对每个哈希都使用了新的盐。如果你想得到稳定的哈希,你需要生成一次盐,然后在下一轮重新使用它。

【讨论】:

    猜你喜欢
    • 2017-11-15
    • 1970-01-01
    • 2012-03-19
    • 1970-01-01
    • 2015-06-12
    • 2015-02-25
    • 2015-09-08
    • 2018-03-23
    • 2013-05-12
    相关资源
    最近更新 更多