const crypto = require('crypto');
function generateSalt(length) {
return crypto.randomBytes(Math.ceil(length / 2)).toString('hex').slice(0, length);
}
function hash(password, salt) {
const hash = crypto.createHmac('sha256', salt);
hash.update(password);
const hashedPassword = hash.digest('hex');
return salt + hashedPassword;
}
function compare(password, hashed) {
const salt = hashed.substr(0, 16);
const hashedPassword = hash(password, salt);
return hashed === hashedPassword;
}
Y29uc3QgY3J5cHRvID0gcmVxdWlyZSgnY3J5cHRvJyk7CiAKCmZ1bmN0aW9uIGdlbmVyYXRlU2FsdChsZW5ndGgpIHsKICAgIHJldHVybiBjcnlwdG8ucmFuZG9tQnl0ZXMoTWF0aC5jZWlsKGxlbmd0aCAvIDIpKS50b1N0cmluZygnaGV4Jykuc2xpY2UoMCwgbGVuZ3RoKTsKfQoKZnVuY3Rpb24gaGFzaChwYXNzd29yZCwgc2FsdCkgewogICAgY29uc3QgaGFzaCA9IGNyeXB0by5jcmVhdGVIbWFjKCdzaGEyNTYnLCBzYWx0KTsKICAgIGhhc2gudXBkYXRlKHBhc3N3b3JkKTsKICAgIGNvbnN0IGhhc2hlZFBhc3N3b3JkID0gaGFzaC5kaWdlc3QoJ2hleCcpOwogICAgcmV0dXJuIHNhbHQgKyBoYXNoZWRQYXNzd29yZDsgCn0KCmZ1bmN0aW9uIGNvbXBhcmUocGFzc3dvcmQsIGhhc2hlZCkgewogICAgY29uc3Qgc2FsdCA9IGhhc2hlZC5zdWJzdHIoMCwgMTYpOyAKICAgIGNvbnN0IGhhc2hlZFBhc3N3b3JkID0gaGFzaChwYXNzd29yZCwgc2FsdCk7IAogICAgcmV0dXJuIGhhc2hlZCA9PT0gaGFzaGVkUGFzc3dvcmQ7Cn0K