PassGenJS. Генерируем пароли в Javascript с указанием надёжности

в 7:12, , рубрики: javascript, javascript library, Веб-разработка, информационная безопасность, пароли

PassGenJS. Генерируем пароли в Javascript с указанием надёжности

В одном проекте появилась необходимость генерации надежного пароля на клиенте. Поискал готовое решение, но ничего подходящего не нашел.
Все библиотеки, которые нашлись, не подходили по ряду причин — генерировали пароль просто по желаемой длине, отсутствовала возможность проверки надёжности пароля. Решено было писать свой «велосипед» — как альтернативное решение, да и опыт лишним не будет. В итоге получилась библиотечка PassGenJS.

Что под капотом:

  • Нет зависимостей
  • Генерация пароля по указанным параметрам (число букв, цифр, символов и т.д)
  • Генерация пароля по величине надёжности (1 — слабый, 4 — сверхнадёжный)
  • Генерация пароля по % надёжности (от 0 до 100%)
  • Проверка надежности пароля через вычисление энтропии

Приведу несколько примеров:

Генерируем надёжный пароль:

PassGenJS.getPassword({score: 3});
// Результат - 8!G$}6&={a(_>

Генерируем очень простой пароль:

PassGenJS.getPassword({score: 1});
// Результат - 82oN

Генерируем пароль c 60% надежностью:

PassGenJS.getPassword({reliabilityPercent: 60});
// Результат - YyopjU5atXBMG

Генерируем пароль c символьными параметрами:

PassGenJS.getPassword({
    symbols: 2,          // Количество спец. символов
    letters: 2,          // Количество букв
    numbers: 1,          // Количество цифр
    lettersUpper: 5      // Количество букв в верхнем регистре
});
// Результат - m6A:k=WYPP

Также есть возможность проверить надёжность пароля:

PassGenJS.getScore("YyopjU5atXBMG");
// Результат:
{
    "password": "YyopjU5atXBMG",   // Пароль
    "score": 3,                    // Надёжность пароля (4 - наилучший)
    "entropy": 77,                 // Энтропия пароля
    "reliability": 60.15625,       // Надёжность пароля (абсолютное значение)
    "reliabilityPercent": 60       // Надёжность пароля в % 
}

Алгоритм оценки, используемый в данном плагине, опирается на общие положения теории информации.
В качестве оценки стойкости пароля используется значение его энтропии. Подробнее можно почитать на Wikipedia.

Под энтропией (информационной ёмкостью) пароля подразумевается мера случайности выбора последовательности символов, составляющих пароль, оцененная методами теории информации. В качестве формулы, использующейся для определения энтропии пароля используется

PassGenJS. Генерируем пароли в Javascript с указанием надёжности

где N — это количество возможных символов, а L — количество символов в пароле. H измеряется в битах.

В рамках плагина используются следующие условия для определения надёжности пароля по его энтропии:

  • N < 56 — Слабый (1)
  • 56 <= N < 64 — Средний (2)
  • 64 <= N < 128 — Надёжный (3)
  • N > 128 — Сверхнадёжный (4)

if (entropy > 0 && entropy < 56) {
    score = 1;
} else if (entropy >= 56 && entropy < 64) {
    score = 2;
} else if (entropy >= 64 && entropy < 128) {
    score = 3;
} else if (entropy >= 128) {
    score = 4;
}

Буду рад здоровой критике и любому фидбеку. Если кому-то плагин окажется полезен, то можно развивать дальше:

  • плагин для jquery
  • ограничения на длину пароля
  • исключение определённых символов
  • добавление произвольных букв (через передачу параметра)
  • и т.д.

Демо
GitHub

Автор: antonre

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js