password-hash-salt
Version:
Simple, safe and straight-forward password hashing / salting for node.js
29 lines (26 loc) • 1.11 kB
JavaScript
import { Buffer } from 'node:buffer';
import { randomBytes, pbkdf2 } from 'node:crypto';
import { promisify } from 'node:util';
const __hashOptionsDefault = {
saltlen: 64,
iterations: 10000,
keylen: 64,
digest: 'sha1'
};
async function hash(password, options) {
// options
options = options ? Object.assign({}, __hashOptionsDefault, options) : __hashOptionsDefault;
// salt
const salt = await promisify(randomBytes)(options.saltlen);
// pbkdf2
const key = await promisify(pbkdf2)(password, salt, options.iterations, options.keylen, options.digest);
// hash
return `pbkdf2$${salt.toString('hex')}$${options.iterations}$${options.keylen}$${options.digest}$${key.toString('hex')}`;
}
async function verify(password, hash) {
const [method, salt, iterations, keylen, digest, key] = hash.split('$');
if (!method || !salt || !iterations || !keylen || !digest || !key) return false;
const key2 = await promisify(pbkdf2)(password, Buffer.from(salt, 'hex'), Number.parseInt(iterations), Number.parseInt(keylen), digest);
return key2.toString('hex') === key;
}
export { hash, verify };