【发布时间】: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