似乎无法弄清楚我在这里做错了什么,我无法获得相同的哈希值两次,也无法验证密码,因此规格2和4都失败了。有没有人在这里看到任何明显的问题导致我两次生成相同的哈希有问题?我正在使用节点v8.9.1(以及我希望无关紧要的Typescript 2.6.1)。我尝试过只使用Buffers和base64字符串(如下),但没有任何效果。
实施
import { pbkdf2Sync, randomBytes } from 'crypto';
export class Auth {
private iters = 1e1; // TODO: increase later
private keylen = 64;
private digest = 'sha512';
create(password: string) {
const salt = randomBytes(128);
const hash = pbkdf2Sync(password, salt, this.iters, this.keylen, this.digest);
console.log(hash.toString('hex'));
return [salt.toString('base64'), hash.toString('base64'), this.iters].join('::');
}
verify(stored: string, password: string) {
const [salt, hash, iters] = stored.split('::');
const verify = pbkdf2Sync(password, salt, parseInt(iters, 10), this.keylen, this.digest);
console.log(verify.toString('hex'));
return hash === verify.toString('base64');
}
}
功能
describe('Auth', () => {
const auth = new Auth();
const password = 'test';
it('should hash a password', () => {
const hash = auth.create(password);
expect(hash).to.be.string;
});
it('should verify valid password', () => {
const hash = auth.create(password);
const valid = auth.verify(hash, password);
expect(valid).to.be.true;
});
it('should reject invalid password', () => {
const hash = auth.create(password);
const invalid = auth.verify(hash, 'wrong input');
expect(invalid).to.be.false;
});
});
});
答案 0 :(得分:1)
你不应该能够两次生成相同的PBKDF2哈希值,也就是随机种子的点。
WRT验证您对create
中的salt和哈希进行了Base64编码,但未对verify
中的Base64进行解码。
为了调试显示pbkdf2
和create
的{{1}}的输入和输出,请使用十六进制作为二进制值,例如verify
和salt
并添加这个问题。这可能足以让您看到错误。
当调试使事情变得尽可能简单时,使用回调会增加一定程度的调试复杂性。