password-handler
Version:
Check password strength and generate strong password
196 lines (181 loc) • 5.96 kB
JavaScript
function calculateScore(password) {
let score = 0;
if (password.length > 8) {
if (password.length > 16) {
score += 2;
} else {
score += 1;
}
}
if (/[a-z]/.test(password)) {
score += 1;
}
if (/[A-Z]/.test(password)) {
score += 1;
}
if (/[0-9]/.test(password)) {
score += 1;
}
if (/[!@#$%^&*()_+\-=[\]{};':"\\|,.<>/?]/.test(password)) {
score += 2;
}
return score;
}
function checkCommonPasswords(password) {
const commonPasswords = [
"password",
"123456",
"12345678",
"123456789",
"qwerty",
"12345",
"1234567890",
"1234567",
"111111",
"123123",
"iloveyou",
"1q2w3e4r",
"123qwe",
"654321",
"123qaz",
"Hello123",
"user",
"admin",
"********",
"admin123",
"000000",
"12345678910",
"UNKNOWN",
];
if (commonPasswords.includes(password)) {
return true;
}
return false;
}
function generateRandomIndex(min = 0, max = 10) {
return Math.floor(Math.random() * (max - min) + min);
}
function makeStrongPassword(password) {
const lowercase = "abcdefghijklmnopqrstuvwxyz";
const uppercase = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
const numbers = "0123456789";
const symbols = "!@#$%^&*()_+-";
if (!password) {
for (let i = 0; i < 10; i++) {
let lchars = lowercase[generateRandomIndex(0, lowercase.length)];
let uchars = uppercase[generateRandomIndex(0, uppercase.length)];
let nchars = numbers[generateRandomIndex(0, numbers.length)];
let schars = symbols[generateRandomIndex(0, symbols.length)];
let chars = [lchars, uchars, nchars, schars];
let idx1 = generateRandomIndex(0, password.length);
let idx2 = generateRandomIndex(0, password.length);
let idx3 = generateRandomIndex(0, password.length);
let charsIdx1 = chars[generateRandomIndex(0, chars.length)];
let charsIdx2 = chars[generateRandomIndex(0, chars.length)];
password =
password.substring(0, idx1) +
charsIdx1 +
password.substring(idx1, idx2) +
charsIdx2 +
password.substring(idx2, idx3) +
charsIdx1 +
password.substring(idx3, password.length) +
charsIdx2;
}
return password;
}
for (let i = password.length; i < 10; i++) {
let lchars = lowercase[generateRandomIndex(0, lowercase.length)];
let uchars = uppercase[generateRandomIndex(0, uppercase.length)];
let nchars = numbers[generateRandomIndex(0, numbers.length)];
let schars = symbols[generateRandomIndex(0, symbols.length)];
let chars = [lchars, uchars, nchars, schars];
let charsIdx = Math.floor(generateRandomIndex(0, chars.length) % 11);
let passIdx = generateRandomIndex(0, password.length);
password =
password.slice(0, passIdx) +
chars[charsIdx] +
lchars +
uchars +
nchars +
schars +
password.slice(passIdx);
}
return password;
}
function checkPasswordStrength(password) {
let nouns = [
"nephew",
"niece",
"child",
"son",
"daughter",
"grandson",
"granddaughter",
];
let strength = {};
let reason = [];
if (checkCommonPasswords(password)) {
strength.message = `Are you kidding me? Your password is ${password}. My new born ${
nouns[generateRandomIndex(0, nouns.length)]
} can create bettter password!`;
reason.push("Password is too common");
}
const minLength = 8;
if (password.length < minLength) {
reason.push(`Password must be at least ${minLength} characters`);
}
const hasUppercase = /[A-Z]/.test(password);
const hasLowercase = /[a-z]/.test(password);
const hasNumber = /[0-9]/.test(password);
const hasSpecialChar = /[^A-Za-z0-9]/.test(password);
if (!hasUppercase) {
reason.push("Password must contain at least one uppercase letter");
}
if (!hasLowercase) {
reason.push("Password must contain at least one lowercase letter");
}
if (!hasNumber) {
reason.push("Password must contain at least one number");
}
if (!hasSpecialChar) {
reason.push("Password must contain at least one special character");
}
strength.score = calculateScore(password);
if (strength.score === 7) {
strength.strength = "Perfecto 😙👌";
} else if (strength.score === 6) {
strength.strength = "Well done 😎";
if (reason.length > 0) {
strength.reason = reason;
}
} else if (strength.score === 5) {
strength.strength = "Strong";
if (reason.length > 0) {
strength.reason = reason;
}
} else if (strength.score >= 3) {
strength.strength = "All right";
if (reason.length > 0) {
strength.reason = reason;
}
} else if (strength.score > 1) {
strength.strength = "Medium";
if (reason.length > 0) {
strength.reason = reason;
}
} else if (strength.score === 1) {
strength.strength = "Weak";
if (reason.length > 0) {
strength.reason = reason;
}
} else {
strength.strength = "Very weak";
strength.reason = reason;
}
return strength;
}
module.exports = {
checkPasswordStrength,
makeStrongPassword,
};