14.2. Энтропия и криптостойкость паролей

Стандартный набор символов паролей, которые можно набрать на клавиатуре, используя английские буквы и небуквенные символы, состоит из $D=94$ символов. При длине пароля $L$ символов и предположении равновероятного использования символов энтропия паролей равна

$$ H = L \log_2 D. $$

Клод Шеннон (англ. Claude Elwood Shannon), исследуя энтропию символов английского текста, изучал вероятность успешного предсказания людьми следующего символа по первым нескольким символам слов или текста. В результате Шеннон получил оценку энтропии первого символа $s_1$ текста порядка $H(s_1) \approx 4{,}6$$4{,}7$ бит/символ и оценки энтропий последующих символов, постепенно уменьшающиеся до $H(s_9) \approx 1{,}5$ бит/символ для 9-го символа. Энтропия для длинных текстов художественных произведений получила оценку $H(s_\infty) \approx 0{,}4$ бит/символ.

Статистические исследования баз паролей показывают, что в англоязычных текстах наиболее часто используются буквы «a», «e», «o», «r» и цифра «1».

NIST (Национальный институт стандартов и технологий США, англ. National Institute of Standards and Technology) использует следующие рекомендации для оценки энтропии паролей, создаваемых людьми.

  1. Энтропия первого символа $H(s_1) = 4$ бит/символ.
  2. Энтропия со 2-го по 8-й символы $H(s_{i}) = 2$ бит/символ, $2 \leq i \leq 8$.
  3. Энтропия с 9-го по 20-й символы $H(s_{i}) = 1{,}5$ бит/символ, $9 \leq i \leq 20$.
  4. Энтропия с 21-го символа $H(s_{i}) = 1$ бит/символ, $i \geq 21$.
  5. Проверка композиции на использование символов разных регистров и небуквенных символов добавляет до 6-ти бит энтропии пароля.
  6. Словарная проверка на слова и часто используемые пароли добавляет до 6 бит энтропии для коротких паролей. Для 20-символьных и более длинных паролей прибавка к энтропии – 0 бит.

Для оценки энтропии пароля нужно сложить энтропии символов $H(s_i)$ и сделать дополнительные надбавки, если пароль удовлетворяет тестам на композицию и отсутствует в словаре.

1.25
1.5cmДлина пароля, символы4.5cmЭнтропия паролей пользователей по критериям NIST2cmЭнтропия случайных равновероятных паролей
 1.5cmБез проверок1.5cmСловарная проверка1.5cmСловарная и композиционная проверка
4ex
410141626.3
614202339.5
818243052.7
1021263265.9
1224283479.0
16303238105.4
20363642131.7
24404046158.0
30464652197.2
40565662263.4
Таблица 14.1 — Оценка NIST предполагаемой энтропии паролей

В таблице [tab:password-entropy] приведена оценка NIST на величину энтропии пользовательских паролей в зависимости от их длины, и приведено сравнение с энтропией случайных паролей с равномерным распределением символов из набора в $D=94$ символов клавиатуры. Вероятное число попыток для подбора пароля составляет $O(2^H)$. Из таблицы видно, что по критериям NIST энтропия реальных паролей в 2--4 раза меньше энтропии случайных паролей с равномерным распределением символов.

Пример. Оценим общее количество существующих паролей. Население Земли – 7 млрд. Предположим, что всё население использует компьютеры и Интернет, и у каждого человека по 10 паролей. Общее количество существующих паролей – $7 \cdot 10^{10} \approx 2^{36}$.

Имея доступ к наиболее массовым интернет-сервисам с количеством пользователей десятки и сотни миллионов, в которых пароли часто хранятся в открытом виде из-за необходимости обновления ПО и, в частности, выполнения аутентификации, мы:

  1. имеем базу паролей существенной части пользователей сети Интернет;
  2. можем статистически построить правила генерирования паролей.

Даже если пароль хранится в защищённом виде, то при вводе, как правило, он в открытом для сервиса виде пересылается по Интернету, и все преобразования пароля для аутентификации осуществляет интернет-сервис, а не веб-браузер. Следовательно, интернет-сервис периодически имеет доступ к исходному паролю.

В 2002 г. был подобран ключ для 64-битного блочного шифра RC5 сетью персональных компьютеров distributed.net, выполнявших вычисления в фоновом режиме. Суммарное время вычислений всех компьютеров – 1757 дней, было проверено 83 пространства всех ключей. Это означает, что пароли с оценочной энтропией менее 64 бит, то есть все пароли до 40 символов по критериям NIST, могут быть подобраны в настоящее время. Конечно, с оговорками на то, что 1) нет ограничений на количество и частоту попыток аутентификаций, 2) алгоритм генерации вероятных паролей эффективен.

Строго говоря, использование даже 40-символьного пароля для аутентификации или в качестве ключа блочного шифрования является небезопасным.

Число паролей

Приведём различные оценки числа паролей, выбираемых людьми. Чаще всего такие пароли основаны на словах или закономерностях естественного языка. В английском языке всего около $1\ 000\ 000 \approx 2^{20}$ слов, включая термины.

Используемые слоги английского языка имеют вид V, CV, VC, CVV, VCC, CVC, CCV, CVCC, CVCCC, CCVCC, CCCVCC, где C – согласная (consonant), V – гласная (vowel). 70 слогов имеют структуру VC или CVC. Общее число слогов $S = 8000 \dots 12000$. Средняя длина слога – 3 буквы.

Предполагая равновероятное распределение слогов английского языка, для числа паролей из $r$ слогов получим верхнюю оценку

$$ N_1 = S^r = 2^{13 r} \approx 2^{4.3 L_1}. $$

Средняя длина паролей составит:

$$ L_1 \approx 3 r. $$

Теперь предположим, что пароли могут состоять только из 2--3 буквенных слогов вида CV, VC, CVV, VCC, CVC, CCV с равновероятным распределением символов. Подсчитаем число паролей $N_2$, которые могут быть построены из $r$ таких слогов. В английском алфавите число гласных букв $n_v = 10$, согласных $n_c = 16$, $n = n_v + n_c = 26$. Верхняя оценка числа $r$-слоговых паролей:

$$ N_2 = (n_c n_v + n_v n_c + n_c n_v n_v + n_v n_c n_c + n_c n_v n_c + n_c n_c n_v)^r \approx $$
$$ \approx \left( n_c n_v(3 n_c + n_v) \right)^r, $$
$$ N_2 \approx \left( \frac{n^3}{2} \right)^r \approx 2^{13 r} \approx 2^{4.3 L_2}. $$

Средняя длина паролей:

$$ L_2 = \frac{n_c n_v(2 + 2 + 3 n_v + 3 n_c + 3 n_c + 3 n_c)}{n_c n_v (1 + 1 + n_v + n_c + n_c + n_c)} \cdot r \approx 3 r. $$

Как видно, в обоих предположениях получились одинаковые оценки для числа и длины паролей.

Подсчитаем верхние оценки числа паролей из $L$ символов, предполагая равномерное распределение символов из алфавита мощностью $D$ символов: a) $D_1 = 26$ строчных букв, б) все $D_2 = 94$ печатных символа клавиатуры (латиница и небуквенные символы):

$$ N_3 = D_1^L \approx 2^{4.7 L}, $$
$$ N_4 = D_2^L \approx 2^{6.6 L}. $$
1.25
1.5cmДлина пароляЧисло паролей
2cmНа основе слоговой композиции2cmАлфавит $D=26$ символов2cmАлфавит $D=94$ символа
3.5ex
6$2^{26}$$2^{28}$$2^{39}$
9$2^{39}$$2^{42}$$2^{59}$
12$2^{52}$$2^{56}$$2^{79}$
15$2^{65}$$2^{71}$$2^{98}$
21$2^{91}$$2^{99}$$2^{137}$
39$2^{169}$$2^{183}$$2^{256}$
Таблица 14.2 — Различные верхние оценки числа паролей

Из таблицы [tab:password-number] видно, что при доступном объёме вычислений в $2^{60}$ – $2^{70}$ операций, пароли вплоть до 15-ти символов, построенные на словах, слогах, изменениях слов, вставках цифр, небольшом изменении регистров и других простейших модификациях, в настоящее время могут быть найдены полным перебором как на вычислительном кластере, так и на персональном компьютере.

Для достижения криптостойкости паролей, сравнимой со 128- или 256-битовым секретным ключом, требуется выбирать пароль из 20 и 40 символов соответственно, что, как правило, не реализуется из-за сложности запоминания и возможных ошибок при вводе.

Атака для подбора паролей и ключей шифрования

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

Для нахождения пароля, прообраза хеш-функции, или для нахождения ключа блочного шифрования по атаке с выбранным шифртекстом (для одного и того же известного открытого текста и соответствующего шифртекста) может быть применён метод перебора с балансом между памятью и временем вычислений. Самый быстрый метод радужных таблиц (англ. rainbow tables, 2003 г., [82]) заранее вычисляет следующие цепочки и хранит результат в памяти.

Для нахождения пароля, прообраза хеш-функции $H$, цепочка строится как

$$ M_0 \xrightarrow{H(M_0)} h_0 \xrightarrow{R_0(h_0)} M_1 \ldots M_t \xrightarrow{H(M_t)} h_t \xrightarrow{R_t(h_t)} M_{t+1}, $$

где $R_i(h)$ – функция редуцирования, преобразования хеша в пароль для следующего хеширования.

Для нахождения ключа блочного шифрования для одного и того же известного открытого текста $M$ таблица строится как

$$ K_0 \xrightarrow{E_{K_0}(M)} c_0 \xrightarrow{R_0(c_0)} K_1 \ldots K_t \xrightarrow{E_{K_t}(M)} c_t \xrightarrow{R_t(c_t)} K_{t+1}, $$

где $R_i(c)$ – функция редуцирования, преобразования шифртекста в новый ключ.

Функция редуцирования $R_i$ зависит от номера итерации, чтобы избежать дублирующихся подцепочек, которые возникают в случае коллизий между значениями в разных цепочках в разных итерациях, если $R$ постоянна. Радужная таблица размера $(m \times 2)$ состоит из строк $(M_{0,j}, M_{t+1,j})$ или $(K_{0,j}, K_{t+1,j})$, вычисленных для разных значений стартовых паролей $M_{0,j}$ или $K_{0,j}$ соответственно.

Опишем атаку на примере нахождения прообраза $\overline{M}$ хеша $\overline{h} = H(\overline{M})$. На первой итерации исходный хеш $\overline{h}$ редуцируется в сообщение $\overline{h} \xrightarrow{R_t(\overline{h})} \overline{M}_{t+1} $ и сравнивается со всеми значениями последнего столбца $M_{t+1,j}$ таблицы. Если нет совпадения, переходим ко второй итерации. Хеш $\overline{h}$ дважды редуцируется в сообщение $\overline{h} \xrightarrow{R_{t-1}(\overline{h})} \overline{M}_t \xrightarrow{H(\overline{M}_t)} \overline{h}_t \xrightarrow{R_t(\overline{h}_t)} \overline{M}_{t+1}$ и сравнивается со всеми значениями последнего столбца $M_{t+1,j}$ таблицы. Если не совпало, то переходим к третьей итерации и т. д. Если для $r$-кратного редуцирования сообщение $\overline{M}_{t+1}$ содержится в таблице во втором столбце, то из совпавшей строки берётся $M_{0,j}$, и вся цепочка пробегается заново для поиска искомого сообщения $\overline{M}: ~ \overline{h} = H(\overline{M})$.

Найдём вероятность нахождения пароля в таблице. Пусть мощность множества всех паролей равна $N$. Изначально в столбце $M_{0,j}$ содержится $m_0 = m$ различных паролей. Предполагая наличие случайного отображения с пересечениями паролей $M_{0,j} \rightarrow M_{1,j}$, в $M_{1,j}$ будет $m_1$ различных паролей. Согласно задаче о размещении,

$$ m_{i+1} = N \left( 1 - \left( 1 - \frac{1}{N} \right)^{m_i} \right) \approx N \left( 1 - e^{-\frac{m_i}{N}} \right). $$

Вероятность нахождения пароля:

$$ P = 1 - \prod \limits_{i=1}^t \left( 1 - \frac{m_i}{N} \right). $$

Чем больше таблица из $m$ строк, тем больше шансов найти пароль или ключ, выполнив в наихудшем случае $O \left( m \frac{t(t+1)}{2} \right)$ операций.

Примеры применения атаки на хеш-функциях $\textrm{MD5}$, $\textrm{LM}$ (т. е. $\textrm{DES}_{\textrm{Password}} (\textrm{const})$) приведены в таблице [tab:rainbow-tables].

1cmДлина, битыПароль или ключРадужная таблица
1.0cmДлина, симв.МножествоМощностьОбъём1.7cmВремя вычисления таблиц1.1cmВремя поиска
2ex
Хеш LM
 A–Z$2^{33}$610 MB1.7cmнесколько лет6 с
$2 \times 56$14A–Z, 0-9$2^{36}$3 GB15 с
 все$2^{43}$64 GB7 мин
Хеш MD5
0pt2.5ex 1288A-Z, 0-9$2^{41}$36 GiB-4 мин
Таблица 14.3 — Атаки на радужных таблицах на одном ПК