Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Как проверить надёжность пароля

Короткий ответ

Опишите каждое правило регулярным выражением и соберите сообщения для невыполненных правил:

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 — Создаёт новый массив из элементов, прошедших проверку.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.