суббота, 8 сентября 2012 г.

Пароль для непрофессионалов

Пожалуй, пароль — это самое простое и одновременно самое сложное средство обеспечения безопасности. Простое — потому что практически нет ничего проще, чем пароль, для защиты информации и других ценностей или аутентификации (проверки подлинности личности или информации). Сложное — потому что при современном уровне развития технологий для того, чтобы использование пароля действительно обеспечивало безопасность, нужно быть в определённой степени осведомлённым в таких областях знаний, как математика и комбинаторика, теория вероятностей, криптография, например.

Я настоятельно рекомендую вам замечательный сайт, посвященный паролям: pasw.ru. Если вы прочли все статьи на этом сайте, то читать эту статью дальше вам не обязательно.

Если вы поймёте всё написанное в этой статье, вы будуте знать о паролях достаточно, чтобы обеспечить хорошую безопасность данных, защищаемых паролем. Я расскажу вам, как создать сложный пароль, безопасный от взломов. Но о краже самого пароля (подсматривание, фишинг и т.д.) на этот раз я вам не расскажу.

Сложность пароля

Интуитивно понятно, что, чем длиннее пароль, тем сложнее его подобрать. Но также важен и набор символов, из которых состоит пароль. Для количественной оценки сложности пароля используется понятие информационной энтропии из теории информации. В простейшем случае энтропия вычисляется следующим образом: число возможных символов, из которых состоит пароль, возводится в степень, равную количеству символов в пароле, и берётся логарифм по основанию 2 от этого всего. Например, случайный пароль,состоящий из латинских заглавных и строчных букв и цифр, длиной 10 символов будет иметь энтропию
log2((26×2 + 10)10) ≅ 60.
В таком случае говорят, что пароль обладает 60 битами энтропии, то есть это равнозначно случайному паролю длиной в 60 битов. Хорошо это или плохо? Для отгадывания такого пароля в среднем понадобится 260/2 попыток, и, если в секунду мы сможем проверять фантастическое число в 100 000 000 комбинаций, в среднем мы потратим на это более 100 лет. Такой метод взлома называется методом грубой силы.

В этой статье для иллюстрации сложности пароля я буду использовать тест, созданный Дэном Уилером (Dan Wheeler).

Методы хранения паролей

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

Аутентификация проходит по такой схеме: пользователь отправляет пароль, считается его хэш и, если посчитанный хэш и хэш, хранящийся в базе данных, совпадают, значит введён верный пароль и пользователь прошёл идентификацию.

Методы взлома паролей

Чтобы сделать пароль безопасным, необходимо знать о методах его взлома. Так сказать, задача от противного. Таковы реалии сегодняшнего дня.

Самый простой в своей сути метод я уже описал выше — это метод полного перебора или метод грубой силы. Но существуют и более продвинутые методы.

Атака по словарю

Опредлённый метод взлома принято называть атакой. Довольно эффективным методом является атака по словарю паролей. Очень часто люди легкомысленно относятся к безопасности и устанавливают пароли типа 12345 или qwerty. Такие пароли можно очень быстро подобрать по предварительно составленному словарю паролей. Например эти два пароля имеют 2 бита энтропии каждый и взламываются мгновенно.

Атака по словарю слогов

Родственной методу полного перебора является атака по словарю слогов. В этом методе составляются комбинации слогов из специально составленного словаря. Таким образом проверяются часто встречающиеся варианты паролей, содержащие словарные слова или просто слова, которые могли бы возникнуть в естественном языке. Например, первая строчка из стихотворения Jabberwocky "Twas brillig, and the slithy toves", записанная строчными буквами без знаков препинания и пробелов, даёт в тесте около 70 битов энтропии, в то время как случайный набор строчных букв той же длины даёт, как можно ожидать, 125 битов энтропии. Это происходит потому, что в этой строчке содержатся частоупотребимые слоги или даже слова английского языка. То есть, даже если вам кажется, что в данной строчке нет никакой осмысленности, на самом деле, с точки зрения подбора пароля, она есть.

И — нет, не стоит брать себе в качестве пароля строчки из этого стихотворения.

Подстановка символов

Может возникнуть мысль, что замена некоторых букв цифрами — хорошая идея, например, замена a на 4, i на 1 и так далее. На самом деле это не так. Взломщик может предусмотреть и такой вариант и проверять все варианты, полученные по словарю, подставляя все возможные замены букв на цифры. Это затруднит поиск, но не в той мере, как мы ожидаем или нам бы этого хотелось. Например фраза из упомянутого стихотворения после транслитерации в Leet выглядит так: 7W458r1lL194nD7h35l17Hy70v32. Казалось бы, что это случайный набор букв. Но хитрого хакера не обманешь: тест выдаёт сложность 85 битов энтропии, что "всего лишь" в тридцать тысяч раз сложнее оригинальной строки (при исходной сложности 2701021 или триллиард вариантов).

Но стоит ли оно того? Я думаю, сложность запоминания правил транслитерации не даёт сопоставимого с затратами преимущества, поэтому не стоит.

Создание пароля

Итак, наконец-то мы добрались до самого интересного — придумывания пароля. Вообще говоря, к паролю предъявляются противоречивые требования, как, например:
  • должно быть легко запомнить пароль,
  • должно быть легко вводить пароль,
  • пароль должен быть устойчив к взлому, в идеале его должно быть невозможно сломать вообще.
Здесь первые два требования состоят в противоречии с последним. Получается, что выбор пароля — это всегда компромисс. На самом деле разрешение этих противоречий есть ни что иное, как оптимизация с ограничениями и, как правило, в таких задачах решение лежит как раз на ограничении. В нашем случае такое ограничение — безопасность, обеспечиваемая паролем.

Как вы должны были понять из предыдущих частей, любая осмысленность в пароле — снижение его безопасности. Таким образом пароль должен состоять из случайного набора символов. Дело остаётся за малым — выбрать набор символов, из которых будет состоять пароль.

Обычно рекомендуется составлять пароль из строчных и заглавных букв латинского алфавита, цифр и специальных символов. Но, хотя специальные символы увеличивают сложность пароля, их сложнее запомнить и сложно найти на незнакомой раскладке клавиатуры (например, в путешествии по другой стране), так что эффект, который они дают, не стоит того. Поэтому лучше увеличить длину пароля, но использовать только буквы и цифры, чем использовать специальные символы. На странице pasw.ru представлено сравнение разных вариантов:
Время полного перебора всех возможных паролей заданного алфавита при скорости перебора 10,000,000 паролей в секунду
алфавит6 символов8 символов10 символов12 символов
26 (латиница все маленькие или все большие)31 сек5 часов 50 мин163.5 суток303 года
52 (латиница с переменным регистром)33 мин62 суток458 лет1,239,463 года
62 (латиница разного регистра плюс цифры)95 мин252 суток 17 часов2,661 год10,230,425 лет
68 (латиница разного регистра плюс цифры плюс знаки препинания .,;:!?)2 часа 45 мин529 суток6703 года30,995,621 лет
Конкретная рекомендация следующая:
  • используйте в качестве пароля случайно сгенерированную последовательность строчных и заглавных латинских букв и цифр длиной 8 символов, лучше 10, больше не нужно.
Конечно, выбор всегда остаётся за вами, но теперь, когда вы знаете весь расклад, вы сделаете его осознанно.

Запомнить же случайно созданный пароль не так сложно. Я делал так. Настраивал генератор паролей на нужный мне алфавит (буквы разного регистра и цифры). Генерировал несколько паролей и пробегал их глазами, стараясь проговорить их в уме. Если глаз цеплялся к какому то паролю и для меня было относительно легко его запомнить — значит пароль найден. Если нет — генерируем следующую порцию паролей. Главное не насиловать себя попытками запомнить незапоминаемое, ведь у всех запоминание работает немного по-разному, и набраться терпения.

Вот пример хорошо запоминаемого (для меня) пароля, который мне понравился в третьей сгенерированной десятке: eLUBam6UDV. еЛУБам 6 У Дэ Вэ. Легко запоминается, легко вводится. Что может быть проще? В тесте такой пароль получил 54 бита энтропии — это очень хорошо.

Но есть ещё один нюанс, который может свести на нет все ваши старания...

Радужные таблицы

Нет, правда. Сейчас объясню как они работают. Чтобы ускорить взлом пароля, можно было бы заранее вычислить хэши от часто используемых паролей или даже от всех паролей маленькой длины. Но, с ростом длины пароля катастрофически растёт количество вариантов: буквально с каждым дополнительным символом количество вариантов увеличивается в 50 или даже 100 раз. Такое огромное количество данных становится просто непрактично хранить. Тогда был придуман компромисс — радужные таблицы.

Берётся некая последовательность символов, которую мы назовём исходной. От этого сообщения вычисляется хэш, от которого в свою очередь с помощью специальной функции преобразования получается новая последовательность, причём функция сделана такой, что из одного и того же хэша получается одна и та же последовательность. От этой последовательности опять вычисляется хэш и так далее. Таким образом получается цепочка последовательностей и хэшей, причём мы всегда можем пройти по этой последовательности от начала к концу (но не наоборот). В радужной таблице в одной записи хранится исходная полседовательность символов и конечный хэш.

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

Однако расчёт таких таблиц занимает много времени, но зато сделать это нужно всего один раз. Кроме того такая работа идеально распараллеливается как на многопроцессорных системах, так и в системах распределённых вычислений (например, несколько компьютеров в сети). Ещё одной особенностью является то, что вероятность успешного взлома меньше 100%. То есть не факт, что ваш пароль будет обязательно взломан, но всё же вероятность этого очень высока.

Так как же защититься от таких атак?

Посолить по вкусу

Да, пароли солят. Попросту говоря, это ни что иное, как некая добавка к паролю, увеличивающая его длину, которая даже не должна быть секретной. Так как соль заранее не известна, то расчёт радужных таблиц для всех вариантов соли равносилен расчету для очень длинных паролей, что делает атаки с использованием радужных таблиц в этом случае непрактичными (читай: практически неосуществимыми) как по времени расчета самих таблиц, так и по их получающемуся размеру.

Грамотный разработчик системы аутентификации сохраняет хэши от посоленных паролей, то есть хэши от сообщений, состоящих из собственно пароля и добавки. Но мы не можем на это надеяться, поэтому рекомендуется добавлять соль в сам пароль.

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

Для ещё болшего повышения безопасности вы можете придумать простую схему контекстозависимого получения соли. В самом простом случае это может быть название сайта, на котором вы проходите аутентификацию, например &blogspot.com, то есть пароль будет в этом случае eLUBam6UDV&blogspot.com с совершенно безумной сложностью в 107 битов энтропии (2107≅1032 или 100 квинтиллионов вариантов). В этот раз вы можете воспользоваться предложенной выше схемой, так как к соли не предъявляется требование секретности.

Альтернативы

Существуют альтернативы, как например correcthorsebatterystaple, вынесенный в начало. Но сложность этого варианта составляет "всего" 45 битов энтропии, а длина противоречит требованию лёгкости вода, поэтому он далёк от оптимального. Тем не менее, такой вариант тоже имеет право на жизнь.

Заключение

Безопасный пароль, лёгкий для ввода и запоминания, возможен! Надеюсь эта информация поможет обеспечить безопасность ваших данных и ваших средств. Спасибо, что дочитали эту статью до конца.

Комментариев нет:

Отправить комментарий