UNPKG

password-handler

Version:

Check password strength and generate strong password

196 lines (181 loc) 5.96 kB
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, };