В одном проекте появилась необходимость генерации надежного пароля на клиенте. Поискал готовое решение, но ничего подходящего не нашел.
Все библиотеки, которые нашлись, не подходили по ряду причин — генерировали пароль просто по желаемой длине, отсутствовала возможность проверки надёжности пароля. Решено было писать свой «велосипед» — как альтернативное решение, да и опыт лишним не будет. В итоге получилась библиотечка 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.
Под энтропией (информационной ёмкостью) пароля подразумевается мера случайности выбора последовательности символов, составляющих пароль, оцененная методами теории информации. В качестве формулы, использующейся для определения энтропии пароля используется
где 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