Обновление: обратите внимание, я не спрашиваю, что такое соль, что такое радужная таблица, что такое словарная атака или какова цель соли. Я спрашиваю: если вы знаете, что пользователи используют соль и хэш, разве не легко вычислить их пароль?
Я понимаю этот процесс и сам реализую его в некоторых своих проектах.
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% перестановок) для 10000 пользователям потребуется 177 секунд, чтобы разработать пароли всех пользователей, длина которых <= 4.
Немного подправим для реалистичности.
(((36 ^ 7) / 1000000000) / 2) * 10000 = 2 дня
Предполагая отсутствие чувствительности к регистру, с длиной пароля <= 7, только буквенно-цифровыми символами, потребуется 4 дня, чтобы решить для 10000 пользовательских записей, и я вдвое уменьшил скорость алгоритма, чтобы отразить накладные расходы и неидеальные обстоятельства.
Важно понимать, что это линейная атака методом грубой силы, все вычисления не зависят друг от друга, поэтому это идеальная задача для решения нескольких систем. (IE легко настроить 2 компьютера, запускающих атаку с разных сторон, что будет вдвое быстрее).
Учитывая случай рекурсивного хеширования пароля 1000 раз, чтобы сделать эту задачу более затратной в вычислительном отношении:
(((36 ^ 7) / 1 000 000 000) / 2) * 1000 секунд = 10,8839117 часов
Это представляет максимальную длину в 7 буквенно-цифровых символов при скорости выполнения менее половины от указанной цифры для одного пользователя .
Рекурсивное хеширование 1000 раз эффективно блокирует сплошную атаку, но целевые атаки на пользовательские данные по-прежнему уязвимы.