Фундаментальные проблемы всех паролей
Несколько замечаний, которые я недавно заметил: во-первых, кто-то спросил меня, насколько сложно взломать пароль из 24 и 64 символов. Это заставило меня почесать голову, так как число возможных паролей для случайного 64-символьного пароля - только строчными буквами - таково:
3616548304479297085365330736464680499909051895704748593486634912486670341490423472351870976
и в мире недостаточно вычислительной мощности, чтобы взломать его. Другой комментарий, который я получил, когда мне сказали, что все в порядке, если использовалась соль, и поэтому радужную таблицу нельзя было использовать. Опять же, есть опасение, что есть некоторые недоразумения относительно процесса хеширования, так как соль хранится отдельно от хэшированного значения, и тогда GPU и hashcat могут выполнять терахэширование в секунду, и даже если такой пароль, как «7 & 4K1pxZm», может быть взломан в минутах
Надежность пароля относится к четырем основным элементам:
- Количество символов в пароле. Чем больше символов в пароле, тем сильнее будет пароль.
- Диапазон символов в пароле. Чем шире диапазон символов в пароле, тем больше его сила, особенно при использовании неалфавитных символов (таких как «!», «@» И т. Д.).
- Скорость брутфорса. Это относится к скорости взломщика, например, 1 000 000 попыток в секунду.
- Использует ли компания, которая хранит ваш пароль, соль для хеширования, и метод хеширования, который они используют .
Надежность пароля
Например, если у нас есть строчные буквы [az], у нас есть 26 символов, и мы добавляем заглавные буквы [AZ], мы получаем 52 символа. Если у нас в пароле будет 5 символов, количество комбинаций паролей будет:
ааааа к ZZZZZ
который будет 52 к степени 5 = 380,204,032
Если мы взломаем эти пароли со скоростью один миллион в секунду, то для их проверки потребуется 380 секунд (6,23 минуты). Чтобы попробовать все комбинации, я создал проверку надежности пароля [ здесь ]:
Вот расчет для [a-zA-Z] с одним миллионом попыток ввода пароля в секунду. Мы видим, что для семизначного пароля требуется 11,9 дня, а для десятизначного - более 4000 лет:
Но если мы теперь используем 1 миллиард паролей в секунду, мы можем видеть, что взлом пароля из семи символов занимает всего 17,13 минуты:
Ниже приведены различные требования к паролю для 5-символьного пароля:
Посолим?
Недавно было объявлено, что LinkedIn не удалось засолить свои пароли во время взлома 2012 года, и хотя засолка увеличила бы время, необходимое для взлома соленого хеша, это был бы легкий взлом, если пользователи используют пароли, такие как «123456».
Зачем? Поскольку соль обычно хранится с хешированным паролем , поэтому, если пользователь выбирает «123456», взломщик просто выбирает словарь с этим паролем, а затем добавляет соль и сравнивает ее. Каждый из этих паролей, начиная с нарушения пароля в LinkedIn в 2012 году, мог быть взломан практически мгновенно на стандартном оборудовании с GPU.
Вам не обязательно быть одаренным, чтобы понять, что если я скажу вам, что мой пароль «qwerty», и вы возьмете его хеш-подпись, чтобы получить: «B1B3773A05C0ED 0176787A4F1574FF00 75F7521E» [ здесь ], а затем я сообщу вам Я использовал значение соли «64gfc * w», и вы быстро взяли хэш «64gfc * wqwerty» и получили: «DAA903ACDA75 D0FEDDEFED1FE 39825EDB42D9991» [ здесь ].Если соль хранится с хешированным значением, она мало пригодна для легко угадываемых паролей.
Групповая акция стоимостью 5 миллионов долларов в 2012 году против LinkedIn обрисовала в общих чертах:
В частности, LinkedIn не удалось адекватно защитить пользовательские данные, потому что он хранил пароли в хэшированном формате SHA1 без соли .
Хотя это и правда, шокирующая правда, что сами пароли были бы взломаны даже с засолкой. Если соль хранится с хешированным паролем, как это делают большинство систем, слабые пароли, которые поступают из словарей, легко взломать.
Недавнее нарушение данных 150 миллионов пользователей для приложения MyFittness создало заголовки на первой странице. Но когда мы смотрим на это, представленные данные не так уж плохи, как выглядят. В случае взлома данных только связанные с ними адреса электронной почты, имена пользователей и пароли и другие важные данные, такие как номера кредитных карт и дата рождения, были сегментированы от данных имени пользователя. Ответственная компания - Under Armour - даже сообщила в течение одной неделис момента открытия (что значительно улучшилось в таких компаниях, как Equifax, которая отчиталась много месяцев, или Uber, которая заняла больше года).
Компания сообщила, что они хэшировали пароли с помощью BCrypt, что создает значительный барьер для взлома паролей. BCrypt использует соление, а затем определяет количество раундов, а дополнительный раунд удваивает время, необходимое для вычисления хэша.
Armor, тем не менее, признал, что некоторые из их паролей были хешированы с помощью 160-битного метода SHA-1, и которые не рекомендуются для хэширования паролей. Вполне вероятно, что, как и Эшли Мэддисон, пользователи, которые не изменили свой пароль, все еще использовали SHA-1, и что только новые пароли использовали BCrypt. Таким образом, аудиторы должны лучше разбираться в технологиях, чтобы выявить такие слабые места, как этот.
В последнее время хаки также демонстрируют гибридный подход с сообщениями Yahoo:
«На основании недавнего расследования мы подтвердили, что копия В конце 2014 года из наших сетей была украдена определенная информация об учетных записях пользователей, которые, по нашему мнению, являются спонсируемым государством актером », - пишет Лорд. «Информация об учетной записи может включать имена, адреса электронной почты, телефонные номера, даты рождения, хешированные пароли ( подавляющее большинство - с bcrypt ), а в некоторых случаях зашифрованные или незашифрованные секретные вопросы и ответы ».
где приводятся цитаты о том, что Bcrypt использовался в большинстве учетных записей, но существует неясность �� отношении фактического объема взлома данных.
Бэкграунд
В 2012 году Linkedin был взломан, и произошла утечка 6,5 миллионов имен пользователей и паролей, но эта цифра возросла до 117 миллионов. Теперь темный дилер интернет-рынка - The Real Deal - предлагает эти данные для 5 биткойнов (2200 долларов США). Сами пароли являются хешированной версией, но их довольно легко взломать с помощью радужных таблиц, тем более что пользователи склонны выбирать слабые пароли.
Многие организации считают, что они безопасны, так как используют защищенные пароли, но это не так, если они используют слабые пароли. С Bcrypt мы получаем несколько раундов для хэширования, поэтому, если я увеличу количество раундов с 6 до 16 ... это будет более чем в 1000 раз сложнее взломать. На самом деле, если я увеличу до 31, это будет более чем в 33 миллиона раз сложнее (2 ²⁵). Наказание состоит в том, что он медленнее хэшируется, так что есть приятное место, но с вычислительной мощностью, значительно увеличивающейся в облаке, каждый криптографический метод нуждается в некоторой слабости!
В криптографии нам нравится, чтобы все было быстро, чтобы мы могли обрабатывать вещи в режиме реального времени. Как правило, мы перешли от использования криптографии на оборудовании к программным реализациям. С помощью методов хэширования мы часто хотим замедлить процесс, так как мы хотим, чтобы злоумышленник не использовал грубое форсирование хэша (когда он пытается использовать широкий диапазон паролей). Мы можем добавить соль, но если злоумышленник получит соль, он может попробовать популярные пароли.
Вычислительная мощность также значительно возрастает, особенно при параллельной обработке в облаке, а также с графическими картами GPU (которые могут иметь более 4000 ядер, каждое из которых может использовать различные значения хеш-функции).
Немного основ
В криптографии существует четыре основных понятия: шифрование с открытым ключом ( асимметричное шифрование );шифрование закрытым ключом ( симметричное шифрование );односторонний хэш ; и кодирование .
Все методы, описанные выше, позволяют легко изменить процесс шифрования или кодирования, если ключ известен, кроме одностороннего хеширования, когда почти невозможно вернуть обратно хешированное значение к исходным данным. К сожалению, с момента создания методов хеширования технологии развиваются, и их часто можно легко взломать, используя грубую силу (когда злоумышленник хранит значения хэширования до тех пор, пока выходные данные не будут соответствовать хешу), используя словарьобщих паролей, или используя радужную таблицу (которая имеет предварительно скомпилированный список значений хеша).
В наши дни MD5 и SHA-1 рассматриваются как слабые по многим причинам, поэтому мы часто начинаем с SHA-256 (который выдает 256-битное хэшированное значение) [ Ссылка ]:
Hash = sha256 (пароль)
К сожалению, это слабо как для атаки по словарю, так и для грубой силы, поэтому мы добавим немного соли:
Хэш = соль + sha256 (соль + пароль)
Теперь это становится более сложным, поскольку один и тот же пароль может привести к другому выводу. Раньше, при простом хешировании, если был взломан один хешированный пароль, все остальные пароли с таким же значением также будут взломаны. Слабым местом является то, что соль должна храниться с паролем, поэтому злоумышленник просто использует быстрый компьютер - такой как использование графических карт NVIDIA в Amazon Cloud - и пробует все основные пароли, и может определить оригинальный пароль. Причина, по которой это происходит, заключается в том, что SHA256 был спроектирован так, чтобы быть быстрым, поэтому злоумышленник использует это в своих интересах и может быстро попробовать множество паролей. Если пароль слабый и в словаре это относительно легко для злоумышленника.
Таким образом, стены крипто падают, особенно из-за высокопроизводительных компьютеров, но одним из решений является использование метода хеширования, который замедляет процесс хеширования, добавляет немного соли, а затем повторяется.Это делает чрезвычайно сложным составление списка хэшей, поскольку их вычисление требует больших вычислительных затрат - в облаке время - это деньги, поэтому сложная задача, требующая большого количества вычислений, занимает много лет и, следовательно, обходится дорого.
PBKDF2
Одним из лучших способов хеширования паролей является PBKDF2 (функция определения ключа на основе пароля 2), которая определена в RFC 2898 [ здесь ]. Он используется в TrueCrypt для генерации ключа, необходимого для чтения информации заголовка зашифрованного диска, в которой хранятся ключи шифрования, а также в WPA-2 [ здесь] для защиты пароля Wi-Fi для предварительного общего ключа. Если вам интересно, вот обзор:
И калькулятор здесь .
Scrypt
Scrypt - это функция получения ключа на основе пароля, которая создает хеш с солью и итерациями. Счетчик итераций замедляет взлом, а соль затрудняет предварительные вычисления. Основными параметрами являются: фраза-пароль (P); соль (S); Blocksize (r) и параметр стоимости CPU / Memory (N - степень 2). Демо здесь .
Bcrypt
MD5 и SHA-1 создают хэш-сигнатуру, но это может быть атаковано радужными таблицами. Bcrypt - более мощный генератор хэшей для паролей и использует соль для создания неповторяющегося хэша. Он был разработан Нильсом Провосом и Давидом Мазьером и основан на шифре Blowfish. Он используется в качестве метода хеширования паролей по умолчанию для BSD и других систем.
В целом он использует 128-битное солт-значение , для которого требуется 22 символа Base-64. Он может использовать несколько итераций, что замедлит любое взломанное хеширование хеш-значения.
Например, «Hello» со значением соли «$ 2a $ 06 $ NkYh0RCM8pNWPaYvRLgN9.» Дает:
$ 2a $ 06 $ NkYh0RCM8pNWPaYvRLgN9.LbJw4gcnWCOQYIom0P08UEZRQQjbfpy
Как показано ниже, первая часть - это «$ 2a $» (или «$ 2b $»), а затем число используемых раундов. В данном случае это 6 раундов, что составляет «итераций» (где каждый дополнительный раунд удваивает время хеширования). После этого следует 128-битное (22 символа) солт-значение, и, наконец, есть 184-битный хэш-код (31 символ).
Ниже приведен пример Bcrypt [ здесь ]:
Медлительность Bcrypt подчеркивается недавним тестом сервера AWS EC2 с использованием hashcat [ здесь ]:
- Тип хэша: MD5 Скорость / сек: 380.02M слов
- Тип хэша: SHA1 Скорость / сек: 218,86M слов
- Тип хэша: SHA256 Скорость / сек: 110.37M слов
- Тип хэша: bcrypt, Blowfish (OpenBSD) Скорость / сек: 25,86 тыс.Слов
- Тип хеширования: NTLM. Скорость / сек: 370.22M слов
Вы можете видеть, что Bcrypt почти в 15 000 раз медленнее, чем MD5 (380 000 000 слов / сек, всего до 25 860 слов / сек). С Джоном Потрошителем :
- md5crypt [MD5 32/64 X2] 318237 c / s real, 8881 c / s virtual
- bcrypt («$ 2a $ 05», 32 итерации) 25488 с / с, реальный, 708 с / с, виртуальный
- LM [DES 128/128 SSE2–16] 88090 К / с, реальный, 2462 К / с, виртуальный
где вы можете увидеть, что Bcrypt более чем в 3000 раз медленнее, чем хэши LM. Таким образом, хотя основные методы хеширования бывают быстрыми и эффективными, эта скорость имеет обратную сторону, так как их легче взломать. С Bcrypt скорость взлома значительно замедляется, и каждая итерация удваивает время, необходимое для взлома хэша с помощью грубой силы.
Вот реализация Python:
из pbkdf2 импорт PBKDF2 импортный хэшлиб; импорт passlib.hash; соль =»ZDzPE45C» строка =»пароль» salt2 =»1111111111111111111111" печать «Общие хеши» выведите «MD5:» + hashlib.md5 (строка) .hexdigest () выведите «SHA1:» + hashlib.sha1 (строка) .hexdigest () выведите «SHA256:» + hashlib.sha256 (строка) .hexdigest () выведите «SHA512:» + hashlib.sha512 (строка) .hexdigest () печать «UNIX хеши (с солью)» выведите «DES:» + passlib.hash.des_crypt.encrypt (строка, соль = соль [: 2]) выведите «MD5:» + passlib.hash.md5_crypt.encrypt (строка, соль = соль) выведите «Bcrypt:» + passlib.hash.bcrypt.encrypt (string, salt = salt2 [: 22]) выведите «Sun MD5:» + passlib.hash.sun_md5_crypt.encrypt (строка, соль = соль) выведите «SHA1:» + passlib.hash.sha1_crypt.encrypt (строка, соль = соль) выведите «SHA256:» + passlib.hash.sha256_crypt.encrypt (строка, соль = соль) выведите «SHA512:» + passlib.hash.sha512_crypt.encrypt (строка, соль = соль)
и который дает:
MD5: 5f4dcc3b5aa765d61d8327deb882cf99 SHA1: 5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8 SHA256: 5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8 SHA512: b109f3bbbc244eb82441917ed06d618b9008dd09b3befd1b5e07394c706a8bb980b1d7785e5976ec049b46df5f1326af5a2ea6d103fd07c95385ffab0cacbc86 UNIX хэши (с солью) DES: ZD3yxA4N / XZVg MD5: $ 1 $ ZDzPE45C $ EEQHJaCXI6yInV3FnskmF1 Bcrypt: $ 2a $ 12 $ 111111111111111111111uAQxS9vJNRtBb6zeFDV6k7tyB0DZJF0a Sun MD5: $ md5, раунды = 34000 $ ZDzPE45C $ RGKsbBUBhidHsaNDUMEEX0 SHA1: $ sha1 $ 480000 $ ZDzPE45C $ gfgoLWRrJHj / ZiXsV101NCX1GfUH В этом случае мы видим, что мы используем 12 итераций и предварительно подготовленную соль «1111111111111111111111» (22 символа для получения 128-битного значения соли): Bcrypt: $ 2a $ 12 $ 111111111111111111111uAQxS9vJNRtBb6zeFDV6k7tyB0DZJF0a
Мы можем увеличить количество раундов до 20 с помощью:
выведите «Bcrypt:» + passlib.hash.bcrypt.encrypt (string, salt = salt2 [: 22], rounds = 14)
дать:
Bcrypt: $ 2a $ 14 $ NkYh0RCM8pNWPaYvRLgN9.OcinBT2h.8NWt / KfmHQ5eIr / 50zCt8q
и что значительно замедляет перемешивание. Фактически он покажет в 4 раза. Таким образом, взломать одно хешированное значение будет стоить в четыре раза больше.
Заключение
Итак, во времена массово параллельных систем плавание в патоке является хорошей вещью для защиты паролей. Чем больше итераций у нас для каждого раунда, тем лучше, так как его сложнее взломать.PBKDF2 сейчас очень хорошо себя чувствует, благодаря внедрению в WPA вместе с TrueCrypt и множеством хранилищ паролей. Bcrypt все еще сильный соперник.
Так что помните ... если вашим взломщикам удалось получить миллион паролей от вашей системы ... с Bcrypt вам просто нужно изменить один параметр ... и они получат только один одновременно.Я считаю, что значение возрастает с 6 до 26 ... и его в миллион разсложнее взломать (2²⁰)!
Наконец, вы можете проверить надежность пароля здесь .
И калькулятор хеширования здесь.
Оригинал: https://medium.com/asecuritysite-when-bob-met-alice/the-problem-with-passwords-b555dbab07f4