Проверка стойкости пароля с помощью подсчета энтропии
Проверка стойкости пароля с помощью подсчета энтропии
Каждому пользователю интернета приходилось регистрироваться на каких-нибудь сайтах или сервисах, и одна из обязательных составляющих любой регистрации - придумывание пароля. Есть даже официальные рекомендации по составлению паролей, не говоря уже о многочисленных статьях на эту тему. Многие сервисы при регистрации пользователя проверяют наличие определенных групп символов в пароле, в результате складывается ситуация, как в верхней половине приведенного здесь комикса. А вот как определить, действительно ли тот или иной пароль является сложным?
Сложность пароля обычно оценивают в терминах информационной энтропии (понятие из теории информации), измеряемой в битах. Вместо количества попыток, необходимых, чтобы точно угадать пароль, берется логарифм по основанию 2 от этого числа и называется количеством "битов энтропии" в пароле. Чтобы методом полного перебора взломать пароль с 40-битной сложностью, необходимо произвести 240 попыток, проверив все возможные варианты. Но обычно атакующему хватит проверки половины из всех возможных вариантов пароля, до того как найдет правильный. В одной из статей я уже приводил научное определение и формулу для вычисления энтропии, дублировать эту информацию не буду.
Осталось оформить это в виде функции. Начну с версии на PHP, чтобы выполнять проверку стойкости пароля, например, при регистрации пользователей на сайте:
Code (PHP) : Убрать нумерацию
- function check_password_strength($password) {
- $h=0;
- foreach (count_chars($password, 1) as $v) {
- $p=$v/strlen($password);
- $h-=$p*log($p)/log(2);
- }
- $strength=intval(($h/4)*100);
- return $strength>100?100:$strength;
- }
Code (PHP) : Убрать нумерацию
- echo check_password_strength('Correct Horse Battery Staple');
- // 91
- echo check_password_strength('Tr0ub4dor&3');
- // 82
- echo check_password_strength('qwerty123');
- // 79
Code (JavaScript) : Убрать нумерацию
- function check_password_strength(password) {
- var h=0, p, chars=new Array;
- for (var i=0; i<password.length; i++) {
- if (chars[password.charAt(i)]==undefined) {
- chars[password.charAt(i)]=0;
- }
- chars[password.charAt(i)]++;
- }
- for (var v in chars) {
- p=chars[v]/password.length;
- h-=(p*Math.log(p)/Math.log(2));
- }
- var strength=Math.round((h/4)*100);
- return strength>100?100:strength;
- }
Code (JavaScript) : Убрать нумерацию
- console.log(check_password_strength('Correct Horse Battery Staple'));
- // 91
- console.log(check_password_strength('Tr0ub4dor&3'));
- // 82
- console.log(check_password_strength('qwerty123'));
- // 79
В тоже время вы должны четко понимать, что проверка на основе подсчета энтропии не может и не должна являться единственным или достаточным критерием оценки надежности пароля, так как позволяет оценить только стойкость пароля против атаки прямым перебором. Против атаки по специально подготовленным словарям или от угона пароля кейлоггерами и различными вредоносными программами, естественно, это никак не спасет.
Просмотров: 9691 | Комментариев: 12
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
ManHunter
(23.09.2016 в 08:32):
Это разумно, когда есть доступ к терминалу или если работаешь в привычном окружении. А когда надо внезапно залогиниться, например, с чужого планшета, то md5 в уме посчитать будет уже сложнее.
уэф
(23.09.2016 в 02:33):
"заготовкой" для моего пароля может быть какое угодно слово ЛЮБОЙ ДЛИНЫ, запомнить которое проще простого. 32/64 символьные пароли из них получаю с помощью команд в терминале
echo luboy1text | md5sum
или
echo luboy2text | sha256sum
Сделать такой пароль в Линуксе-дело нескольких секунд, независимо от нашего дистрибутива(компьютера). помня же некую свою простенькую "заготовку" для пароля, его элементарно восстановить, всего лишь выполнив указанную команду в Терминале.
echo luboy1text | md5sum
или
echo luboy2text | sha256sum
Сделать такой пароль в Линуксе-дело нескольких секунд, независимо от нашего дистрибутива(компьютера). помня же некую свою простенькую "заготовку" для пароля, его элементарно восстановить, всего лишь выполнив указанную команду в Терминале.
Сергей Юрьевич
(14.08.2016 в 12:02):
> Кстати, как бороться с аппаратными кейлоггерами ?
Экранная клавиатура? :3
Экранная клавиатура? :3
GreenSnake
(11.03.2016 в 14:29):
Картинка агонь.:) 2^28 - с какого потолка взято? У автора алфавит из двух букв и пароль длиной 28?
Isidor
(15.01.2016 в 10:34):
Видимо ширину этого диапазона и отражает энтропия.
Хотя, если сравнить пароли "qwerty" и "00~000000" видно, что у второго пароля энтропия никакая, но подобрать его труднее. Так, что не понятно причем тут энтропия, если взломщику не известен диапазон используемых символов?
user
(11.01.2016 в 19:36):
..скорее так - диапазон символов при переборе может быть сужен. Например, это могут быть только цифры 0..9. А общая энтропия строки, где будут встречаться и другие символы, будет выше, чем у строки только из цифровых символов, а значит, и стойкость пароля будет повыше. В таком случае, ограничивщись при переборе только цифровыми символами, пароль вообще найден не будет.
Но это не относится к тупому перебору всего диапазона ASCII символов.
Но это не относится к тупому перебору всего диапазона ASCII символов.
user
(11.01.2016 в 19:15):
Согласен, только не от "энтропии одного символа", а от "энтропии строки символов".
Isidor
(06.01.2016 в 17:34):
Тут все дело в неверных предпосылках :
В статье считается энтропия для одного символа, а не количество "битов энтропии". На вскидку видно, что стойкость пароля гораздо сильнее зависит от длинны пароля, чем от информационной энтропии одного символа.
user
(19.12.2015 в 00:24):
Не знаю..
На мой взгляд, при прямом переборе разница по времени будет никакая при таких комбинациях:
"9801234567abcdef" и при
"9800000000000000".
А энтропия у этих строк будет существенно различаться.
Не отражает она стойкости пароля, имхо.
ManHunter
(18.12.2015 в 19:38):
Лошадка со скобой как раз есть, это очень популярный комикс
ND
(18.12.2015 в 16:41):
Сомневаюсь что в словарях есть "Correct Horse Battery Staple" или "Посадил дед репку и выросла она большая пребольшая".
Кстати, как бороться с аппаратными кейлоггерами ?
Кстати, как бороться с аппаратными кейлоггерами ?
Добавить комментарий
Заполните форму для добавления комментария
Для серьёзного применения алгоритм не годится.