Pull to refresh

Как не обломать мозг об пароли вроде eLkdC,lk#jB

Reading time 6 min
Views 35K
image

Нормальный стойкий пароль фиг запомнишь. Почти аксиома. Еще и безопасники радостно подбрасывают дровишек в этот костер ужаса, заставляя раз в месяц учить чудовищный фарш из мешанины символов. Параноидальные меры безопасности в лучших традициях «Хакера в столовой» приводят лишь к тому, что пользователи заботливо царапают пароли на мониторе или складывают под клавиатуру. Нет, серьезно, ну кто из обычных пользователей в здравом уме будет соблюдать требования к паролю в духе:

  1. Длиннее 8 символов,
  2. Содержит прописные, строчные буквы, числа и специальные символы,
  3. Не повторяет ни один из предыдущих,
  4. Меняется ежемесячно.

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

Энтропия


Классические пароли становятся более сложными для запоминания человеком и все более легкими в подборе для машины. Это прискорбно. На очередном очень важном и секьюрном сайте с кулинарными рецептами от вас требуют десятизначный пароль во всех регистрах и с цифрами? Тут могут быть три причины.

  1. Админ сайта упоротый криптопараноик, который открывает дверь в туалет вживленной RFID меткой.
  2. Админ немного переживает о том, что текущее железо очень быстро перемалывает утекшие базы, и неплохо бы хоть немного от этого защититься. Можно даже хеши посолить.
  3. Админ окончил трехмесячные курсы для продвинутых пользователей, поднял дефолтный Wordpress и понятия не имеет, что там у него за требования.

Два основных направления атаки — перебор по словарю или брутфорс в надежде на низкую длину и энтропию пароля. Пароли вида iloveyou и password заведомо ущербны, пароли с низкой энтропией уязвимы для простого брутфорса.

Сложность пароля в компьютерной индустрии обычно оценивают в терминах информационной энтропии (понятие из теории информации), измеряемой в битах. Вместо количества попыток, которые необходимо предпринять для угадывания пароля, вычисляется логарифм по основанию 2 от этого числа, и полученное число называется количеством «битов энтропии» в пароле. Пароль со, скажем, 42-битной сложностью, посчитанной таким способом, будет соответствовать случайно сгенерированному паролю длиной в 42 бита. Другими словами, чтобы методом полного перебора найти пароль с 42-битной сложностью, необходимо создать 242 паролей и попытаться использовать их; один из 242 паролей окажется правильным. Согласно формуле при увеличении длины пароля на один бит количество возможных паролей удвоится, что сделает задачу атакующего в два раза сложнее. В среднем атакующий должен будет проверить половину из всех возможных паролей до того, как найдет правильный.
Википедия

Оценить количество энтропии на символ можно в таблице ниже.
Набор символов Количество символов, N Энтропия на один символ, H, биты
Арабские цифры (0-9) 10 3,3219
Цифры шестнадцатеричной системы счисления (0-9, A-F) 16 4,0000
Строчные буквы латинского алфавита (a-z) 26 4,7004
Арабские цифры и строчные буквы латинского алфавита (a-z, 0-9) 36 5,1699
Строчные и заглавные буквы латинского алфавита (a-z, A-Z) 52 5,7004
Арабские цифры, строчные и заглавные буквы латинского алфавита (a-z, A-Z, 0-9) 62 5,9542
Все печатные символы ASCII 95 6,5699

Скрепки в лошадях


Складывается стойкое ощущение, что идеальный пароль должен содержать весь возможный набор символов, включая санскрит и улыбающийся pile of poo. Шесть с половиной бит на символ все-таки! Но тут мы сталкиваемся с проблемой применимости. Очень невесело пытаться достучаться до своего сервера, если на старом телефоне где-то в командировке нет возможности ввести арабские символы или иероглифы. Ок, думаем мы и двигаемся на строчку попроще — a-z, A-Z, 0-9. Почти 6 бит на символ. Но вот беда — запомнить фарш в духе Vh8GkCnbqbQDRv крайне трудно. Особенно, если учитывать нежелательность использования одного и того же ключа в разных местах. Да, для аккаунта в Digital Ocean или у доменного регистратора можно и нужно использовать пароли вида gZsa<(Dw}a+*5p. Но такие ключи требуют хранения в синхронизируемой зашифрованной базе вроде KeePassX, иначе на двадцатом таком ключе может потечь мозг.

image

В таких случаях на помощь приходит классический комикс с лошадью и скрепками, который наглядно демонстрирует преимущество длинных паролей с относительно невысокой энтропией на символ.

Пароль @Vy[o8!B может быть довольно легко забыт, хотя и содержит 8*6,5699=52 бита энтропии. Более компромиссный вариант eastrightcloudexplore куда более криптостойкий при легкости запоминания: 21*4.7004 = 99 бит энтропии.

Существует даже ресурс для генерации паролей по этому алгоритму с говорящим названием correcthorsebatterystaple.net. Хотя, конечно, онлайн генераторы паролей — крайне плохая идея. Сразу вспоминается старая притча:
Сисадмин желал подобрать себе стойкий пароль для централизованной авторизации через radius-сервер. Он обратился за советом к Инь Фу Во.

– Как вы думаете, Учитель, пароль "史達林格勒戰役" стойкий?
Нет, – ответил мастер Инь, – это словарный пароль.
– Но такого слова нет в словарях…
– «Словарный» означает, что это сочетание символов есть в wordlists, то есть «словарях» для перебора, которые подключаются к программам криптоанализа. Эти словари составляются из всех сочетаний символов, которые когда-либо встречались в Сети.
– А пароль «Pft,bcm» подойдёт?
– Вряд ли. Он тоже словарный.
– Но как же? Это же…
– Введи это сочетание в Гугле – и сам увидишь.
Сисадмин защёлкал клавишами.
– О, да. Вы правы, Учитель.
Через некоторое время Сисадмин воскликнул:
– Учитель, я подобрал хороший пароль, которого не может быть в словарях.
Инь Фу Во кивнул.
– Я ввёл его в Гугле, – продолжал Сисадмин, – и убедился, что в Сети такого сочетания нет.
– Теперь есть.

Оффлайн генераторы паролей


Можно воспользоваться каким-нибудь вариантом вроде KeePass, но результатом будет жуткая каша, которую сложно запомнить. Поэтому очень привлекательным вариантом являются программы, которые создают произносимые ключи, легкие для запоминания. Да, мы немного жертвуем энтропией, вводя ограничения на сочетания гласных и согласных символов, но сильно выигрываем в человекочитаемости.

xkcdpass


Для начала можно обратить внимание на xkcdpass, который работает на уже озвученном выше принципе. Установка для Debian-based дистрибутивов вполне привычная:

sudo apt-get install xkcdpass

Также можно вытащить исходники на python на Github: github.com/redacted/XKCD-password-generator. Можно также использовать pip install. Попадаются даже порты на iOS:

image
Основная фишка этого генератора — создание мнемонических последовательностей-акронимов. Для этого используется ключ --acrostic.


meklon@meklon-desktop:~$ xkcdpass --count=5 --acrostic='habr' --delimiter='|' --min=9 --max=9 --valid_chars='[a-z]'
holograph|archetype|brutishly|refutable
hemstitch|allotropy|balalaika|revivable
hardboard|ampleness|boundless|refurnish
hypertext|adiabatic|backwards|replicate
halfpence|arrowhead|blackbird|recommend

Вариант с balalaika меня особенно порадовал) Главный недостаток такого метода — уродские сервисы с ограничениями по длине пароля. Никогда не понимал, что именно они при этом экономят. Тем более, что хранить им все равно только соленый хеш от ключа пользователя.

pwgen


Классический вариант. Может генерировать как удобные для запоминания ключи, так и истинно случайные последовательности. Установка:

sudo apt-get install pwgen

Синтаксис простой — pwgen [ключи] [длина_пароля] [количество_паролей]. Ключами можно как усложнить, так и упростить получаемые пароли. По умолчанию используются цифры и заглавные/строчные буквы.

meklon@RegenLab-LinuxDesktop-1:~$ pwgen 8 4
eesohy9E Ohqu3che Mo7aijeu ieb1Quie 

Можно немного снизить энтропию и улучшить читаемость, выбросив цифры. Заодно давайте удлиним до 12 символов, чтобы это компенсировать (12*5.7004=68 бит энтропии).

meklon@meklon-desktop:~$ pwgen 12 4 --no-numerals
Eipohliemiwi WoLooJeemeir laishaisaTho oquaibahYori

Добавление опции --secure делает пароли нечитаемыми, но полностью случайными:


meklon@meklon-desktop:~$ pwgen 12 4 --secure
YFSb5lqAfSLV nMa5GKJhMmw2 VczwRho2xuwG PPAc6SByedfh 

gpw


Еще один отличный генератор. При построении паролей он использует принцип комбинирования наиболее распространенных триграмм. Результат — крайне приятные для произношения ключи:


meklon@meklon-desktop:~$ gpw 4 12
oventryllyna
slytersiderm
raboalsollic
testrisheocu

APG


Advanced Password Generator. Куча опций и возможностей. В дефолтном варианте очень удобно дробит пароль на фрагменты:


meklon@meklon-desktop:~$ apg

Please enter some random data (only first 16 are significant)
(eg. your old password):>
BidKasJuink6 (Bid-Kas-Ju-ink-SIX)
ontEjsed6 (ont-Ej-sed-SIX)
rordOWren4 (rord-O-Wren-FOUR)
yalIkatEac0 (yal-Ik-at-Eac-ZERO)
WruAdNevav1 (Wru-Ad-Nev-av-ONE)
tipBevJieb8 (tip-Bev-Jieb-EIGHT)

Здесь должен быть вывод, но автор устал


Удачной генерации)

UPD


Решил добавить утилиту для проверки криптостойкости пароля. Небесполезная штука, ковыряет ключ по словарям и оценивает стойкость.

sudo apt install libcrack2 

Используется довольно просто. Можно скармливать что-то последовательно скриптом или просто забросить на вход пароль через echo. Проверим генераторы из поста:

meklon@RegenLab-LinuxDesktop-1:~$ echo "abc123456" | cracklib-check
abc123456: слишком простой
meklon@RegenLab-LinuxDesktop-1:~$ echo "WruAdNevav1" | cracklib-check
WruAdNevav1: OK
meklon@RegenLab-LinuxDesktop-1:~$ echo "testrisheocu" | cracklib-check
testrisheocu: OK
meklon@RegenLab-LinuxDesktop-1:~$ echo "WoLooJeemeir" | cracklib-check
WoLooJeemeir: OK

На xkcdpass утилита смотрит подозрительно, но длинные пароли из смеси словарных слов признает валидными:

meklon@RegenLab-LinuxDesktop-1:~$ echo "holograph|archetype|brutishly|refutable" | cracklib-check                
holograph|archetype|brutishly|refutable: OK                                                                      
meklon@RegenLab-LinuxDesktop-1:~$ echo "holograph" | cracklib-check                
holograph: основан на слове из словаря                                                                           
meklon@RegenLab-LinuxDesktop-1:~$ echo "archetype" | cracklib-check                
archetype: основан на слове из словаря                                                                           
meklon@RegenLab-LinuxDesktop-1:~$ echo "holograph|archetype" | cracklib-check                
holograph|archetype: OK                                                            


За редактуру спасибо in_green_shoes
Tags:
Hubs:
+32
Comments 93
Comments Comments 93

Articles