Різниця між хешированием пароля і шифруванням його


140

Поточний голосуючий цього питання визначає:

Інший, який не так вже й є проблемою безпеки, хоча це пов'язано із безпекою, є повним і не допускає вирішення різниці між хешуванням пароля та шифруванням . Найчастіше зустрічається в коді, де програміст намагається надати небезпечну функцію "Нагадати мій пароль".

У чому саме ця різниця? Я завжди мав враження, що хешування - це форма шифрування. Про яку небезпечну функціональність постер посилається?


Добре написана стаття про те, чому ви не повинні просто хеш-секрети / паролі. Замість цього використовуйте HMAC. benlog.com/articles/2008/06/19/dont-hash-secrets
Джей Кумар

Чудовий підсумок теми в блозі безпеки StackExchange: security.blogoverflow.com/2011/11/…
David J. Liszewski

@JayKumar: Стаття, яку ви пов’язали, дуже вводить в оману. Він поєднує солі паролів (які, як очікується, будуть видимі для зловмисників) з ключами MAC (які, як очікується, залишаться секретними). Посилання Девіда Дж. Лішевського дає набагато точніший опис.
Rufflewind

Відповіді:


222

Хешинг - це одностороння функція (ну, картографування). Це незворотно, ви застосовуєте алгоритм захищеного хешу, і ви не можете повернути початковий рядок. Найбільше, що ви можете зробити, це генерувати те, що називається "зіткненням", тобто знайти інший рядок, який забезпечує той самий хеш. Криптографічно захищені хеш-алгоритми розроблені для запобігання виникнення зіткнень. Ви можете атакувати на захищений хеш, використовуючи таблицю веселки , протидію якій можна протидіяти, застосовуючи сіль до хешу перед його зберіганням.

Шифрування - це правильна (двостороння) функція. Це оборотно, ви можете розшифрувати нарізаний рядок, щоб отримати оригінальну рядок, якщо у вас є ключ.

Небезпечна функціональність, на яку вона посилається, полягає в тому, що якщо ви шифруєте паролі, у вашій програмі є ключ, який зберігається десь, і зловмисник, який отримує доступ до вашої бази даних (та / або коду), може отримати оригінальні паролі, отримуючи і ключ, і зашифрований текст. , тоді як з хешем це неможливо.

Зазвичай люди кажуть, що якщо зломщик володіє вашою базою даних або вашим кодом, він не потребує пароля, тому різниця полягає в суперечливості. Це наївно, тому що ви все ще зобов’язані захищати паролі своїх користувачів, головним чином тому, що більшість із них використовує один і той же пароль знову і знову, наражаючи їх на більший ризик, просочуючи їх паролі.


1
Щоб зрозуміти, отримати бажану безпеку за допомогою хеша, він повинен бути криптографічно захищеним хеш-алгоритмом із специфічною властивістю, що не тільки хеш бути незворотним, АЛЕ ТАКОЖ обчислювально недоцільно генерувати БУДЬ-яку іншу рядок, що генерує той же хеш.
Високий Джефф

11
Так і ні ... Зіткнення хешів потрібно важко генерувати задля безпеки вашого власного додатка, але неможливість зворотного звернення достатня для уникнення витоку пароля.
Дейв Шерохман

5
silky: а як саме ви збираєтеся повернути оригінальний пароль від вашої хитрої хеш-функції? Я пропоную вам перечитати коментар Дейва
Вінко Врсалович

1
Якщо що-небудь, хеш-функція, що має велику кількість зіткнень, є кращою для безпеки паролів, однак це, очевидно, означає, що більше паролів може бути використане для входу в обліковий запис.
williamvicary

1
@ n00b сіль не може бути важко закодована, оскільки кожен хешиваний елемент повинен використовувати окрему сіль. Суть солі полягає в тому, що і UserA, і UserB використовують пароль "1234", якщо ви дізнаєтесь пароль UserA, ви не можете сказати, що UserB використовував один і той же пароль, оскільки вони мали різні солі. Небезпечно, що солі зберігаються в секреті, більшість реалізацій просто з'єднують сіль на передню або задню частину двійкового блобу, який представляє хеш.
Скотт Чемберлен

34

Хешинг - це одностороння функція, це означає, що після того, як ви хеште пароль, дуже важко повернути оригінальний пароль назад з хеша. Шифрування - це двостороння функція, де набагато простіше повернути оригінальний текст із зашифрованого тексту.

Звичайне хешуваннявання легко перемогти за допомогою атаки словника, коли зловмисник попередньо хеширує кожне слово в словнику (або кожну комбінацію символів до певної довжини), а потім використовує цей новий словник для пошуку хешованих паролів. Використання унікальної випадкової солі для кожного збереженого пароля хедерів набагато складніше використовувати цей метод для зловмисника. В основному їм потрібно створити новий унікальний словник для кожної цінності солі, яку ви використовуєте, жахливо уповільнивши їх атаку.

Зберігати паролі за допомогою алгоритму шифрування небезпечно, оскільки якщо користувачеві або адміністратору легше повернути оригінальний пароль назад із зашифрованого тексту, зловмиснику також простіше зробити те ж саме.


12

Зашифровані проти хешованих паролів

Як показано на наведеному вище зображенні, якщо пароль зашифрований, це завжди прихований секрет, де хтось може витягнути звичайний текстовий пароль. Однак коли хеширується пароль, ви розслаблені, оскільки навряд чи існує спосіб відновлення пароля з хеш-значення.


Витягнуто з шифрованих проти хеш-паролів - що краще?

Чи добре шифрування?

Прості текстові паролі можуть бути зашифровані за допомогою симетричних алгоритмів шифрування, таких як DES, AES або за допомогою будь-яких інших алгоритмів, і зберігатися всередині бази даних. Під час аутентифікації (підтвердження ідентичності з іменем користувача та паролем) додаток розшифрує зашифрований пароль, що зберігається в базі даних, і порівняє з наданим користувачем паролем рівності. У такому типі підходу до обробки паролів, навіть якщо хтось отримає доступ до таблиць баз даних, паролі не будуть просто використовуватися повторно. Однак у цьому підході є і погані новини. Якщо хтось отримає криптографічний алгоритм разом із ключем, використовуваним вашою програмою, він / вона зможе переглядати всі паролі користувачів, що зберігаються у вашій базі даних, розшифровуючи. "Це найкращий варіант, який я отримав", розробник програмного забезпечення може кричати, але чи є кращий спосіб?

Криптографічна хеш-функція (лише в одну сторону)

Так, можливо, тут ви пропустили суть. Ви помітили, що немає необхідності розшифровувати та порівнювати? Якщо існує єдиний підхід до перетворення, де пароль можна перетворити на якесь перетворене слово, але зворотна операція (генерація пароля з перетвореного слова) неможлива. Тепер навіть якщо хтось отримує доступ до бази даних, немає можливості відтворити або вилучити паролі за допомогою перетворених слів. При такому підході навряд чи хтось може знати найпотаємніші паролі користувачів; і це захистить користувачів, використовуючи один і той же пароль у кількох програмах. Які алгоритми можна використовувати для цього підходу?


Гаразд, але коли ви входите в службу, ваш пароль надсилається в простому тексті / зашифрованому, тому що якщо він надісланий як хеш-сервер для порівняння. хакер міг би, якщо вони знають хеш, просто відправити хеш на сервер для входу. Ось чому паролі для порівняння потрібно надсилати зашифрованими на сервер, де вони розшифровуються та хешируються. Це безпечно, правда? Поки паролі ніколи не зберігаються в незахищеному вигляді протягом тривалого часу, а всі випадки паролів зашифрованого чи простого тексту видаляються з будь-якої пам'яті, коли вони більше не потрібні?
AgentM

8

Я завжди думав, що шифрування можна перетворити обома способами, таким чином, що кінцеве значення може привести вас до початкового значення, а з допомогою Hashing ви не зможете повернути з кінцевого результату до початкового значення.


8

Алгоритми хешування зазвичай мають криптографічний характер, але основна відмінність полягає в тому, що шифрування є оборотним шляхом дешифрування, а хешування - ні.

Функція шифрування, як правило, приймає вхід і виробляє зашифрований вихід, який має однаковий розмір або трохи більший розмір.

Хеш-функція приймає введення та видає типово менший вихід, як правило, фіксованого розміру.

Хоча неможливо взяти хешированний результат і "знешкодити" його, щоб повернути початковий вхід, ти, як правило, можеш грубим шляхом просувати щось, що створює той самий хеш.

Іншими словами, якщо схема автентифікації приймає пароль, хеширує його і порівнює його з хешированной версією потрібного пароля, можливо, не знадобиться, щоб ви справді знали оригінальний пароль, лише його хеш, і ви можете грубої сили ваш шлях до чогось, що буде відповідати, навіть якщо це інший пароль.

Функції хешування, як правило, створюються, щоб мінімізувати ймовірність зіткнень і ускладнити просто обчислення того, що дасть той же хеш, що і щось інше.


4

В ідеалі ви повинні робити і те, і інше.

Спочатку хеш-пароль для забезпечення безпеки в одну сторону. Використовуйте сіль для додаткової безпеки.

Потім зашифруйте хеш для захисту від атак на словник, якщо ваша база даних з хешами паролів порушена.


3
Зашифруйте це чим? Якби вони настільки сильно переконували вас, що вони потрапили до бази даних із усіма паролями вашого користувача (хешовані, зашифровані чи іншим чином), чи не змогли б вони знайти ключ для їх розшифровки?
Люк

5
Це не повинно бути обмеженим. Це можливість, яку не слід виключати так просто, що база даних порушена, тоді як програма не є. Тому шифрування хеша - це додатковий рівень безпеки.
Ар'є

@Luc Я не згоден з вами, моє попереднє «я». Я бачив занадто багато SQL-ін'єкцій, які не ставлять під загрозу код програми (або файли конфігурації), і я зараз вважаю, що додавання секрету є корисним, будь то у формі шифрування або у формі перцю, але він не повинен замінювати хешування. Для більш повної відповіді дивіться тут: security.stackexchange.com/a/31846/10863
Люк

3

Хешинг :

Це односторонній алгоритм і одного разу хеш не може відкатати, і це його приємна точка проти шифрування.

Шифрування

Якщо ми виконаємо шифрування, для цього буде ключ. Якщо цей ключ просочиться, усі ваші паролі можна буде легко розшифрувати.

З іншого боку, навіть якщо ваша база даних буде зламана або ваш адміністратор сервера взяв дані з БД, і ви використовували хешовані паролі, хакер не зможе зламати ці хешовані паролі. Це насправді практично неможливо, якщо ми використовуємо хешинг із належною сіллю та додатковою безпекою з PBKDF2.

Якщо ви хочете поглянути на те, як слід писати свої хеш-функції, можете завітати тут .

Існує багато алгоритмів для виконання хешування.

  1. MD5 - Використовує хеш-функцію алгоритму дайджесту повідомлень 5 (MD5). Вихідний хеш - 128 біт. Алгоритм MD5 був розроблений Рон Рівестом на початку 1990-х, і сьогодні це не є бажаним варіантом.

  2. SHA1 - Використовується хеш алгоритму хеш-безпеки (SHA1), опублікований в 1995 році. Хеш-вихід виходить довжиною 160 біт. Хоча сьогодні це найбільше поширення, це не є кращим варіантом.

  3. HMACSHA256 , HMACSHA384 , HMACSHA512 - Використовуйте функції SHA-256, SHA-384 та SHA-512 сімейства SHA-2. SHA-2 був опублікований у 2001 році. Вихідні хешові довжини - 256, 384 та 512 біт відповідно, як вказують назви хеш-функцій.


1

Настільки ж правильні, як і інші відповіді, у контексті, в якій цитата була, хешування - це інструмент, який може бути використаний для забезпечення інформації, шифрування - це процес, який приймає інформацію та ускладнює читання / використання несанкціонованих людей.


-9

Ось одна з причин, можливо, ви хочете використовувати одну над іншою - пошук пароля.

Якщо ви зберігаєте лише хеш пароля користувача, ви не можете запропонувати функцію "забутий пароль".


16
Ви, очевидно, недостатньо добре прочитали прийняту відповідь. Уважно читайте: Ви не повинні пропонувати функцію пошуку пароля . Ви повинні запропонувати функцію скидання пароля . Я впродовж багатьох років керував багатьма веб-сайтами, включаючи vBulletin, phpBB, e107, IPB, blogspot та навіть власну власну CMS. Як адміністратор, Ви НІКОЛИ не повинні мати чиїсь попередньо хешовані паролі. Ви просто цього не робите. І у вас його також не повинно було бути. Якщо ви не згодні з тим, що я говорю, дозвольте запевнити: ви помиляєтесь.
Лакі

3
Вибачте за те, що БУДУТЬ занадто злий. Я просто бачу занадто багато веб-сайтів, які зберігають паролі у простому тексті, і це мене засмучує. Як зауваження: деякі веб-сайти, орієнтовані на безпеку, люблять змушувати користувачів періодично змінювати свої паролі. Вони хочуть переконатися, що людина не змінює свій пароль з "Password1" на "Password2". Таким чином, вони зберігають звичайний текст, щоб зробити ці порівняння пізніше. Це не є хорошою практикою. У цьому випадку їм потрібно зробити аналіз на ПЕРШИЙ пароль, створивши купу подібних паролів - хеш кожного - і зберігати хеши .
Лакі

7
Немає проблем, це змусило мене повернутися і перечитати питання, а також зробити подальше дослідження, тому все не втрачено :-) Я не впевнений, що я думав, коли писав цю відповідь. ура
Фільтрон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.