Blog. Just Blog

Проверка стойкости пароля с помощью подсчета энтропии

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Web-мастеру и не только | Автор: ManHunter
Проверка стойкости пароля с помощью подсчета энтропии
Проверка стойкости пароля с помощью подсчета энтропии

Каждому пользователю интернета приходилось регистрироваться на каких-нибудь сайтах или сервисах, и одна из обязательных составляющих любой регистрации - придумывание пароля. Есть даже официальные рекомендации по составлению паролей, не говоря уже о многочисленных статьях на эту тему. Многие сервисы при регистрации пользователя проверяют наличие определенных групп символов в пароле, в результате складывается ситуация, как в верхней половине приведенного здесь комикса. А вот как определить, действительно ли тот или иной пароль является сложным?

Сложность пароля обычно оценивают в терминах информационной энтропии (понятие из теории информации), измеряемой в битах. Вместо количества попыток, необходимых, чтобы точно угадать пароль, берется логарифм по основанию 2 от этого числа и называется количеством "битов энтропии" в пароле. Чтобы методом полного перебора взломать пароль с 40-битной сложностью, необходимо произвести 240 попыток, проверив все возможные варианты. Но обычно атакующему хватит проверки половины из всех возможных вариантов пароля, до того как найдет правильный. В одной из статей я уже приводил научное определение и формулу для вычисления энтропии, дублировать эту информацию не буду.

Осталось оформить это в виде функции. Начну с версии на PHP, чтобы выполнять проверку стойкости пароля, например, при регистрации пользователей на сайте:
  1. function check_password_strength($password) {
  2.     $h=0;
  3.     foreach (count_chars($password1) as $v) {
  4.         $p=$v/strlen($password);
  5.         $h-=$p*log($p)/log(2);
  6.     }
  7.     $strength=intval(($h/4)*100);
  8.     return $strength>100?100:$strength;
  9. }
Чем ближе будет возвращаемое значение к 100, тем выше стойкость пароля. Вот результаты тестирования паролей из комикса и еще одного часто используемого простого пароля.
  1. echo check_password_strength('Correct Horse Battery Staple');
  2. // 91
  3. echo check_password_strength('Tr0ub4dor&3');
  4. // 82
  5. echo check_password_strength('qwerty123');
  6. // 79
Этот же алгоритм можно использовать не только на серверной стороне, но и на клиентской, еще на стадии ввода пароля пользователем. Вот функция на JavaScript, выполняющая проверку стойкости пароля:
  1. function check_password_strength(password) {
  2.     var h=0pchars=new Array;
  3.     for (var i=0i<password.lengthi++) {
  4.         if (chars[password.charAt(i)]==undefined) {
  5.             chars[password.charAt(i)]=0;
  6.         }
  7.         chars[password.charAt(i)]++;
  8.     }
  9.     for (var v in chars) {
  10.         p=chars[v]/password.length;
  11.         h-=(p*Math.log(p)/Math.log(2));
  12.     }
  13.     var strength=Math.round((h/4)*100);
  14.     return strength>100?100:strength;
  15. }
Результаты тестирования совпадают с результатами PHP-функции:
  1. console.log(check_password_strength('Correct Horse Battery Staple'));
  2. // 91
  3. console.log(check_password_strength('Tr0ub4dor&3'));
  4. // 82
  5. console.log(check_password_strength('qwerty123'));
  6. // 79
Эту функцию можно вызывать в обработчике onchange на поле ввода пароля и оповещать пользователя, например, изменением цвета фона текстового поля, сообщением или еще как-нибудь.

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

Поделиться ссылкой ВКонтакте
Просмотров: 9465 | Комментариев: 12

Внимание! Статья опубликована больше года назад, информация могла устареть!

Комментарии

Отзывы посетителей сайта о статье
Mikhail (15.06.2021 в 18:02):
1234567890 - энтропия 80.
Для серьёзного применения алгоритм не годится.
ManHunter (23.09.2016 в 08:32):
Это разумно, когда есть доступ к терминалу или если работаешь в привычном окружении. А когда надо внезапно залогиниться, например, с чужого планшета, то md5 в уме посчитать будет уже сложнее.
уэф (23.09.2016 в 02:33):
"заготовкой" для моего пароля может быть какое угодно слово ЛЮБОЙ ДЛИНЫ, запомнить которое проще простого. 32/64 символьные пароли из них получаю с помощью команд в терминале

echo luboy1text | md5sum
или
echo luboy2text | sha256sum

Сделать такой пароль в Линуксе-дело нескольких секунд, независимо от нашего дистрибутива(компьютера). помня же некую свою простенькую "заготовку" для пароля, его элементарно восстановить, всего лишь выполнив указанную команду в Терминале.
Сергей Юрьевич (14.08.2016 в 12:02):
> Кстати, как бороться с аппаратными кейлоггерами ?

Экранная клавиатура? :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 символов.
user (11.01.2016 в 19:15):
Цитатастойкость пароля гораздо сильнее зависит от длинны пароля, чем от информационной энтропии одного символа.


Согласен, только не от "энтропии одного символа", а от "энтропии строки символов".
Isidor (06.01.2016 в 17:34):
ЦитатаА энтропия у этих строк будет существенно различаться.
Не отражает она стойкости пароля, имхо.

Тут все дело в неверных предпосылках :
ЦитатаСложность пароля обычно оценивают в терминах информационной энтропии (понятие из теории информации), измеряемой в битах. Вместо количества попыток, необходимых, чтобы точно угадать пароль, берется логарифм по основанию 2 от этого числа и называется количеством "битов энтропии" в пароле.

В статье считается энтропия для одного символа, а не количество "битов энтропии". На вскидку видно, что стойкость пароля гораздо сильнее зависит от длинны пароля, чем от информационной энтропии одного символа.
user (19.12.2015 в 00:24):
Цитатапозволяет оценить только стойкость пароля против атаки прямым перебором

Не знаю..
На мой взгляд, при прямом переборе разница по времени будет никакая при таких комбинациях:
"9801234567abcdef" и при
"9800000000000000".
А энтропия у этих строк будет существенно различаться.
Не отражает она стойкости пароля, имхо.
ManHunter (18.12.2015 в 19:38):
Лошадка со скобой как раз есть, это очень популярный комикс
ND (18.12.2015 в 16:41):
Сомневаюсь что в словарях есть "Correct Horse Battery Staple" или "Посадил дед репку и выросла она большая пребольшая".
Кстати, как бороться с аппаратными кейлоггерами ?

Добавить комментарий

Заполните форму для добавления комментария
Имя*:
Текст комментария (не более 2000 символов)*:

*Все поля обязательны для заполнения.
Комментарии, содержащие рекламу, ненормативную лексику, оскорбления и т.п., а также флуд и сообщения не по теме, будут удаляться. Нарушителям может быть заблокирован доступ к сайту.
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2024
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.07 сек. / MySQL: 2 (0.0043 сек.) / Память: 4.5 Mb
Наверх