add an elegant entropy check

This commit is contained in:
Erkin Alp Güney 2022-04-09 21:45:45 +03:00 committed by GitHub
parent f30c3223b3
commit 6620265077

View File

@ -13,6 +13,7 @@ const blocklist: string[] = []; // TODO: update ones passwordblocklist is stored
* - min <n> numbers * - min <n> numbers
* - min <n> symbols * - min <n> symbols
* - min <n> uppercase chars * - min <n> uppercase chars
* - shannon entropy divided by password entropy
* *
* Returns: 0 > pw > 1 * Returns: 0 > pw > 1
*/ */
@ -22,22 +23,22 @@ export function checkPassword(password: string): number {
// checks for total password len // checks for total password len
if (password.length >= minLength - 1) { if (password.length >= minLength - 1) {
strength += 0.25; strength += 0.05;
} }
// checks for amount of Numbers // checks for amount of Numbers
if (password.count(reNUMBER) >= minNumbers - 1) { if (password.count(reNUMBER) >= minNumbers - 1) {
strength += 0.25; strength += 0.05;
} }
// checks for amount of Uppercase Letters // checks for amount of Uppercase Letters
if (password.count(reUPPERCASELETTER) >= minUpperCase - 1) { if (password.count(reUPPERCASELETTER) >= minUpperCase - 1) {
strength += 0.25; strength += 0.05;
} }
// checks for amount of symbols // checks for amount of symbols
if (password.replace(reSYMBOLS, "").length >= minSymbols - 1) { if (password.replace(reSYMBOLS, "").length >= minSymbols - 1) {
strength += 0.25; strength += 0.05;
} }
// checks if password only consists of numbers or only consists of chars // checks if password only consists of numbers or only consists of chars
@ -45,5 +46,15 @@ export function checkPassword(password: string): number {
strength = 0; strength = 0;
} }
var entropyMap;
for (let i = 0; i < password.length; i++) {
if (entropyMap[password[i]]) entropyMap[password[i]]++;
else entropyMap[password[i]] = 1;
}
let entropies = Array(entropyMap);
entropies.map(x => (x / entropyMap.length));
strength += entropies.reduceRight((a, x), a - (x * Math.log2(x))) / Math.log2(password.length);
return strength; return strength;
} }