Висновок: SHA-1 настільки ж безпечний, як будь-що проти попередніх атак, однак його легко обчислити, а значить, простіше встановити атаку грубої сили чи словника. (Це ж стосується таких наступників, як SHA-256.) Залежно від обставин, кращим вибором може стати хеш-функція, розрахована на обчислювальну дорогу (наприклад, bcrypt).
Деякі люди кидають багато зауважень на кшталт "SHA-1 зламаний" дуже багато, тому я намагаюся зрозуміти, що саме це означає. Припустимо, у мене є база даних хешей для паролів SHA-1, а зловмисник із найсучаснішим алгоритмом розбиття SHA-1 і ботнет із 100 000 машинами отримують доступ до нього. (Якщо мати контроль над домашніми комп'ютерами в 100 тисяч, це означає, що вони можуть робити близько 10 ^ 15 операцій в секунду.) Скільки часу їм знадобиться
- дізнатися пароль будь-якого користувача?
- дізнатися пароль заданого користувача?
- дізнатися пароль усіх користувачів?
- знайти спосіб увійти як один із користувачів?
- знайти спосіб увійти як конкретний користувач?
Як це зміниться, якщо паролі засолені? Чи має значення спосіб засолювання (префікс, постфікс, або те, чи щось складніше, як xor-ing)?
Ось моє теперішнє розуміння, після деякого гугла. Будь ласка, виправте у відповідях, якщо я щось неправильно зрозумів.
- Якщо солі немає, райдужна атака негайно знайде всі паролі (крім надзвичайно довгих).
- Якщо є досить довга випадкова сіль, найефективнішим способом з’ясувати паролі є жорстока сила або атака словника. Ні зіткнення, ні попередні атаки не допомагають з’ясувати фактичний пароль, тому криптографічні атаки проти SHA-1 тут не допомагають. Навіть не важливо, який алгоритм використовується - можна навіть використовувати MD5 або MD4, і паролі були б настільки ж безпечними (є невелика різниця, оскільки обчислення хеша SHA-1 проходить повільніше).
- Щоб оцінити, наскільки безпечним є «так само безпечно», припустимо, що для одного запуску sha1 потрібно 1000 операцій, а паролі містять великі, малі та малі цифри (тобто 60 символів). Це означає, що зловмисник може протестувати 10 15 * 60 * 60 * 24/1000 ~ = 10 17 потенційних паролів на день. Для грубої атаки це означатиме тестування всіх паролів до 9 символів за 3 години, до 10 символів на тиждень, до 11 символів на рік. (На кожен додатковий символ потрібно 60 разів більше.) Атака словника набагато, набагато швидша (навіть зловмисник із одним комп’ютером міг би витягнути його за години), але знаходить лише слабкі паролі.
- Щоб увійти як користувач, зловмиснику не потрібно з’ясовувати точний пароль; достатньо знайти рядок, що призводить до того ж хешу. Це називається першою попередньою атакою. Наскільки я міг знайти, жодних попередніх атак проти SHA-1 немає. (Напад грубої сили зайняв би 2 160 операцій, а це означає, що нашому теоретичному зловмиснику знадобиться 10 30 років, щоб його зняти. Обмеження теоретичної можливості - це близько 2 60 операцій, при яких напад триватиме кілька років.) Є попередні атаки проти скорочених версій SHA-1 з незначним ефектом (для зменшеного SHA-1, який використовує 44 кроки замість 80, час нападу зменшується з 2 160 операцій до 2 157). Є атаки проти зіткнення проти SHA-1, які повністю знаходяться в теоретичній можливості ( найкраще, що я знайшов, приводить час з 2 80 до 2 52 ), але вони марні проти хешей паролів, навіть без засолювання.
Коротше кажучи, зберігання паролів із SHA-1 видається абсолютно безпечним. Я щось пропустив?
Оновлення: Марсело вказав на статтю, в якій згадується другий попередній напад у 2 106 операціях . ( Редагувати: Як пояснює Томас , ця атака - це гіпотетична конструкція, яка не застосовується до сценаріїв реального життя.) Я все ще не бачу, наскільки це загрожує небезпекою для використання SHA-1 як ключової функції деривації. Чи є в цілому вагомі причини думати, що атака зіткнення або друга атака попереднього зображення можуть врешті-решт перетворитись у першу попередню атаку?