Возможный дубликат:
Нужна помощь в понимании соли соли
Обновление: Пожалуйста, обратите внимание, что я не спрашиваю, что такое соль, что такое таблица радуги, что такое атака по словарю или какова цель соли. Я спрашиваю: если вы знаете соли пользователей и хэш, разве нелегко рассчитать их пароль?
Я понимаю процесс и сам реализую его в некоторых своих проектах.
s = random salt
storedPassword = sha1(password + s)
В базе данных, которую вы храните:
username | hashed_password | salt
Каждая реализация соления, которую я видел, добавляет соль либо в конце пароля, либо начинается:
hashed_Password = sha1(s + password )
hashed_Password = sha1(password + s)
Таким образом, словарная атака хакера, которая стоит его соли (ха-ха), просто запускает каждое ключевое слово против сохраненных солей в общих комбинациях, перечисленных выше.
Несомненно, описанная выше реализация просто добавляет еще один шаг для хакера, не решив основной вопрос? Какие существуют альтернативы для решения этой проблемы или я не понимаю проблему?
Единственное, что я могу сделать, это иметь секретный алгоритм смешивания, который объединяет соль и пароль вместе в случайном шаблоне или добавляет другие пользовательские поля в процесс хеширования, то есть хакер должен иметь доступ к базе данных И код, чтобы зашнуровать их для атаки словаря, чтобы доказать свою плодотворность. (Обновление, как указано в комментариях, лучше всего предположить, что у хакера есть доступ ко всей вашей информации, поэтому это, вероятно, не лучше).
Позвольте мне привести пример того, как я предлагаю хакеру взломать пользовательскую базу данных со списком паролей и хэшей:
Данные из нашей взломанной базы данных:
RawPassword (not stored) | Hashed | Salt
--------------------------------------------------------
letmein WEFLS... WEFOJFOFO...
Общий словарь паролей:
Common Password
--------------
letmein
12345
...
Для каждой пользовательской записи зациклируйте общие пароли и хешируйте их:
for each user in hacked_DB
salt = users_salt
hashed_pw = users_hashed_password
for each common_password
testhash = sha1(common_password + salt)
if testhash = hashed_pw then
//Match! Users password = common_password
//Lets visit the webpage and login now.
end if
next
next
Надеюсь, это иллюстрирует мою мысль намного лучше.
Учитывая 10 000 общих паролей и 10 000 пользовательских записей, нам нужно будет вычислить 100 000 000 хэшей, чтобы обнаружить как можно больше пользовательских паролей. Это может занять несколько часов, но это не проблема.
Обновление теории трещин
Мы предположим, что мы являемся коррумпированным веб-хостом, который имеет доступ к базе данных хешей SHA1 и солей вместе с вашим алгоритмом для их смешивания. База данных содержит 10 000 записей пользователей.
Этот сайт утверждает, что может вычислить 2 300 000 000 SHA1 хэшей в секунду с использованием графического процессора. (В реальной ситуации ситуация, вероятно, будет медленнее, но пока мы будем использовать эту цифру).
(((95 ^ 4)/2300000000)/2) * 10000 = 177 секунд
Учитывая полный диапазон из 95 печатных символов ASCII с максимальной длиной 4 символа, деленный на скорость вычисления (переменная), разделенный на 2 (при условии, что среднее время обнаружения пароля в среднем потребует 50% перестановок ) для 10 000 пользователей потребовалось бы 177 секунд, чтобы выработать все пароли пользователей, длина которых равна <= 4.
Скорее отрегулируйте его для реализма.
(((36 ^ 7)/1000000000)/2) * 10000 = 2 дня
Предполагая нечувствительность к регистру с длиной пароля <= 7, только буквенно-цифровыми символами, для 10 000 пользовательских записей потребуется 4 дня, и я сократил вдвое скорость алгоритма, чтобы отразить накладные и не идеальные обстоятельства.
Важно признать, что это линейная атака с применением грубой силы, все вычисления независимы друг от друга, поэтому это идеальная задача для решения нескольких систем. (IE легко настроить 2 компьютера, на которых запущена атака с разных концов, что будет вдвое меньше времени выключения).
Учитывая случай рекурсивного хэширования пароля 1000 раз, чтобы сделать эту задачу более дорогостоящей:
(((36 ^ 7)/1 000 000 000)/2) * 1000 секунды = 10,8839117 часов
Это означает максимальную длину 7 буквенно-цифровых символов при выполнении менее половины скорости от цитируемой цифры для одного пользователя.
Рекурсивное хеширование 1000 раз эффективно блокирует полную атаку, но нацеленные атаки на пользовательские данные по-прежнему уязвимы.