Calculate the entropy of a password.
const passEnt = require('passEnt');
const H = passEnt('pswd'); // 18.801758872564367
const pools = [ | |
{ id: 'numbers', pattern: /[0-9]/, size: 10 }, | |
{ id: 'l_letters', pattern: /[a-z]/, size: 26 }, | |
{ id: 'u_letters', pattern: /[A-Z]/, size: 26 }, | |
{ id: 'symbols', pattern: /[^a-zA-Z0-9]/, size: 40 } | |
]; | |
const getUsedPools = (password) => { | |
const used = []; | |
for(let index = 0; index < password.length; index++) { | |
const char = password.charAt(index); | |
const pool = pools.find(p => p.pattern.test(char)); | |
if (pool && used.findIndex(p => p.id === pool.id) === -1) { | |
used.push(pool); | |
} | |
} | |
return used; | |
}; | |
const calcPoolSize = (pools) => { | |
let size = 0; | |
pools.forEach(pool => { | |
size += pool.size; | |
}); | |
return size; | |
}; | |
const calcPoolEntropy = (pools) => { | |
const size = calcPoolSize(pools); | |
return Math.log2(size); | |
}; | |
module.exports = (password) => { | |
const pools = getUsedPools(password); | |
const charEntropy = calcPoolEntropy(pools); | |
return password.length * charEntropy; | |
}; |