kdcsoftware/password

View on GitHub
src/index.js

Summary

Maintainability
A
0 mins
Test Coverage
A
100%
import crypto from 'crypto';

const createHash = (pw, salt) => {
  const { PW_ITERATIONS, PW_KEYLEN, PW_DIGEST } = process.env;
  const iterations = PW_ITERATIONS ? parseInt(PW_ITERATIONS, 10) : 1000;
  const keylen = PW_KEYLEN ? parseInt(PW_KEYLEN, 10) : 64;
  const digest = PW_DIGEST || `sha512`;
  return crypto
    .pbkdf2Sync(pw, salt, iterations || 1000, keylen || 64, digest)
    .toString(`hex`);
};

export const isValidPassword = (inputPassword, salt, hash) => {
  const inputHash = createHash(inputPassword, salt);
  return inputHash === hash;
};

export const randomString = (len) => crypto.randomBytes(len).toString('hex');

export const getHashSalt = (pw) => {
  // Creating a unique salt for a particular user
  const salt = randomString(16);

  // Hashing user's salt and password with 1000 iterations,
  // 64 length and sha512 digest
  const hash = createHash(pw, salt);

  return { hash, salt };
};