Ні, неможливо повернути хеш-функцію, таку як MD5: з урахуванням вихідного хеш-значення неможливо знайти вхідне повідомлення, якщо не буде відомо достатньо інформації про вхідне повідомлення.
Дешифрування - це не функція, визначена для хеш-функції; шифрування та дешифрування - це функції шифру, такого як AES в режимі CBC; Хеш-функції не шифрують і не розшифровують . Функції хешу використовуються для перебору вхідного повідомлення. Як випливає з назви , конструкція зворотного алгоритму не можлива .
MD5 розроблений як криптографічно захищена одностороння хеш-функція. Тепер легко створювати зіткнення для MD5 - навіть якщо значна частина вхідного повідомлення заздалегідь визначена. Таким чином, MD5 офіційно зламаний, і MD5 більше не слід вважати захищеним криптографічним хешем. Однак все-таки неможливо знайти вхідне повідомлення, яке призводить до хеш-значення: знайдіть X, коли відомий лише H (X) (а X не має попередньо обчисленої структури з принаймні одним 128-байтним блоком попередньо обчислених даних) . Немає відомих попередніх атак на MD5.
Як правило, можна також вгадувати паролі, використовуючи грубі сили або (доповнені) атаки на словник, порівнювати бази даних або спробувати знайти хеші паролів у так званих веселкових таблицях. Якщо відповідність знайдена, то обчислювально визначено, що вхід знайдено. Функції хешу також захищені від атак зіткнення: знаходження, X'
що H(X') = H(X)
дано H(X)
. Тож якщо X
знайдено анну, обчислювально визначено, що це дійсно вхідне повідомлення. Інакше ти б здійснив атаку зіткнення. Таблиці веселки можна використовувати для прискорення атак, а там є спеціалізовані інтернет-ресурси, які допоможуть вам знайти пароль із заданим хешем.
Звичайно, можна повторно використовувати хеш-значенняH(X)
для перевірки паролів, створених в інших системах. Єдине, що повинна зробити приймальна система - це збереження результату детермінованої функції, F
яка приймає H(X)
як вхід. Коли система X
дається тоді, H(X)
тому F
її можна перерахувати і результати порівняти. Іншими словами, не потрібно розшифровувати хеш-значення, щоб просто перевірити правильність пароля, і ви все одно можете зберігати хеш як інше значення.
Замість MD5 важливо використовувати хеш пароля або PBKDF (функція виведення ключа на основі пароля). Така функція визначає, як використовувати сіль разом з хешем. Таким чином, ідентичні хеші не будуть генеровані для однакових паролів (від інших користувачів або в інших базах даних). З цієї причини хеши паролів також не дозволяють використовувати таблиці з веселками до тих пір, поки сіль достатньо велика і належним чином рандомізована.
Хеші паролів також містять робочий коефіцієнт (інколи налаштований за допомогою ітерації ), який може значно уповільнити атаки, які намагаються знайти пароль із заданим значенням солі та хешу. Це важливо, оскільки база даних із солями та хеш-значеннями може бути викрадена. Нарешті, хеш паролів також може бути важким для пам'яті, так що для обчислення хешу потрібна значна кількість пам'яті. Це робить неможливим використання спеціального обладнання (GPU, ASIC, FPGA тощо), щоб дозволити зловмиснику прискорити пошук. Для хешу паролів також можуть бути доступні інші входи або параметри конфігурації, такі як перець або кількість паралелізації.
Однак це все ще дозволить будь-якій людині перевірити вказаний пароль, H(X)
навіть якщо H(X)
це хеш паролів. Хеші паролів все ще детерміновані, тому якщо хтось знає весь вхід і сам алгоритм хешу, то X
його можна використовувати для обчислення H(X)
та - знову ж таки - результати можна порівняти.
Зазвичай використовуються хеші паролів є Bcrypt , Scrypt і PBKDF2 . Також є Argon2 в різних формах, який є переможцем порівняно недавнього змагання з шикування паролів. Тут на CrackStation є хороший пост у блозі про те, як правильно захистити пароль.
Можливо, щоб противники не могли виконати хеш-розрахунок, переконавшись, що пароль правильний. Для цього перець можна використовувати як вхід до хешу пароля. Альтернативно, хеш-значення можна, звичайно, зашифрувати за допомогою шифру, такого як AES, та режиму роботи, такого як CBC або GCM. Однак для цього потрібно зберігати секрет / ключ незалежно та з більш високими вимогами доступу, ніж хеш паролів.