Пароли и стойкость
08.03.2018
Пароли, которые мы выбираем. #
В современном информационном обществе каждый человек хоть раз сталкивался с понятием пароль. У некоторых их десятки, а кто-то слышал про пароли из фильмов о шпионах. Попробуем разобраться в значении данного понятия.
Само слово пароль, скорее всего, произошло от французского слова parole, которое означает “слово, речь”. Словарь Даля определят слово пароль как военное слово, передаваемое при вечерней заре на сутки часовым, для оклика и допроса проходящих за черту, пропускаются лишь знающие пароль.
С тех пор фактическое определение слова пароль не изменилось и основным его значением является простейшее средство аутентификации. Пароль является тем секретом, обладание (знание) которого зачастую определяет верность аутентификации перед кем-либо.
На сегодняшний день более-менее активный пользователь информационных ресурсов должен заботиться о хранении или запоминании десятка паролей. Начиная от пинов к телефонам и кредитным картам и заканчивая паролям к банковским сейфам и рабочими архивами с документами.
Для пользователей различных ресурсов вопрос выбора паролей зависит от политики безопасности и требований к паролю этого самого ресурса. Примером являются пины к SIM-картам, которые имеют определенную структуру в виде 4-х цифровых символов. Администраторы некоторых ресурсов самостоятельно генерируют пароли и навязывают их пользователю. Такое решение имеет как плюсы, поскольку оно гарантирует качество выработанного пароля, однако есть и минусы. Прежде всего, это сложность запоминания навязанного пароля для пользователя и, как следствие, опасность того, что пользователь напишет этот сложный пароль в легко доступном месте и, тем самым, сведет на нет все достоинство сложного и качественного пароля. Вторым минусом является недоверие пользователя программе выработки пароля или тому, что данный пароль может быть известен администраторам самого ресурса, поскольку именно они контролируют программу выработки пароля.
Вторым возможным решением для администрации является предоставление свободы выбора пароля пользователям в рамках некоторых требований к размеру и виду пароля. В этом случае пользователь вынужден самостоятельно вырабатывать пароль. Приведем ряд правил, соблюдение которых позволит повысить безопасность ваших паролей.
-
Не используйте одинаковые пароли для различных ресурсов. Данное решение, конечно, существенно упрощает задачу запоминания пароля, однако в случае компрометации этого пароля под удар могут попасть все ваши данные на защищенных ресурсах. К сожалению, подобная схема выработки пароля очень распространена среди пользователей, которые вынуждены регистрироваться на большом количестве самых разнообразных сайтов. При этом, существует большой риск столкнуться с нечестными владельцами тех или иных ресурсов, которые могут использовать введенный вами пароль в корыстных целях.
-
Не используйте распространенные последовательности в качестве паролей, например “123456” или “qwerty”. Так же рекомендуется, чтобы ваш пароль не являлся словом русского или любого другого распространенного языка.
-
Не используйте персональную информацию в качестве элементов пароля. Дни рождения, номера и модели машин и прочая подобная информация может быть легко получена людьми, которые знают вас.
-
Популярным средством повышения стойкости пароля является использованием написание русских слов в латинской раскладке клавиатуры. Следует понимать, что данная мера крайне слабо повышает защищенность пароля, т.к. злоумышленники прекрасно знают о таком способе.
Мы привели признаки плохих паролей, однако открытым остался вопрос о выборе качественного пароля. Если у пользователя стоит задача получить пароль, который ему необходимо постоянно помнить, то можно применить, следующий способ. Использовать в качестве шаблона некоторую популярную, а главное хорошо известную для себя фразу, типа “Красная армия всех сильней”. Далее разработать и запомнить правила выбора букв из этой фразы, например: “все четные”. В результате получается пароль “рсаамясхиье”, при необходимости можно перевести пароль в латинские символы, используя латинскую раскладку клавиатуры. Данный способ позволит существенно повысит стойкость пароля к возможному подбору по словарю. Более подробна о методах взлома и перебора паролей будет сказано ниже. Следующим способом получения качественного пароля является использование специальных генераторов. Данные генераторы можно легко написать самому на любом языке программирования, а можно воспользоваться готовыми (например, http://exogens.ru/produkty/generator-parolej/ ). Далее основная задача пользователя запомнить этот пароль, поскольку он будет выглядеть например так: “Ka7hw6W2”. Тут можно посоветовать только одно решение - использовать защищенное хранилище паролей. В этом случае вам необходимо помнить только один главный пароль к хранилищу. Существует множество подобных программ как платных, так и бесплатных. Например, SecureWallet, ну или 1Password. Есть варианты под смартфоны и КПК, так что соответствующую программу вы найдете легко. Существует еще онлайновый сервис по хранению паролей. C одной стороны это очень удобно, с другой стороны встает большой вопрос о доверии этому сервису.
Все переборы да переборы… #
Для того, чтобы научиться выбирать качественный пароль необходимо хорошо знать основные методы взлома парольной защиты. Рассмотрим вопрос перебора паролей, т.к. именно данный метод является самым распространенным методом получения чужого пароля . Прежде всего для организации перебора нужно определить функцию проверки верности пароля. В некоторых случаях взломщику доступен хэш-код от пароля и злоумышленник способен осуществлять перебор на своих вычислительных мощностях, а иногда есть возможность проверять пароль только непосредственно на самом ресурсе.
Хранение паролей в виде хэш-кодов является одним из самых распространенных методов хранения паролей в различных ОС и программах. Более подробно о хранении паролей будет сказано ниже. Если злоумышленник знает, какая хэш-функция использовалась, то это существенно упрощает задачу. Перебор можно осуществлять полный, т.е. использовать все доступные последовательности символов, а можно по словарю. В случае полного перебора злоумышленнику, используя знание максимального размер пароля n и число возможных символов пароля M, необходимо попробовать Mn вариантов.
Скорость перебора паролей на современных вычислительных машинах очень разная и зависит от многих факторов, прежде всего от производительности и алгоритма хэширования или шифрования пароля. Для “продвинутого” персонального компьютера и “обычного” алгоритма хэширование скорость составляет около 105-106 паролей в секунду. Для кластеров с применением технологий типа nVidia CUDA на 4x GeForce GTX295 скорость для перебора паролей MD5 может достигать 107 паролей в секунду и выше. Таким образом, если ваш пароль занимает 6 символов в латинском цифро-буквенном алфавите (52 символа) при скорости перебора 1000000 паролей в секунду, ваш пароль будет найден за (52^6)/1000000/3600 = 5 часов. А пароль из 10 символов уже за 458 лет. Следовательно, достаточно стойкими к подобному перебору паролями можно считаться пароли с длинной более 8 символов. Перебор по словарю занимает существенно меньше времени, однако, при этом, нет гарантий, что пароль будет найден. В то же время статистика сети Интернет показывает, что пользователи разных стран очень часто выбирают очень слабые, а главное одинаковые пароли. В этом случае злоумышленнику нужен создать качественный словарь возможных пароле. Обычно помимо самых распространенных паролей подобные словари содержать просто слова на разных языках мира, включая варианты использования различных раскладок клавиатуры. В Интернете существует огромное количество подобных словарей. Например, на различных сайтах представлены словари как русских так и английских слов, есть словари русских слов набранные в латинской раскладке.
Что касается собственно программ для перебора паролей, то и здесь можно воспользоваться готовыми решениями. Некоторые сервисы позволяет подобрать слова, если в качестве функции хэширования использовалась функция MD5 или SHA1. Последний сайт является аналогом проекта RainbowCrack о котором нужно сказать отдельно.
Поиск с использованием радужных таблиц (rainbow tables) является промежуточным вариантом между поиском по словарю и полному перебору. Данный метод основан на классическом для криптографии принципе компромисса между временем и данными (time-memmory trade-off). Согласно данному принципу существует возможность уменьшать трудоемкость выполнения некоторого алгоритма, увеличивая объем памяти, занятой под предварительные вычисления и наоборот. Следуя данному принципу, есть возможность существенно уменьшить время перебора хэшированных паролей путем построения радужных таблиц. Данные таблицы строятся с помощью цепочек последовательного применения хэш-функции. При этом в таблицу записывается только первое и последние значения. Таблицы сортируются, и, далее, с помощью бинарного поиска и некоторых дополнительных действий осуществляется поиск принадлежности искомого хэш-кода к той или иной цепочки. Проект http://project-rainbowcrack.com/ содержит большое число подобных таблиц для основных функций хэширования.
Заметим, что если пароли храняться в хэшированном виде с использованием соли(salt) - некоторого случайного вектора, то использование предварительно вычисленных словарей и радужных таблиц невозможно.
Рассмотри вопрос хранения паролей в основных программах и операционных системах (ОС). Начнем с unix-подобных ОС (Solaris, BSD, Linux).
В этих ОС используется хэширование паролей с применение случайного вектора - соли. Обычно данные учетных записей хранятся в двух файлах: /etc/passwd и /etc/shadow. Файл passwd содержит имя пользователя, его числовой идентификатор (User ID, UID) и домашнюю директорию, но (вопреки названию) пароля в нем нет. Пароль записан в файле /etc/shadow. Для BSD систем используется немного другой принцип (используется /etc/spwd.db и /etc/master.passwd), но в целом отличия не существенны. В зависимости от unix-системы в качестве хэш-функции в основном используются:
- функция crypt() - самый старый вариант функции хэшироания, основанной на алгоритме DES;
- функция MD5() - наиболее популярное решение для хранения паролей;
- функция Blowfish() (точнее, хэш-функция, построенная на основе алгоритма Blowfish), генерирующий 60-символьный хэш. С учетом последних работ по анализу функции хэширования MD5 современные дистрибутивы ОС реже используют функцию МD5, отдавая предпочтение функции Blowfish или SHA-2.
Как мы уже говорили, соль - случайный вектор, который генерируется для каждого пользователя, присоединяется к паролю и хэшируется вмести с ним. Соль хранится вместе с хэш-кодом пароля в открытом виде. Если в качестве функции хэширования используется MD5, то файл /etc/shadow будет содержать примерно следующие записи: $1$Ue1yZO5i$.6G/4l1AYliPdkTh1AkBi/ Здесь восемь символов после $1$ — соль, а 22 символа после последнего “$”— хэш-код.
Что касается собственно пароля, то unix-подобные системы содержат разнообразные средства контроля качества. В зависимости от настроек и желания администратора пароль пользователя может быть как нулевым, так и самым сложным, вплоть до навязанного принудительно.
Далее рассмотрим хранение паролей в ОС семейства Windows. Информация об учетных записях пользователей Windows хранится в ветке “HKEY_LOCAL_MACHINESAM” (SAM - Security Account Manager) системного реестра. А так как в Windows 2000/XP все ветки реестра “физически” расположены на диске в каталоге %SystemRoot%System32Config в нескольких файлах, то и эта ветка - не исключение. Она располагается в файле SAM. Отметим, что этот файл по умолчанию недоступен для чтения никому, даже Администратору, но все-таки к нему можно получить доступ (например, с помощью программ, типа SAMInside ).
Windows 2000/XP хранит пароли также как unix-системы в виде хэш-кодов. Эти хэш-коды хранятся в двоичном виде в SAM-файле, т.е. обычным текстовым редактором этот файл не откроешь. Среди сложной структуры SAM-файла нам интересна структура, называемая V-блок. Она имеет размер 32 байта и содержит в себе хэш-код от пароля для локального входа - NT Hash длиной 16 байт, а также хэш-код, используемый при аутентификации доступа к общим ресурсам других компьютеров - LanMan Hash или просто LM Hash, длиной также 16 байт. Алгоритмы формирования этих хэш-функций следующие: Формирование NT Hash:
- Пароль пользователя преобразуется в Unicode-строку.
- Генерируется хэш-код на основе данной строки с использованием алгоритма MD4.
- Полученный хэш-код шифруется алгоритмом DES, причем в качестве ключа используется RID (т.е. идентификатор пользователя). Это необходимо для того, чтобы два пользователя с одинаковыми паролями имели разные хэш-коды. Все пользователи имеют разные RID-ы (RID встроенной учетной записи Администратора равен 500, встроенной учетной записи Гостя равен 501, а все остальные пользователи последовательно получают RID-ы, равные 1000, 1001, 1002 и т.д.).
Формирование LM Hash:
- Пароль пользователя преобразуется в верхний регистр и дополняется нулями до длины 14 байт.
- Полученная строка делится на две половинки по 7 байт и каждая из них по отдельности шифруется алгоритмом DES, на выходе которого получаем 8-байтный хэш-код - в сумме же имеем один хэш-код длиной 16 байт.
- Далее LM Hash дополнительно шифруется так же, как и в шаге 3 формирования NT Hash.
Для повышения безопасности хранения паролей, начиная с 3-го Service Pack’a в Windows NT (и во всех последующих NT-системах, вплоть до Windows 2003), полученные хэш-коды дополнительно шифруются еще одним алгоритмом с помощью утилиты syskey. Т.е. к вышеописанным алгоритмам добавляется еще 4-й шаг - получение с помощью syskey нового хэш-кода от хэш-кода, полученного на шаге 3.
Таким образом в обоих системах существует практически одинаковая система хранения паролей с использованием хэш-функций и применения некоторого случайного или секретного вектора (salt в unix и syskey в Windows).
Рассмотрим далее вопрос о парольной защите распространенных офисных программ: MS Word и защиту pdf-документов.
Защита файлов MS Word с помощью пароля имеет несколько уровней. Это защита от записи и изменения и защита от открытия файла. Первый тип защиты является наименее стойкий, что вообщем понятно - увидеть содержимое можно и так. В этом случае пароль хранится в самом файле в открытом виде либо в виде хэш-кода, размером 32 бита. В любом случае, с помощью любого hex-редактора можно этот пароль достать и затем перебрать.
Защита doc-файлов от открытия более стойкая. В этом случае содержимое файла зашифровано алгоритмом RC4. При этом ключ шифрования, который получен из пароля храниться в самом файле в хэшированном виде. Размер ключа шифрования существенно зависит от версии программы. До версии MS Office 2000 вне зависимости от размера пароля ключ шифрования был размером 40 бит, что позволяет осуществить перебор. Начиная с версии 2003, существует возможность увеличить размер ключа до 128 бит, что на сегодняшний день является вполне разумным решением. Следует заметить, что по умолчанию стоит использование 40-битных ключей, так что невнимательных пользователей может ожидать неприятный сюрприз.
Для защиты PDF документов так же существует два различных пароля - “пароль пользователя” и “пароль владельца”. С помощью первого документ может быть защищен от открытия, с помощью второго на документ можно накладывать различные ограничения, например, невозможность печати. Используемые алгоритмы шифрования зависят от формата PDF - до версии 1.4 использовались только 40-битные ключи, затем появились 128-битные, с версии 1.6 внедрено шифрование по AES с длиной ключа до 256 бит. При этом есть возможность использовать инфраструктуру открытых ключей (PKI) для генерации ключей для шифрования.
Однако реализация системы защиты PDF такова, что файл с ограничениями может быть расшифрован мгновенно и независимо от длины пароля, даже в случае 128-битных ключей. Документ с паролем на открытие лишен подобных недостатков и для его открытия придется осуществлять перебор паролей.