Как проверить надёжность пароля
Короткий ответ
Опишите каждое правило регулярным выражением и соберите сообщения для невыполненных правил:
const rules = [
[/.{8,}/, 'at least 8 characters'],
[/[a-z]/, 'a lowercase letter'],
[/[A-Z]/, 'an uppercase letter'],
[/\d/, 'a digit'],
];
const checkPassword = (password) => rules.filter(([pattern]) => !pattern.test(password)).map(([, message]) => message);
console.log(checkPassword('hello'));
console.log(checkPassword('Hello2025'));Результат:
[
"at least 8 characters",
"an uppercase letter",
"a digit"
]
[]Оценка надёжности
Посчитайте выполненные правила и превратите число в слово для индикатора надёжности:
const strength = (password) => {
let score = 0;
if (password.length >= 8) score++;
if (password.length >= 12) score++;
if (/[a-z]/.test(password) && /[A-Z]/.test(password)) score++;
if (/\d/.test(password)) score++;
if (/[^a-zA-Z0-9]/.test(password)) score++;
return ['very weak', 'weak', 'fair', 'good', 'strong', 'very strong'][score];
};
console.log(strength('abc'));
console.log(strength('Summer2025'));
console.log(strength('Tr1cky-Passw0rd!'));Результат:
very weak
good
very strongЧастая ошибка
Одни правила не делают пароль надёжным: Password1 проходит их все, но это один из самых частых паролей. Длина важнее сложности, а сервер должен хранить только хеш пароля.
const rules = [/.{8,}/, /[a-z]/, /[A-Z]/, /\d/];
console.log(rules.every((pattern) => pattern.test('Password1')));Результат:
trueФункции из этого ответа
- RegExp.prototype.test — Проверяет, есть ли в строке совпадение с шаблоном.
- Array.prototype.filter — Создаёт новый массив из элементов, прошедших проверку.