ПРИКЛАДНАЯ ИНФОРМАТИКА / JOURNAL OF APPLIED INFORMATICS
[ Vol. 11. No. 6 (66). 2016 ] _
М. А. Стюгин, канд. техн. наук, ФГАОУ ВО «Сибирский федеральный университет»,
г. Красноярск, [email protected]
Метод аутентификации с использованием
»» Л
динамических ключей1
Многоразовые пароли — самый популярный способ аутентификации на сегодняшний день, однако при этом — самый небезопасный. В данной работе представлен метод аутентификации с использованием многоразовых паролей, существенно усложняющий реализацию атак, следствием которых является получение информации, достаточной для подбора паролей. Суть метода — «размывание» пароля пользователя на множестве узлов в сети.
Ключевые слова: аутентификация, многоразовые пароли, хеш-функция, хранение пароля, разделение секрета.
Введение
Данное исследование посвящено одной из наиболее насущных тем в области информационной безопасности — сохранности паролей пользователей от утечки с удаленных сервисов. С компрометацией паролей сталкивался практически каждый пользователь Интернета. Для защиты паролей от кражи непосредственно с базы данных ресурсов используют однонаправленные криптографические хеш-функции. Используя полученный хеш, мы не можем получить исходный пароль путем вычислений. Однако, используя хеш, возможно подобрать пароль, и это создает потенциальную уязвимость. Для того чтобы максимально усложнить процесс подбора, используются различные методы, которые можно обозначить тремя основными направлениями.
1. Использование хеш-функций, требующих большего вычислительного ресурса и большего объема памяти. Это требует от злоумышленника больших временных затрат на перебор паролей.
1 Работа поддержана грантом Президента Российской Федерации МК-5025.2016.9.
2. Использование «соли», добавляемой к тексту пароля до вычисления хеша. Применение «соли» затрудняет массовый подбор паролей с использованием одной хеш-функции и вынуждает подбирать каждый пароль в отдельности.
3. Использование паролей с высокой энтропией. Пароли с низкой энтропией быстро подбираются «по словарю» в соответствии с многочисленными правилами компоновки и преобразования. Высокоэнтропийные пароли, состоящие из случайной комбинации символов и знаков, не дают какой-либо информации, определяющей пространство перебора, и вынуждают злоумышленника проводить тотальный перебор всех комбинаций.
Применение всех перечисленных методов не обеспечивает приемлемой защиты, кроме того, создает дополнительные неудобства для пользователей и дополнительную нагрузку на вычислительные ресурсы.
В данной работе мы представим метод аутентификации с использованием многоразового пароля, позволяющий не опираться на стойкость хеш-функций или шифрования паролей. Реализация предложенной технологии — алгоритм DKAuth. Сам проект является открытым и выложен на сайте
dkauth.com, где можно скачать исходные коды приложения или подключиться к сети генерации динамических ключей. Каждый новый узел в сети обеспечивает большую защищенность хранимых в системе аккаунтов.
Обзор исследований
Аутентификация — одна из самых горячих тем в области информационной безопасности. Каждый год появляется огромное количество работ, связанных с новыми типами атак, методов и техник аутентификации. Однако, несмотря на это, парольная аутентификация остается самым простым и повсеместно используемым способом аутентификации. Более 98% сайтов в Интернете не предлагают никаких других способов аутентификации, кроме многоразовых паролей.
В последнее время появилось много решений в области одноразовых паролей для аутентификации на различных сервисах. Существует множество модификаций технологии использования одноразовых паролей, позволяющих противостоять атакам типа «мсп-in-the-Middle» [1], replay attack [2] и stolen-verifier attack [3]. Подобные решения позволяют обесценить передаваемую пользователем во время аутентификации информацию. В результате перехват или повторение передаваемой информации не приводит к компрометации системы. В этом же направлении можно привести системы аутентификации, построенные на основе zero-knowledge proof [4-6]. Существуют и более новые модификации таких решений, например использование не только одноразового пароля, но и одноразового ID пользователя [7]. Однако подобные решения распространены значительно реже.
Все перечисленные атаки направлены на компрометацию аккаунтов отдельных пользователей с использованием канала передачи данных. Для большей ясности обозначим их как атаки класса A. Другой класс атак (класс B) — непосредственная утечка данных с места хранения паролей. Данная атака имеет
наиболее катастрофические последствия как для пользователей, так и для владельцев сервисов. От нее не защищены как мелкие, так и высоконагруженные сервисы. В этом году стало известно об утечке базы аккаунтов даже с сервисов, изначально предназначенных для хранения паролей и заявляющих об их защищенности [8]. В отличие от предыдущего класса атак набор методов защиты здесь более ограничен. Общепринятый метод защиты в этом направлении — шифрование паролей или хранение с использованием однонаправленных криптографических хеш-функций. Шифрование применяется достаточно редко, поскольку оно решает проблему хранения одной критичной информации за счет использования другой критичной информации (ключа шифрования). Если злоумышленник получает ключ шифрования, то он получает всю таблицу паролей пользователей.
Аналогичные проблемы и при использовании хеш-функций. Если у злоумышленника есть хеш пароля, то он может в off-line режиме сам подобрать пароль. Чтобы сделать этот процесс более ресурсозатратным, применяются стойкие криптографические хеш-функции, «соль» и запрет на пароли с низкой энтропией. Однако ни один из перечисленных методов не может обеспечить защиту паролей от компрометации с учетом постоянно растущих вычислительных мощностей. Кроме того, криптографические хеш-функции также обладают множеством уязвимостей, ускоряющих процесс перебора [9-11]. Для повышения стойкости хешей к перебору применяют повышенную вычислительную нагрузку в виде многократных итераций самих хеш-функций либо использования дополнительной нагрузки на память — мemory-demanding password scrambling [12]. Все эти методы, так же как и новые криптостойкие хеш-функции типа bcrypt или scrypt, требуют большого вычислительного ресурса, поэтому оправданно редко используются в реальных системах. В работе [13] было предложено использовать как компромисс вычислитель-
[ 109 ]
ный ресурс, затраченный на генерацию хешей, не бесполезно, а для решения полезных задач, например дискретное логарифмирование или факторизация больших чисел.
В данной работе предложено решение динамической аутентификации для защиты паролей от их утечки с веб-ресурсов (атаки класса B), позволяющее не опираться на стойкость хеш-функции. Данное решение никак не затрагивает атаки класса A, такие как перехват паролей, men-in-the-middle и пр. Для защиты от этого класса атак одновременно с динамической аутентификацией могут применяться методы многофакторной аутентификации, одноразовые пароли и пр.
Схема аутентификации с динамическим ключом
Основная цель технологии — защита паролей от подбора. В процессе подбора создается гипотеза относительно возможного варианта пароля, затем вычисляются определенные переменные системы и сравниваются с искомыми. Чтобы подбор был невозможен, необходимо, чтобы система не содержала «переменных», достаточных для проверки «гипотезы».
В классической схеме хранения пароля пароль p преобразуется в значение y с использованием хеш-функции h. При проверке пароль p' преобразуется в значение у' с использованием той же хеш-функции и осуществляется сравнение у == у' (здесь и далее «==» — проверка переменных на равенство). h
Geny: p ^ у,у ^ storage. h
Check: p' ^ у', у == у'.
В нашем случае мы добавляем к этому еще одно преобразование — функцию/ преобразующую хеш пароля в значение z.
h f
Geny : p ^ y ^ z, z ^ storage.
hf
Check: p ' ^ y ' ^ z ', z == z '.
(1)
Функция f будет «идеально» выполнять свою роль в том случае, если она соответствует условиям идеальных шифров. Данное требование по Шеннону говорит о том, что хранимая переменная z не дает нам абсолютно никакой информации относительно исходного значения у, т. е. Pr (z = Z) = Pr (z = Z | у = Y).
Очевидно, что функция f должна быть уникальна для каждого пароля, иначе знание одного пароля позволило бы восстановить все остальные. Соответственно, данная функция должна иметь динамический параметр (ключ), что и определяет суть рассматриваемой схемы аутентификации как dynamic key authentication (DKAuth).
Необходимо заметить, что в такой схеме хеш-функция h не может быть устранена. Во-первых, на выходе хеш-функции мы всегда получаем удобный формат переменной фиксированной длины, в то время как пароль всегда имеет разную длину. Во-вторых, техническая реализация всегда подразумевает наличие уязвимостей, а хеш-функция будет еще одним рубежом защиты. В дальнейшем при анализе безопасности схемы мы увидим, как сложность подбора конкретного хеша пароля в нашей реализации может быть многократно увеличена даже при компрометации ключевых узлов инфраструктуры.
Существует иной способ проверки паролей в такой схеме, где мы пытаемся восстановить не хранимое значение z, а саму функцию преобразования f.
h f
Geny : p ^ у ^ z, z ^ storage.
h z (2)
Check: p' ^ у' ^ f', f = f'.
Проверка пароля в таком случае осуществляется проверкой, правильно ли была получена функция f. Возможна также частичная проверка, удовлетворяет ли полученная функция f искомым условиям (когда f нам достоверно не известна).
Основная идея следующая — функция f может не храниться на сервере, где хранится значение z. Более того, ее можно вообще
не хранить в каком-то конкретном месте, позволив функции «собираться» во время проверки пароля. Возможно использование разделения секрета по множеству удаленных узлов в сети. Каждый узел хранит данные, не представляющие для него возможности компрометации аккаунтов, поэтому все узлы могут быть недоверенными. Система в целом «знает» информацию, достаточную для проверки конкретных учетных данных пользователя, но каждый узел в отдельности или частичная комбинация узлов не сможет осуществить проверку или подбор паролей.
Обозначим далее S — сервер, который создает и хранит значения паролей г в базе и осуществляет их проверку. В процессе аутентификации сервер нуждается в дополнительной информации (функция /), которая хранится на совокупности удаленных узлов сети. Данные узлы будем называть клиентами.
На рис. 1 показано, что инфраструктура DKAuth состоит из множества узлов. Сервер хранит все учетные данные пользователей, но не хранит функцию преобразования /. Все остальные узлы (клиенты) в совокупности знают функцию /. При варианте проверки (1) сервер на основании идентификатора учетной записи получает от клиентов функцию/. При варианте проверки (2) сервер делает предположения относительно искомой функции и получает от клиентов ответ, правильная она или нет.
Количество клиентов в инфраструктуре меняется. Открытость инфраструктуры предполагает, что любой пользователь может скачать приложение клиента и стать частью сети. Во время создания аккаунта пользователя определенные клиенты, генерирующие функцию f определяются случайным образом. Например, опционально количество клиентов для генерации преобразования может быть равно 10, в то время как общее количество клиентов в сети больше 1000. Чем больше общее количество клиентов в сети, тем более безопасна вся инфраструктура, поскольку взлом одновременно всех узлов или их одновременный сговор становится маловероятен.
Далее мы рассмотрим различные алгоритмы генерации и проверки функции f
Генерация динамического ключа
Чтобы приблизиться к условию абсолютных шифров, где Pr (z = Z) = Pr (z = Z | y = Y), можно использовать общепринятое шифрование one-time pad (шифр Вернама). В таком случае
z = y e k.
Здесь © — операция XOR «исключающее или». В таком случае изменение функции f полностью определяется сменой ключа k. В процессе аутентификации мы получаем
(1)
id
f
S
f'
(2) true/false
C
C
Рис. 1. Инфраструктура DKAuth
Fig. 1. DKAuth Infrastructure
значение г' = у' © k и сравниваем z' == z по схеме (1) либо получаем значение и сравниваем k' = у' © г' по схеме (2).
Ключ k должен быть сформирован цепочкой клиентских узлов таким образом, чтобы каждая составляющая хранила свой «кусочек» ключа.
Последовательный метод генерации ключа
Наиболее очевидное решение разделения секрета — последовательная генерация клиентами ключей ..., kn, каждый из которых побитово равен длине k. Будем обозначать двойной прямой скобкой ||...|| — побитовую длину переменной. Тогда
Параллельный метод генерации ключа
Для решения проблемы последовательной генерации ключа необходимо допустить ситуацию, когда аутентификация может пройти успешно, если какие-то из клиентов недоступны и части ключа не были получены. Рассмотрим другой метод генерации ключа k, используя вместо операции «исключающее или» операцию обычного арифметического умножения.
Допустим, что клиенты генерируют ключи k1, k2, ..., kn, каждый из которых является большим псевдопростым случайным числом. При этом
Ключ k получается в результате их последовательного объединения операцией XOR. При потере хотя бы одного ключа в цепочке (например, в результате отказа узла) становится невозможным вычислить k. В результате невозможно осуществить и проверку пароля.
Общая схема метода:
Gen, : k = k © k2 ©... © k .
k 1 2 n
h
Geny : p ^y, z = y © k, z ^ storage.
h
Check: p' ^ y', z' = y '© k, z == z'.
Данный метод генерации ключа наиболее стойкий к попыткам взлома пароля, поскольку требует взлома (или одновременного сговора) абсолютно всех узлов в цепочке генерации ключа. Если хотя бы одна составляющая ключа не получена — пароль не может быть взломан. С другой стороны, этот метод является и самым ненадежным, поскольку при отказе хотя бы одного клиента легальные пользователи системы не смогут пройти аутентификацию. По аналогии с электрической цепью, в которой при последовательном соединении отказ одного элемента приводит к отключению всех элементов сети, данный метод назовем «последовательным».
llkill = ... = iiknii = ||k||/n.
Ключ k получаем простым арифметическим перемножением ключей, полученных от клиентов. В процесс аутентификации сервер вычисляет предполагаемый ключ k' и проверяет, являются ли отдельные ключи клиентов его делителями.
Общая схема метода:
Genk: k = k1 ■ k2 ■...• kn.
h
Geny : p ^ y, z = y © k, z ^ storage.
h
Check: p y', k' = y' © z, k' / = k1, k'/ = k2, ..., k'/ = kn .
Операция «/=» означает проверку, является ли второе число делителем первого, т. е. делится или нет на него без остатка. Очевидное преимущество такого подхода — возможность аутентификации с частичной потерей клиентов в цепочке. Даже одной составляющей ключа kt будет достаточно, чтобы определить, правильно или нет введен пароль. Если, например, ||k|| = 1024 бит, ||kj| = 128 бит и n = 8, то даже при совпадении только одного делителя вероятность ложной аутентификации будет порядка 1/2128. Величиной такой ошибки можно пренебречь. Таким образом, даже одного клиента из 8 будет достаточно, чтобы определить,
правильно ли введен пароль пользователем, хотя ключ k при этом не будет восстановлен. Так же как и в аналогии с последовательной схемой, обозначим данное решение как параллельная схема генерации ключа. Его безусловное преимущество — высокая надежность, выраженная в том, что потеря абсолютно всех составляющих ключа, кроме одной, оставляет систему аутентификации работоспособной. С другой стороны, несмотря на то что ключ k не может быть вычислен, если злоумышленник получает доступ ко всем данным сервера и одному из клиентов в конкретной цепочке ключа, он может запустить процесс подбора пароля. В следующем разделе будет показано, почему перебор даже в такой реализации алгоритма генерации ключа не может быть эффективным.
Необходимо отметить, что классические п) — пороговые схемы разделения секрета наподобие схемы Шамира или Блекли в данном конкретном случае не показали большей эффективности в сравнении с более простым решением, предложенным выше. Это связано с тем, что в нашем случае решение «любые t узлов из п могут восстановить секрет» не более эффективно, чем решение «конкретные t узлов из п могут восстановить секрет». С одной стороны, применение (^ п) — пороговой схемы повышает надежность системы, но одновременно с этим и ослабляет ее безопасность.
Гибридный метод генерации ключа
Описанные здесь методы параллельной и последовательной генерации ключа имеют свои недостатки. Для их элиминации можно применить гибридный метод, сочетающий оба способа аутентификации. В этом случае каждое из простых чисел, используемых в параллельном методе, генерируется несколькими хостами по принципу разделения секрета и его сборкой при помощи операции XOR.
Общая схема метода:
Genk : k = (k/ ©... © km) • (k1 ©... © k2m) •
•... • (k/ ©... © К).
h
Geny : p ^ y, z = y © k, z ^ storage.
h
Check: p y', k ' = y '© z, k'/ = (k/ ©... © kjm),..., k'/ = (k/ ©... © km).
Величину ki = (k/ ©... © k™) будем называть кластером. При этом m — размерность кластера. Это опциональная величина, она оптимизируется согласно вероятности отказа или взлома отдельных клиентских узлов. Очевидно, что чем больше m, тем больше защищенность аккаунтов от компрометации, но слишком большая m может приводить к повышенным ожиданиям времени отклика системы, а также может повысить вероятность отказа. Величина n также является опциональной, но здесь уже при n = 1 система максимально защищена от компрометации, при этом повышена вероятность отказа. Так же как и в случае с параллельной схемой,
1М1 = ... = =
Для того чтобы на выходе каждого кластера получалось простое число, процесс его генерации начинается с конца. То есть сначала генерируем простое число ki, затем генерируем псевдослучайные числа г1, ... г(т-Г) такой же битовой длины. На основе этих данных вычисляем все ключи кластера:
k1 = kJ © г ©... © ги-1;
k2 = 1;
I т = г
Iе2 = Гт-1.
В результате, выполняя операцию XOR над всеми числами в кластере, получаем исходное простое число ^.
При п = 1 получаем последовательную схему генерации ключа, при т = 1 получаем параллельную схему. Если п = 1 и т = 1,
получаем тривиальную схему. Даже при тривиальной схеме получаем значительно большую защищенность от компрометации пароля пользователя, чем в классическом варианте простого использования хеша. Данная характеристика будет более точно оценена в разделе «Анализ защищенности паролей в системе DKAuth».
Динамическая выборка узлов
Представленная инфраструктура хранения паролей состоит из сервера, который хранит шифрованные пароли z и производит аутентификацию на основе получения информации от других удаленных узлов (клиентов) по методам, описанным в предыдущем разделе. Удаленные узлы, служащие для аутентификации конкретного аккаунта, выбираются случайно. Сам по себе взлом сервера не дает какой-либо возможности компрометации аккаунтов, необходимо также взломать какие-либо из клиентов. Чтобы оставить систему максимально защищенной, необходимо решить следующую задачу.
Условие 1. Никакие данные, хранящиеся на сервере, не могут быть использованы для определения конкретных клиентов, хранящих составляющие конкретного динамического ключа.
Условие 2. Никакие данные, хранящиеся на клиенте, не могут быть использованы для определения конкретных аккаунтов на сервере, использующих данный клиент в процессе аутентификации.
Для выполнения Условия 1 можно не хранить идентификатор используемых клиентов, а вычислять их во время процесса аутентификации. Делается это на основе вычисляемого хеша пароля. Результат на выходе такой функции должен всегда давать валидный идентификатор какого-либо клиента. Если идентификатор на выходе будет невалиден в каких-то случаях, это можно использовать в процессе off-line перебора для отбрасывания неподходящих клиентов либо невозмож-[ 114 ]
ных вариантов паролей. Необходимо также учитывать, что список клиентов в системе динамический. То есть пользователи могут скачивать и устанавливать новых клиентов, в то время как старые клиенты могут отключиться, терять соединение и пр.
Решение выглядит следующим образом. На сервере есть таблица всех существующих в системе клиентов, у которых отражено время их появления в системе (in) и выхода из системы (out). Время в системе (T) дискретно и представляет собой целое положительное число. С каждой модификацией системы (добавления или удаления клиента) время инкрементируется на единицу.
Допустим, в момент времени T = 0 у нас есть три клиента, как показано на рис. 2.
Далее через какой-то момент времени из системы пропадает клиент 501aa3b0 и появляется новый клиент 9b31a8ce, как показано на рис. 3.
В момент создания аккаунта вместе со значением z пароля записывается текущее время T. По нему можно восстановить список клиентов, актуальный на момент T. Для этого делаем выборку из таблицы с условием (in < T) and (out > T). Обозначим как num — количество строчек в полученной выборке.
После того как пользователь вводит пароль, делается конкатенация с «солью» и «1» и от полученного значения вычисляется хеш-функция, полученное число берется по модулю num:
hash (passllsoltlll) mod num.
date time node id in out
12-24-2015 12:02:51 8f00e2bc 0
12-24-2015 12:02:51 501aa3b0 0
12-24-2015 12:02:51 f40a3b83 0
Рис. 2. Система в момент T = 0
Fig. 2. The system at time point T = 0
date time node id in out
12-24-2015 12:02:51 8f00e2bc 0
12-24-2015 12:02:51 501aa3b0 0 1 <■■
12-24-2015 12:02:51 f40a3b83 0
12-26-2015 11:34:02 9b31a8ce 2 ■*-
T = 1
T = 2
Рис. 3. Система в момент T = 2
Fig. 3. The system at time point T = 2
Таким образом, мы получаем порядковый номер первого клиента в цепочке генерации ключа. Аналогично генерируется номер второго клиента (hash(pass||so/i||2) mod num) и т. д.
Легко убедиться, что анализ информации на сервере не может привести к определению искомого клиента в цепочке генерации ключа, если мы не знаем пароль. Также невозможен перебор возможных значений пароля по данным таблицы, поскольку на любых входных значениях всегда будем получать валидные идентификаторы клиентов в системе.
Необходимо также отметить, что в таком алгоритме желательно всегда использовать дискретное время T, а не реальное значение даты и времени входа и выхода клиента, поскольку дискретное время существенно сокращает количество выборок и позволяет ке-шировать таблицу. Это многократно уменьшает нагрузку на вычислительный ресурс и память сервера. Таким образом, требования Условия 1 выполнены.
Для выполнения Условия 2 необходимо, чтобы идентификаторы ключа на стороне клиента, использующиеся для сборки его на сервере, невозможно было сопоставить c идентификаторами на сервере. Для этого значение hash(pass||n) из предыдущей операции используем как идентификатор записи клиента и передаем клиенту во время генерации цепочки. При проверке восстанавливаем значение hash(pass||n) и передаем его клиенту.
Если пароль введен верно, то цепочка соберется правильно, и ключ будет восстановлен. Если пароль введен неверно, то ключ будет восстановлен неправильно.
В результате в системе соблюдены оба условия. Если злоумышленник взломал одновременно сервер и часть клиентских узлов, он не может знать, какая именно часть системы была им взломана и будет вынужден осуществлять попытку взлома путем тотального перебора каждого из аккаунтов.
Анализ защищенности паролей в системе йКАи^
В данном разделе сделаем оценку защищенности паролей от компрометации в сравнении с общепринятым хранением паролей в виде хешей. Стоит заметить, что не существует способа получения исходного хеша пароля у путем вычислений, даже при компрометации абсолютно всех узлов в системе вместе с сервером. Исходный хеш у может быть получен только путем перебора.
Обозначим сложность подбора пароля по хеш-функции h как у0.
Тогда двукратное увеличение сложности компрометации пароля по хешу обозначим как 2у0. На практике это можно интерпретировать следующим образом. Например, взломщик имеет один искомый пароль, один хеш, но два варианта соли. Какая из солей верная, он не знает, поэтому вынужден в процессе перебора использовать обе. Таким об-
[ 115 ]
разом, на подбор одного и того же пароля он тратит в два раза больше времени и выполняет в два раза больше операций. В случае аутентификации по методу DKAuth мы имеем единственную «соль» на каждый пароль, но перемешиваем динамические ключи по отношению к аккаунтам. Это обеспечивает мультипликацию сложности перебора. Стоит также обратить внимание, что технология DKAuth никак не ограничивает выбор базовой хеш-функции, что дает возможность взять за у0 максимально возможный показатель современных хеш-функций.
Рассмотрим далее возможные варианты компрометации системы.
Скомпрометирован сервер и все его данные, но не скомпрометирован ни один клиентский узел. Восстановление паролей в таком случае невозможно. Необходимо также отметить, что если скомпрометированы в том числе данные аутентификации самого сервера в системе, в результате чего злоумышленник может обращаться к остальным узлам системы от имени сервера, то в этом случае злоумышленник все равно не сможет скомпрометировать аккаунты пользователей. Это решение будет более подробно рассмотрено в следующем разделе.
Скомпрометированы все или часть клиентских узлов системы, но не скомпрометирован сервер. Так же как и в предыдущем случае, компрометация аккаунтов невозможна, поскольку неизвестны данные г и Т, являющиеся обязательными в процессе аутентификации.
Скомпрометирован сервер со всеми его данными и скомпрометирована часть клиентских узлов. В этом случае какие-то из паролей могут быть скомпрометированы путем подбора. Для оценки этой величины важными параметрами являются величины т — размер кластера и п — длина цепочки в генерации ключа (гибридный метод генерации ключа).
Допустим, в системе t клиентских узлов, из которых tc были скомпрометированы.
Тогда вероятность того, что взломанной части системы будет достаточно для компрометации (подбора) конкретного аккаунта пользователя
P = 1 -
1 -
f ^
\t j
Если в системе Апит аккаунтов, то злоумышленник потенциально может подобрать около АпитРа паролей. Но сложность еще в том, что у злоумышленника нет возможности определить, какую именно часть системы он взломал и какие аккаунты он может подобрать. Единственный способ взлома — исчерпывающий подбор абсолютно всех аккаунтов в системе. В результате сложность подбора каждого из этих АпитРа паролей — не у0, а Рачу0. Приведем оценку этой величины на нескольких практических примерах.
Допустим, в системе t = 1000 узлов. Злоумышленник скомпрометировал сервер и один из узлов. В случае т = 3 и п = 4 коэффициент Ра ~ 4 • 10-9. То есть злоумышленник потенциально может скомпрометировать четыре аккаунта из одного миллиарда записей, при этом сложность подбора каждого будет составлять 2,5 • 108 у0.
Для тривиальной системы (т = 1 и п = 1) при тех же условиях получим Ра ~ 10-3 и сложность подбора одного пароля 103 у0. То есть даже для тривиального случая получаем существенное повышение защищенности паролей от атак класса В.
Рассмотрим случай, когда злоумышленник взломал сервер и 10% всех клиентских узлов со всеми хранящимися данными. Параметры системы t = 1000, tc = 100, т = 3 и п = 4. Для этого случая коэффициент Ра ~ 0,004, т. е. злоумышленник потенциально может подобрать 0,4% паролей пользователей при сложности подбора каждого 250у0. Стоит обратить внимание, что такой исход фактически можно исключить для большой инфраструктуры DKAuth, поскольку взлом
одновременно 10% всех узлов и сервера невозможен. Далее рассмотрим конкретную реализацию технологии DKAuth на примере проекта dkauth.com.
Реализация технологии DKAuth как сервиса аутентификации веб-ресурсов
Практическая реализация DKAuth адаптирована к использованию на веб-ресурсах. Такое направление обусловлено тем, что кража аккаунтов с веб-ресурсов в Интернете — наиболее распространенный случай утечки паролей пользователей. Такие атаки (имеются в виду атаки класса B) катастрофические как для пользователей, так и для владельцев веб-сервисов. Утечка огромного числа паролей непосредственно с веб-ресурса подрывает репутацию сервиса или сайта. Для пользователей, которые нередко применяют один пароль на множество ресурсов, опасность также представляет автоматический взлом их аккаунтов и на других сервисах.
Система построена таким образом, что каждый из владельцев веб-сервисов может не только хранить свои пароли в системе, но и разместить собственный клиентский узел DKAuth на своем сервере. Чем больше клиентских узлов в системе, тем выше ее защищенность, так как снижается вероятность сговора существенной доли клиентов между собой.
Система полностью реализована на протоколе UDP, что позволило увеличить скорость обмена информацией (по сравнению с TCP) и легко выдерживать нагрузку при регистрации миллионов аккаунтов в системе при сравнительно дешевых серверных мощностях. Суммарная вычислительная нагрузка на все клиентские узлы инфраструктуры DKAuth в совокупности примерно в два раза выше, чем нагрузка на сервер. То есть при большом количестве клиентских узлов нагрузка на каждый такой узел
становится незначительной. Все это позволяет расширять инфраструктуру, не приводя новых участников инфраструктуры DKAuth к каким-либо существенным издержкам.
В практической реализации был использован гибридный метод генерации ключа по методу (2), в котором сервер пробует вычислить ключ на основе хеша пароля и проверяет, правильный ли ключ был вычислен (следовательно, введен правильный пароль). При этом клиенты не отдают серверу свои составляющие ключа k1, k2, ..., kn, а получают от сервера предполагаемый ключ k' и проверяют, является ли он делителем kt , полученного по запрошенным данным.
Метод генерации ключа в практической реализации DKAuth немного отличается от описанного в разделе «Генерация динамического ключа» гибридного метода. Это обусловлено результатами моделирования различных вариантов атак на систему. Далее пошагово рассмотрим алгоритм генерации ключа и процесс аутентификации.
Создание аккаунта (смена пароля / смена цепочки в системе):
Genk: k = (k1 ©... © к?) • (k2 ©... © k2m) •... • kn.
h
Geny : p ^ y, z = y © k, z ^ storage.
На первом шаге сервер получает логин и пароль пользователя. Вычисляем хеш пароля с использованием хеш-функции scrypt, на выходе получаем число 1024 бит. По описанному в предыдущем разделе методу динамической выборки узлов получаем идентификаторы нужных клиентов для генерации цепочки простых чисел. Последнее простое число kn сервер генерирует сам и нигде его не хранит. Это сделано для того, чтобы даже при компрометации абсолютно всех узлов в системе вместе с сервером вычислить исходные хеши паролей было невозможно.
Аутентификация пользователя
h
Check: p' ^ y', k' = y' © z, k' ■ bp/ = (k1 ©... © kjm),...,k' ■ bp/ = =(k; ©... © km).
Отличие от описанного ранее метода в том, что сервер отправляет на клиента не проверяемый ключ k', а его арифметическое произведение со случайным большим простым числом bp (bigprime), равным 1024 бит. То есть в результате сервер отправляет на клиента число 2048 бит, которое клиент проверяет на делитель. Это сделано для того, чтобы исключить возможность использования клиентом факторизации для определения всех чисел в цепочке.
В результате тестирования скорости работы системы были получены следующие данные, варьирующиеся от значений n и m (табл. 1, 2).
Таблица 1. Время генерации аккаунта
Table 1. Account generation time
m Затраченное время, с
n = 1 n = 2 n = 4 n = 8 n = 16
1 1,105 1,403 1,926 2,300 2,728
2 1,374 1,590 2,018 2,404 2,879
3 1,610 1,710 2,201 2,501 2,998
Таблица 2. Время проверки (аутентификация)
Table 2. Verification time (authentication)
m Затраченное время, с
n = 1 n = 2 n = 4 n = 8 n = 16
1 0,750 0,810 0,945 1,108 1,381
2 0,873 0,927 1,098 1,197 1,491
3 0,984 1,018 1,152 1,263 1,615
Полученные данные свидетельствуют о том, что технология DKAuth может быть использована в любых высоконагружен-ных веб-ресурсах, не доставляя пользователям каких-либо дополнительных неудобств.
Несомненное удобство для пользователей в том, что нет необходимости придумывать сложные пароли и опасаться, что они будут скомпрометированы. Фактически, если пароль не будет подобран за несколько попыток через форму на сайте, дальнейший подбор будет заблокирован и невозможен. Если сеть узлов DKAuth достаточно большая, то даже ее частичная компрометация не приведет к возможности подбора паролей пользователей в off-line.
Заключение
В данной работе были рассмотрены два класса атак на пароли пользователей. Атаки класса B заключались в утечке паролей пользователей непосредственно с ресурсов их хранения. Как правило, пароли хранятся в виде хешей, полученных с использованием однонаправленных хеш-функций, что не дает возможности вычисления исходного пароля по его хешу. Однако атаки утечки хешей паролей приводят к катастрофическим последствиям из-за возможности быстрого подбора. Метод DKAuth позволяет многократно усложнить для злоумышленника атаки класса B. Теперь пароли пользователей могут быть «размыты» по множеству удаленных ресурсов, и компрометация какой-либо части этих ресурсов не позволяет скомпрометировать пользовательские аккаунты.
Безусловным преимуществом технологии DKAuth является то, что никакие узлы в инфраструктуре не являются доверенными. Сервер может не доверять клиентам. Информация, которую хранят клиенты, сама по себе не позволяет им осуществить какую-либо атаку на пользовательские ак-каунты. Отключение или потеря клиентов также не приводит к потере данных. Сервер может предоставлять сервис аутентификации для нескольких веб-ресурсов. При этом сами веб-ресурсы также не обязаны доверять серверу, отправляя ему на аутентифи-
кацию модифицированные данные, которые не дают какой-либо информации об исходном пароле.
Таким образом, технология DKAuth позволяет смягчить уязвимость самого популярного на сегодняшний день способа аутентификации — использования многоразового пароля. Дополнительное преимущество — возможность использования запоминающихся паролей. Поскольку атаки на подбор в системе DKAuth практически исключены, даже самые простые пароли не будут скомпрометированы.
Список литературы
1. SandirigamaM.,ShimizuA., NodaM. T. Simple and Secure Password Authentication Protocol (Sas) // IEICE Trans. Communications E83 — B. 2000. P. 1363-1365.
2. Lin C. L., Sun H. M., Hwang T. Attacks and Solutions on Strong-Password Authentication // IEICE Trans. Communications E84 — B. 2001. P. 2622-2627.
3. Lin C.-W, Tsai C.-S., HwangM.-S. A New Strong-Password Authentication Scheme Using One-Way Hash Functions // Journal of Computer and Systems Sciences International. 2006. Vol. 45. No. 4. P. 623-626.
4. Ranganathan S., Saravanan R. Password authentication for multicast host using zero knowledge proof // International Journal of Electrical and Computer Engineering. 2015. Vol. 5. No. 6. P. 1468-1471.
5. Datta N. Zero knowledge password authentication protocol // Advances in Intelligent Systems and Computing. 2013. Vol. 203. P. 71-79.
6. Mainanwal V., Gupta M., Upadhayay S. K. Zero knowledge protocol with RSA cryptography algorithm for authentication in web browser login system (Z-RSA) // Proceedings — 2015 5th International Conference on Communication Systems and Network Technologies, CSNT. 2015. P. 776-780.
7. Li TongLiang, Jin ZhiGang. A New Low Cost One Time ID and Password Authentication Protocol Using Popular Removable Storage Devices // Proc. Second International Conference on Intelligent Networks and Intelligent Systems. 2009. P. 213-216.
8. Ragan Steve. LastPass compromise: Here's what you need to know and what you can do. URL: http://www.csoonline.com/article/2936254/data-pro-tection/lastpass-compromise-heres-what-you-need-to-know-and-what-you-can-do.html
9. AndreevaE.,MenninkB.,PreneelB. Open problems in hash function security // Designs, Codes and Cryptography. 2015. Vol. 77. No. 2. P. 611-631.
10. Tatli E. I. Cracking More Password Hashes With Patterns. Information Forensics and Security, IEEE Transactions on. Vol. 10. Issue 8. P. 1656-1665.
11. AlkandariA. A.,Al-ShaikhliI. F.,AlahmadM. A. Cryptographic Hash Function: A High Level View // Proc. International Conference on Informatics and Creative Multimedia (ICICM), 2013. P. 128-134.
12. Forler C., Lucks S., Wenzel J. Memory-demanding password scrambling // Proc. 20th International Conference on the Theory and Application of Cryptolo-gy and Information Security, ASIACRYPT. 2014. P. 289-305.
13. Markus Durmuth. Useful password hashing: how to waste computing cycles with style // Proc. of the 2013 workshop on New security paradigms workshop. 2013. P. 31-40.
References
1. Sandirigama M., Shimizu A., Noda M. T. Simple and Secure Password Authentication Protocol (Sas). IEICE Trans. Communications E83 — B, 2000, pp. 1363-1365.
2. Lin C. L., Sun H. M., Hwang T. Attacks and Solutions on Strong-Password Authentication. IEICE Trans. Communications E84 — B, 2001, pp. 2622-2627.
3. Lin C.-W., Tsai C.-S., and Hwang M.-S. A New Strong-Password Authentication Scheme Using OneWay Hash Functions. Journal of Computer and Systems Sciences International, 2006, vol. 45, no. 4, pp. 623-626.
4. Ranganathan S., Saravanan R. Password authentication for multicast host using zero knowledge proof. International Journal of Electrical and Computer Engineering, 2015, vol. 5, no. 6, pp. 1468-1471.
5. Datta N. Zero knowledge password authentication protocol. Advances in Intelligent Systems and Computing, 2013, vol. 203, pp. 71-79.
6. Mainanwal V., Gupta M., Upadhayay S. K. Zero knowledge protocol with RSA cryptography algorithm for authentication in web browser login system (Z-RSA). Proceedings — 2015 5th International Conference on Communication Systems and Network Technologies, CSNT, 2015, pp. 776-780.
7. Li TongLiang, Jin ZhiGang. A New Low Cost One Time ID and Password Authentication Protocol Using Popular Removable Storage Devices. Proc. Second International Conference on Intelligent Networks and Intelligent Systems, 2009, pp. 213-216.
8. Steve Ragan. LastPass compromise: Here's what you need to know and what you can do. Available at: http://www.csoonline.com/article/2936254/data-pro-tection/lastpass-compromise-heres-what-you-need-to-know-and-what-you-can-do.html
9. Andreeva E., Mennink B., Preneel B. Open problems in hash function security. Designs, Codes and Cryptography, 2015, vol. 77, no. 2, pp. 611-631.
10. Tatli E. I. Cracking More Password Hashes With Patterns. Information Forensics and Security, IEEE Transactions on, vol. 10, issue 8, pp. 1656-1665.
11. Alkandari A. A., Al-Shaikhli I. F., Alahmad M. A. Cryptographic Hash Function: A High Level View. Proc. International Conference on Infor-
matics and Creative Multimedia (ICICM), 2013, pp. 128-134.
12. Forler C., Lucks S., Wenzel J. Memory-demanding password scrambling. Proc. 20th International Conference on the Theory and Application of Cryptology and Information Security, ASIACRYPT, 2014, pp. 289-305.
13. Markus Durmuth. Useful password hashing: how to waste computing cycles with style. Proc. of the 2013 workshop on New security paradigms workshop, 2013, pp. 31-40.
M. Styugin, Siberian Federal University, Krasnoyarsk, Russia, [email protected]
Password authentication with implementation of dynamic keys1
Authentication still remains one of the major problems in information security. There is a large number of solutions aimed at providing security of authentication. Some of the solutions are intended to ensure that authentication data are impossible to be compromised by accessing the transfer channel for authentication data (class A attacks). Other types of security methods protect authentication data in their storage (class B attacks). Authentication by username and password is currently the most widely used authentication method. Passwords are stored on a server with implementation of one-way hash functions. Password hash can be cracked by brute force enumeration, which allows successful class B attacks. The paper presents a password identification method, which does not involve storing passwords in one centralized place. Passwords are split in many parts that are stored on separate computers on the Internet. Assuming that one or several computers of such network are compromised it will not result in disclosure of any useful authentication data. Hence, remote nodes may be untrusted and all internet users can become participants of the data exchange. The solution presented in this paper provides a multiple increase of user password security against class B attacks even should an adversary succeed in cracking the server and a part of the network nodes. DKAuth is the practical implementation of the presented technology. The above solutions were tested as an authentication service. The data obtained evidence that the DKAuth Protocol can be used even in applications with high operation loads.
Keywords: authentication, hash functions, passwords, password storage, secret sharing.
About authors:
M. Styugin, PhD in Technique For citation:
Styugin M. Password authentication with implementation of dynamic keys. Prikladnaya Informatika — Journal of Applied Informatics, 2016, vol. 11, no. 6 (66), pp. 108-120 (in Russian).
1 This work was supported the grant of President of Russian Federation MK-5025.2016.9 [ 120 ]