Оновлення: Зверніть увагу: я не питаю, що таке сіль, що таке райдужний стіл, що таке атака за словником чи яке призначення солі. Я запитую: якщо ви знаєте, що користувачі солять і хеш, чи не так просто розрахувати їх пароль?
Я розумію процес і сам реалізую його в деяких своїх проектах.
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, лише буквено-цифрові символи, для вирішення 10 000 записів користувачів знадобиться 4 дні, і я зменшив удвічі швидкість алгоритму, щоб відобразити накладні та неідеальні обставини.
Важливо визнати, що це лінійна атака грубої сили, всі розрахунки не залежать один від одного, тому це ідеальне завдання для вирішення кількох систем. (IE легко налаштувати 2 комп’ютери, які запускають атаки з різних кінців, що скорочувало б половину часу виведення).
Враховуючи випадок рекурсивного хешування пароля 1000 разів, щоб зробити це завдання більш обчислювально дорогим:
(((36 ^ 7) / 1 000 000 000) / 2) * 1000 секунд = 10,8839117 годин
Це являє собою максимальну довжину 7 алфавітно-цифрових символів при виконанні менш ніж на половину швидкості від вказаного рисунка для одного користувача .
Рекурсивне хешування 1000 разів ефективно блокує загальну атаку, але цілеспрямовані атаки на дані користувачів все ще вразливі.