Как долго перебирать соленый хеш SHA-512? (соль предоставляется) - PullRequest
54 голосов
/ 21 июля 2011

Вот алгоритм на Java:

public String getHash(String password, String salt) throws Exception {
    String input = password + salt;
    MessageDigest md = MessageDigest.getInstance(SHA-512);
    byte[] out = md.digest(input.getBytes());
    return HexEncoder.toHex(out);
}

Предположим, что соль известна.Я хочу знать время, когда грубая сила используется, когда пароль является словарным словом, а также когда это не словарное слово.

Ответы [ 3 ]

114 голосов
/ 22 июля 2011

В вашем случае нарушение алгоритма хеширования эквивалентно обнаружению коллизии в алгоритме хеширования. Это означает, что вам не нужно находить сам пароль (который будет атака с прообразом ), вам просто нужно найти вывод хеш-функции, равный хешу действительного пароля (таким образом, "столкновение"). Нахождение коллизии с использованием атаки на день рождения занимает время O (2 ^ (n / 2)), где n - длина хэш-функции в битах.

SHA-2 имеет выходной размер 512 битов, поэтому нахождение коллизии потребует O (2 ^ 256) времени. Принимая во внимание, что нет никаких умных атак на сам алгоритм (в настоящее время никто не известен для семейства хэшей SHA-2), это то, что нужно, чтобы взломать алгоритм.

Чтобы понять, что на самом деле означает 2 ^ 256: в настоящее время считается, что число атомов во вселенной (всего !!!) составляет примерно 10 ^ 80, что примерно равно 2 ^ 266. Предполагая 32-байтовый ввод (что для вашего случая вполне разумно - 20 байт соли + 12-байтовый пароль), моя машина занимает ~ 0,22 с (~ 2 ^ -2 с) для 65536 (= 2 ^ 16) вычислений. Таким образом, 2 ^ 256 вычислений будет выполнено в 2 ^ 240 * 2 ^ 16 вычислений, что займет

2^240 * 2^-2 = 2^238 ~ 10^72s ~ 3,17 * 10^64 years

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

Так что забудьте про перебор SHA-256 здесь. Ваш следующий вопрос был о словарных словах. Для извлечения таких слабых паролей традиционно использовались радужные таблицы . Радужная таблица - это, как правило, просто таблица предварительно вычисленных значений хеша. Идея состоит в том, что если бы вы смогли предварительно вычислить и сохранить каждый возможный хеш вместе с его входными данными, то вам понадобится O (1), чтобы найти заданный хеш и получить действительный прообраз для этого. Конечно, на практике это невозможно, поскольку нет устройства хранения, которое могло бы хранить такие огромные объемы данных. Эта дилемма известна как компромисс между временем и памятью . Поскольку вы можете хранить только столько значений, типичные радужные таблицы включают некоторую форму хэш-цепочки с промежуточными функциями сокращения (это подробно объясняется в статье в Википедии), чтобы сэкономить пространство, отказавшись от небольшой экономии времени.

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

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

Вот почему обычно одного хэширования и посола недостаточно, вам необходимо установить и другие механизмы безопасности.Вам следует использовать искусственно замедленный метод энтропийного энтузиазма, такой как PBKDF2, описанный в PKCS # 5 , и вы должны установить период ожидания для данного пользователя, прежде чем он сможет повторить попытку ввода своего пароля.Хорошая схема - начинать с 0,5 с, а затем удваивать это время для каждой неудачной попытки.В большинстве случаев пользователи не замечают этого и не выходят из строя гораздо чаще, чем в среднем три раза.Но это значительно замедлит любого злоумышленника, пытающегося атаковать ваше приложение.

31 голосов
/ 25 сентября 2014

Я хочу знать время перебора, когда пароль является словарным словом, а также когда он не является словарным словом.

Словарь словарного запаса

Приблизительная цифра : английских слов около 1 000 000, и если хакер может вычислить около 10 000 хешей SHA-512 в секунду ( обновление: см. Комментарий CodesInChaos, эта оценка очень мала), 1 000 000/10 000 = 100 секунд .Таким образом, взлом пароля из одного словарей для одного пользователя займет чуть более минуты.Если пользователь объединяет два слова в словаре, вы находитесь в зоне действия нескольких дней, но все же очень возможно, если злоумышленник достаточно заботится.Более того, и это становится все труднее.

Случайный пароль

Если пароль представляет собой действительно случайную последовательность буквенно-цифровых символов, заглавных и строчных, то количество возможныхдлина пароля N составляет 60 ^ N (возможны 60 символов).Мы сделаем расчет в другом направлении на этот раз;мы спросим: Какую длину пароля мы можем взломать за определенный промежуток времени? Просто используйте эту формулу:

N = Log60(t * 10,000) где t - время, потраченное на вычисление хэшей в секундах (снова при условии, что 10 000 хэшей в секунду).

1 minute:    3.2
5 minute:    3.6
30 minutes:  4.1
2 hours:     4.4
3 days:      5.2

Итак, если у нас будет 3 дня, мы сможем взломать пароль, если он будет длиной 5 символов.

Это все очень сложно., Но ты получил идею. Обновление: см. Комментарий ниже, на самом деле возможно взломать намного более длинные пароли, чем этот.

Что здесь происходит?

Давайте разберемся с некоторыми заблуждениями:

  • Соль не замедляет вычисление хэшей , это просто означает, что им приходится взламывать пароль каждого пользователя по отдельности и предварительно вычисленные хеш-таблицы (модное слово: Радужные столы ) сделаны совершенно бесполезными.Если у вас нет предварительно вычисленной хеш-таблицы, и вы взламываете только один хэш-пароль, то соление не имеет никакого значения.

  • SHA-512 isn 't разработан, чтобы быть грубым .Лучшие алгоритмы хеширования, такие как BCrypt, PBKDF2 или SCrypt , могут быть настроены так, чтобы вычисление занимало гораздо больше времени, а средний компьютер мог бы вычислять только 10-20 хэшей в секунду.Прочитайте Этот превосходный ответ о хешировании пароля, если вы еще этого не сделали.

  • обновление: как написано в комментарии CodesInChaos, даже пароли с высокой энтропией (около 10 символов) может быть взломано при использовании правильного оборудования для вычисления хэшей SHA-512.


Примечания о принятом ответе:

Принятыйответ по состоянию на сентябрь 2014 года является неправильным и опасно неправильным:

В вашем случае нарушение алгоритма хеширования эквивалентно обнаружению коллизии в алгоритме хеширования.Это означает, что вам не нужно находить сам пароль (что было бы атакой с прообразом) ... Нахождение коллизии с помощью атаки на день рождения занимает O (2 ^ n / 2) времени, где n - длина хеша на выходефункция в битах.

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

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

Вот почему, как правило, одного хэширования и посылки не достаточно, вам также необходимо установить другие механизмы безопасности.Вы должны использовать искусственно замедленный энтропийно-ориентирующий метод, такой как PBKDF2, описанный в PKCS # 5 ...

Да, пожалуйста, используйте алгоритм, который медленно вычисляется, но что такое "энтропийный"?Ввод пароля с низкой энтропией через хеш не увеличивает энтропию.Он должен сохранить энтропию, но вы не можете улучшить хлам пароля лучше с помощью хэша, он не работает так. Слабый пароль, введенный через PBKDF2, все еще является слабым паролем.

8 голосов
/ 22 июля 2011

На этот вопрос нет однозначного ответа, так как слишком много переменных, но SHA2 еще не взломан (см .: Время жизни криптографических хеш-функций ), так что это все еще хороший алгоритм дляиспользуйте для хранения паролей. Использование соли хорошо, потому что она предотвращает атаки от атак по словарю или радужных таблиц.Важность соли заключается в том, что она должна быть уникальной для каждого пароля.При хранении хешированных паролей вы можете использовать такой формат, как [128-битная соль] [512-битный хеш-пароль].

Единственный жизнеспособный способ атаковать - это вычислять хэши для разных возможностей пароля и в конечном итоге найтиправильный, сопоставляя хэши.

Чтобы дать представление о том, сколько хэшей можно сделать за секунду, я думаю, что Биткойн - хороший пример. Биткойн использует SHA256, и для его сокращения, чем больше хеш-кодов вы генерируете, тем больше биткойнов вы получаете (которыми вы можете торговать на реальные деньги), и поэтому такие люди мотивированы для использования графических процессоров для этой цели.Вы можете видеть в обзоре аппаратного обеспечения , что средняя графическая карта, которая стоит всего $ 150, может вычислить более 200 миллионов хешей / с.Чем длиннее и сложнее ваш пароль, тем больше времени он займет.При расчете со скоростью 200 м / с, чтобы испробовать все возможности для 8-буквенного алфавитно-цифрового (заглавные, нижние, цифры), потребуется около 300 часов.Скорее всего, реальное время будет меньше, если пароль - это что-то подходящее или обычное английское слово.

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

Одна вещь, которую вы можете сделать, это также добавить дополнительную защиту от грубой силы, замедляя процедуру хеширования.Поскольку вы хэшируете пароли только один раз, а злоумышленник должен делать это много раз, это работает в вашу пользу.Типичный способ сделать это - взять значение, хэшировать его, взять выходные данные, снова хэшировать его и т. Д. Для фиксированного количества итераций.Например, вы можете попробовать что-то вроде 1000 или 10000 итераций.Это заставит злоумышленника во много раз медленнее находить каждый пароль.

...