我的PBKDF2在Node中出了什么问题?

时间:2017-11-27 18:29:42

标签: javascript node.js typescript cryptography pbkdf2

似乎无法弄清楚我在这里做错了什么,我无法获得相同的哈希值两次,也无法验证密码,因此规格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;
  });
});

});

1 个答案:

答案 0 :(得分:1)

你不应该能够两次生成相同的PBKDF2哈希值,也就是随机种子的点。

WRT验证您对create中的salt和哈希进行了Base64编码,但未对verify中的Base64进行解码。

为了调试显示pbkdf2create的{​​{1}}的输入和输出,请使用十六进制作为二进制值,例如verifysalt并添加这个问题。这可能足以让您看到错误。

当调试使事情变得尽可能简单时,使用回调会增加一定程度的调试复杂性。