Короткий ответ на ваш вопрос: SHA-1 настолько безопасен, насколько вы можете его получить. MD5 тоже подойдет, даже MD4; но это может заставить некоторых инвесторов нервничать. Для связей с общественностью лучше всего использовать «лучшую» хеш-функцию, например, SHA-256, даже если вы урезаете его вывод до 160 или 128 бит (чтобы сэкономить на стоимости хранения). Некоторые из кандидатов SHA-3 в раунде 2 выглядят быстрее, чем SHA-1, хотя, возможно, и «более безопасны»; все же они все еще немного новы, так что придерживаться SHA-256 или SHA-512 было бы более безопасным маршрутом прямо сейчас. Это заставит вас выглядеть профессионально и осторожно, и это хорошо.
Обратите внимание, что "настолько безопасно, насколько вы можете получить" не то же самое, что "совершенно безопасно". Ниже приведены довольно длинные пояснения.
Об известных атаках:
Известные атаки на MD4, MD5 и SHA-1 касаются столкновений, которые не влияют на сопротивление прообразам. Было показано, что у MD4 есть несколько слабых мест, которые можно (только теоретически) использовать при попытке взлома HMAC / MD4, но это не относится к вашей проблеме. 2 106 вторая прообразная атака в газете Кесли и Шнайера - это общий компромисс, который применяется только к очень длинным входным данным (2 60 байт; это миллион терабайт - уведомление как 106 + 60 превышает 160; вот где вы видите, что в компромиссе нет ничего волшебного).
В остальной части этого сообщения предполагается, что используемая вами хеш-функция (например, SHA-1) является «черным ящиком» без специального свойства, которое может использовать злоумышленник. Это то, что у вас есть сейчас даже с «сломанными» хеш-функциями MD5 и SHA-1.
О радужных столах:
«Атака радуги» - это фактически разделение затрат на словарь или атаку грубой силой. Он является производным от компромисса времени-памяти , впервые описанного Хеллманом в 1980 году. Предполагая, что у вас есть N возможных паролей (это размер вашего словаря или 2 * 1029). * n , если вы рассматриваете грубое форсирование хеш-функции с выводом n битов, существует атака с разделением времени, в которой вы предварительно вычисляете N хеширует пароли и хранит их в большой таблице. Если вы сортируете выходные данные хеша, вы можете получить свой пароль за один поиск. Радужный стол - это умный способ хранения этого стола с гораздо меньшим пространством. Вы храните только N / t хешированных паролей и взламываете пароли с помощью O ( t 2 ) поисков. Радужные столы позволяют вам виртуально обрабатывать предварительно вычисленные таблицы намного больше, чем то, что вы реально можете хранить.
Однако, радуга или нет, злоумышленник все равно должен выполнить полную атаку хотя бы один раз. Это можно рассматривать как несколько последовательных слоев оптимизации:
- Атака методом перебора / словаря стоила N за взлом каждого пароля.
- Используя предварительно вычисленную таблицу, злоумышленник оплачивает стоимость N один раз и может после этого атаковать множество паролей с очень небольшими дополнительными затратами на каждый пароль. 1060 *
- Если предварительно вычисленная таблица является радужной таблицей, то N может быть несколько больше, поскольку стоимость хранилища уменьшается. Узким местом на N становится мощность процессора, которую атакующий может собрать, а не размер его жестких дисков.
Если N достаточно велико, чтобы затраты на хэширование N паролей ЦП были нелепыми, то такая атака невозможна независимо от того, используются ли радужные таблицы или нет. Это означает, что (устойчивой к прообразу) хеш-функции с выходным сигналом 80 бит или более достаточно для того, чтобы атака методом грубой силы стала невозможной.
О солях:
Соли - это способ победить предварительные вычисления. В приведенном выше описании соль возвращает злоумышленника к шагу 1: соление не дает злоумышленнику разделить стоимость O ( N ) между несколькими атакованными паролями. Предварительно вычисленные таблицы, a fortiori радужные таблицы, больше не осуществимы.
Вы хотите солить, потому что, когда хешированные данные состоят из паролей , то есть того, что вписывается в мозг случайного человека, тогда N может быть довольно низким: люди действительно плохо при выборе и запоминании паролей. Вот что такое «атака по словарю»: она использует уменьшенное пространство потенциальных паролей («словарь») при условии, что в этом специально выбранном пространстве будет много пользовательских паролей.
Следовательно, засолка, по крайней мере, помешает атакующему использовать предварительно вычисленные таблицы, в частности предварительно вычисленные радужные таблицы. Это предполагает, что злоумышленник сможет взломать один или два пароля; мы не хотим, чтобы он взломал 1000 других паролей с небольшими дополнительными затратами.
Кроме того, соление полезно для связей с общественностью.
О стоимости SHA-1:
Элементарная стоимость SHA-1 - это хеширование 64-байтового блока. Вот как работает SHA-1: данные дополняются, затем разделяются на 64-байтовые блоки. Стоимость обработки одного блока составляет около 500 тактов в системе Intel Core2, и это для одного ядра. MD5 и MD4 быстрее, считайте около 400 и 250 циклов соответственно. Не забывайте, что большинство современных процессоров имеют несколько ядер, поэтому умножьте их соответственно.
Некоторые схемы соления предписывают огромные соли; например то, что входит в хэш-функцию - это 40000 последовательных копий одной 128-битной соли, за которой следует сам пароль. Это делает хеширование паролей более дорогим (в моем случае в 10000 раз), как для законного пользователя, так и для злоумышленника. Является ли это хорошей идеей, зависит от настройки. Для входа в систему на настольном компьютере это хорошо: пользователь даже не заметит, что для хэширования его пароля потребовалось 10 мс, вместо 1 мкс; но стоимость для злоумышленника возросла на очень заметный показатель - 10000. На общих серверах с тысячами клиентов в секунду совокупные затраты могут стать непомерно высокими. Концептуально, поднятие планки одним и тем же фактором для законного пользователя и злоумышленника не является в конечном счете хорошей безопасностью; но это может быть полезной идеей в некоторых конкретных ситуациях.
О сетевых атаках:
Все вышеперечисленное касается победы над автономными атаками. Оффлайн-атака - это атака, при которой у злоумышленника есть все данные, необходимые ему для «проверки» паролей; например Злоумышленник может получить копию базы данных, содержащей хешированные пароли. В автономной атаке злоумышленник ограничен только своими вычислительными ресурсами. И наоборот, атака онлайн - это атака, при которой каждое предположение атакующего должно проходить через честного верификатора (например, атакующий просто пытается войти в атакуемую систему). Онлайн-атаки предотвращаются путем введения ограничений на количество попыток ввода паролей в секунду. Крайние примеры - смарт-карты, которые закрываются после трех неправильных ПИН-кодов.
Обычно для обеспечения безопасности паролей гораздо выгоднее организовать систему, позволяющую злоумышленнику не проводить автономную атаку. Это то, что делают системы Unix: хешированные пароли, которые раньше были в общедоступном файле /etc/password
, теперь находятся в файле /etc/shadow
, который защищен от доступа для чтения, за исключением нескольких привилегированных приложений. Здесь предполагается, что если злоумышленник может прочитать /etc/shadow
, то он, вероятно, имеет достаточный контроль над системой, так что ему больше не нужны пароли ...