-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathpassword.js
More file actions
37 lines (29 loc) · 1.34 KB
/
Copy pathpassword.js
File metadata and controls
37 lines (29 loc) · 1.34 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
const util = require('util');
const crypto = require('crypto');
const pbkdf2 = util.promisify(crypto.pbkdf2);
const randomBytes = util.promisify(crypto.randomBytes);
const generatePassword = async password => {
const ALGO = 'sha512';
const KEY_LEN = 64;
const salt = await randomBytes(32);
const iter = Math.floor(Math.random() * 20000) + 200000;
const digest = await pbkdf2(password, salt, iter, KEY_LEN, ALGO);
return `${ALGO}:${salt.toString('base64')}:${iter}:${KEY_LEN}:${digest.toString('base64')}`;
};
const verifyPassword = async (password, hashedPassword) => {
const [algo, encoded_salt, iterStr, keyLenStr, encodedDigest] =
hashedPassword.split(':');
const salt = Buffer.from(encoded_salt, 'base64');
const iter = parseInt(iterStr, 10);
const keyLen = parseInt(keyLenStr, 10);
const storedDigest = Buffer.from(encodedDigest, 'base64');
const digest = await pbkdf2(password, salt, iter, keyLen, algo);
return Buffer.compare(digest, storedDigest) === 0;
};
(async () => {
const hashedPassword = await generatePassword('password');
const result1 = await verifyPassword('password', hashedPassword);
const result2 = await verifyPassword('passsword', hashedPassword);
console.log(`hashed: ${hashedPassword}`);
console.log(`password: ${result1} / passsword: ${result2}`);
})();