Давайте рассмотрим простой пример: у нас есть две базы данных: Альфа и Бета :
Альфа просто хэширует пароль и сохраняетрезультат:
row: {
passwordHash = Hash(password)
}
Beta создает случайное значение для каждого пользователя и использует его как часть ввода в хэш-функцию:
row: {
salt = RandomString(),
passwordHash = Hash(password + salt)
}
Теперь произнеситезлоумышленник заранее знает, что некоторые из ваших пользователей используют пароль: "password"
Чтобы найти всех пользователей в Alpha с паролем "password"
, вам нужно только вычислить хеш:"password"
один раз.Вот пример из SQL:
DECLARE @Hash INT; SET @Hash = Hash("password");
SELECT UserID FROM Users WHERE passwordHash = @Hash
Поскольку он включает в себя только целочисленное равенство, он настолько эффективен, насколько может быть выполнен запрос.Даже если бы у Alpha было несколько сотен тысяч пользователей, оно вернулось бы очень быстро.
Тот факт, что хэши Beta включают в себя случайное значение для каждой строки в каждомхэш пароля, вы не можете написать столь же эффективный запрос для него.Самое близкое, что вы могли бы получить, - это переоценить (намеренно дорого вычислять) хеш-функцию для каждой строки salt
:
SELECT u.UserID FROM Users u WHERE u.passwordHash = Hash("password" + u.salt)
Тот факт, что поиск известного паролянастолько дорого, должно указывать, насколько дорого проводить атаку методом "грубой силы", даже если эта атака руководствуется словарями общих паролей или алгоритмами, которые пытаются смешивать слова и цифры, чтобы создать пароли, как это делают люди.
Вы уже знаете, что salt
является мерой защиты от атак "радужного стола", поэтому ваш вопрос ... как?
"Радужный стол" стал цветочным термином для любогоатака, которая заранее вычисляет хеши для общих и вероятных потенциальных паролей и сохраняет их в эффективной справочной таблице.Как только вы построите эту таблицу (что может занять несколько часов), вы затем перебираете каждого пользователя и смотрите, есть ли его хэш пароля в таблице поиска.Если это так, вы уже догадались, что пароль этого пользователя.
Пользователи в Alpha действительно уязвимы для такого рода атак. Alpha будет иметь эквивалентные хеш-коды для эквивалентных паролей, поэтому для обратного хеширования можно использовать хеш-таблицу или радужную таблицу.Но Beta ловко обходит эту уязвимость, делая результат хэш-функции уникальным для пользователя благодаря salt
.
Надеюсь, это когда-нибудь поможет читателю!