SHA512 проти Blowfish та Bcrypt [закрито]


222

Я переглядаю алгоритми хешування, але не можу знайти відповіді.

  • Bcrypt використовує Blowfish
  • Синиця краща, ніж MD5
  • Q: але чи Blowfish краще, ніж SHA512?

Дякую..

Оновлення:

Хочу уточнити, що я розумію різницю між хешуваннями та шифруванням. Що змусило мене поставити питання таким чином, це стаття , де автор називає bcrypt "адаптивним хешированием"

Оскільки bcrypt заснований на Blowfish, мені пришлось думати, що Blowfish - алгоритм хешування. Якщо це шифрування, як вказали відповіді, то мені здається, що воно не повинно мати місця в цій статті. Гірше те, що він робить висновок, що bcrypt - найкращий. Що також мене зараз бентежить, це те, що клас phpass (який я використовую для хешування паролів, я вважаю) використовує bcrypt (тобто, удар, тобто шифрування). Виходячи з цієї нової інформації, яку ви мені повідомляєте, хлопці (шифр - шифрування), цей клас звучить неправильно. Я щось пропускаю?


2
Це не помиляється; перегляньте оновлення моєї відповіді для пояснення того, як працює bcrypt і чому він виконує ту саму мету, що і алгоритм, заснований на хеші "односторонній".
erickson

3
bcryptпросто має вищий "коефіцієнт роботи" за замовчуванням. Припускається, що SHA не буде ..., якщо тільки ви не використовуєте passhash9, який може використовуватись разом із робочим фактором. чому це питання закрите? це далеко не відповідь, але дуже важливий.

1
Посилання, про яке йдеться, знижується ...............
Pacerier

Відповіді:


320

Це повинно бути досить , щоб сказати , є чи Bcrypt або SHA-512 (в контексті відповідного алгоритму , як PBKDF2) є досить хорошим . І відповідь - так, будь-який алгоритм достатньо безпечний, що порушення відбудеться через недоліки реалізації, а не криптоаналіз.

Якщо ви наполягаєте на тому, щоб знати, що є "кращим", SHA-512 провів глибокі огляди від NIST та інших. Це добре, але були визнані недоліки, які, хоча зараз не використовуються, призвели до змагань SHA-3 за нові хеш-алгоритми. Також майте на увазі, що вивчення алгоритмів хешу "новіше", ніж у шифрів, і криптографи досі дізнаються про них.

Незважаючи на те, що bcrypt в цілому не настільки ретельно перевіряється, як сам Blowfish, я вважаю, що, будучи на основі шифру з добре зрозумілою структурою, надає йому певної притаманної безпеки, якої не вистачає на основі хеш-аутентифікації. Крім того, простіше використовувати загальні графічні процесори як інструмент для атаки хешей на основі SHA-2; через свої вимоги до пам'яті оптимізація bcrypt вимагає більш спеціалізованого обладнання, наприклад FPGA, з деякою бортовою пам'яттю.


Примітка: bcrypt - це алгоритм, який використовує Blowfish внутрішньо. Це не сам алгоритм шифрування. Він використовується для незворотно затемнення паролів, подібно до того, як хеш-функції використовуються для "однобічного хешу".

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

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

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

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

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

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

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

Отже, моя рекомендація bcrypt випливає з припущень 1), що Blowfish має аналогічний рівень уважності, як сімейство SHA-2 хеш-функцій;


4
+1 чудовий пост. Але у мене є два питання. Біль-риба була замінена на дві риби більше десяти років тому, чи не повинна система використовувати сучасних примітивів? Також тисячі ітерацій здаються марними в таких системах, як веб-додатки, де багато людей входять у будь-який момент. Наприклад, PBKDF2 реалізується лише у сценаріях, коли одночасно входить 1 людина, наприклад функція string2key для зашифрованої файлової системи. Я використовую прислів’я "Якщо його занадто важко для зловмисника, то воно занадто важке для вашого сервера". Що ти думаєш?
грак

17
Я не думаю, що немає нічого поганого у використанні більш сучасного примітиву. Уразливості часто виявляються з плином часу, і Twofish був розроблений, використовуючи знання, отримані від Blowfish. Однак мені невідомі конкретні вразливості, які б привели до недійсності використання Blowfish, тому міг бути зроблений і аргумент "якщо-то-не-зламано". Ваша приказка про зловмисників мені не звучить добре. Навіть якщо ви виберете алгоритм, який вимагатиме років, щоб зловмисник перевірив мільярд паролів, це вимагатиме незначної частки часу в законній програмі.
erickson

15
Якщо ви подивитеся на специфікацію будь-якої хеш-функції, ви нічого не побачите про "сіль". Єдиний параметр - це повідомлення, яке слід переварити. Перегляньте специфікацію будь-якого шифру, і ви побачите, що функція параметризована ключем. "Сіль", яка може (або не може ) використовуватися разом із хешем, є просто частиною повідомлення. Алгоритм хеша не вимагає цього, не обробляє його спеціально і не може відрізняти його від решти повідомлення. Отже, хоча це правда, що повідомлення часто змінюються засолюванням, подане повідомлення створює лише один хеш.
Еріксон

1
@Andre D Як пентестер я звітую про програми, які блокують облікові записи, і я повідомляю про додатки, які не заважають жорстокій силі. В ідеалі IP-адреса, яка порушує правила, повинна вирішити капчу, крім того, якщо ім’я користувача націлено (навіть якщо цього імені користувача не існує), тоді цей обліковий запис повинен вирішити капчу перед автентифікацією. Прийняття растеліміту X в хвилину також прийнятне. Пов'язано: security.stackexchange.com/questions/25444/…
грак

2
@rook: хоча рателімітизація програм є гарною практикою, ви можете припустити, що в цьому випадку база даних була завантажена та розміщена на обладнанні, яке не має обмеження швидкості, яке ви описуєте.
Ellert van Koperen

50

Я погоджуюся з відповіддю Еріксона з одним застереженням: для цілей аутентифікації паролів bcrypt набагато кращий, ніж одна ітерація SHA-512 - просто тому, що це набагато повільніше. Якщо ви не розумієте, чому повільність є перевагою в цій конкретній грі, прочитайте статтю, з якою ви пов’язані ще раз (прокрутіть униз до пункту " Швидкість - саме те, чого ви не хочете в функції хешування пароля ".).

Звичайно, можна створити захищений алгоритм хешування паролів навколо SHA-512, повторивши його тисячі разів, як і алгоритм MD5 MDK PHK. Ульріх Дреппер зробив саме це для крипти glibc (). Немає конкретних причин для цього, якщо у вас вже є тестована реалізація bcrypt.


3
Сподіваюся, моя відповідь дає зрозуміти, що однієї ітерації хешу недостатньо (на жаль, навіть такого рудиментарного рівня знань не можна припустити). "Якщо використовується одна ітерація хеш-функції, зловмисник може робити мільйони випробувань в секунду, використовуючи обладнання, яке коштує близько 1000 доларів, випробовуючи всі паролі довжиною до 8 символів протягом декількох місяців. Якщо, проте, дайджест виводить "повертається" тисячі разів, на те, щоб перевірити один і той же набір паролів на цьому апараті, знадобиться сотні років. Bcrypt досягає такого ж ефекту "ключового посилення" шляхом ітерації ... "
erickson

@erickson: Так, хоча я думаю, що ви, можливо, поховали там лед. Я намагався зробити те, що пряме порівняння bcrypt та SHA-512 насправді не має значення, оскільки одна є ключовою функцією деривації, а інша - просто криптографічним примітивом, непридатним самостійно.
caf


1
Використання тисяч раундів SHA-512 не є нечуваним і, враховуючи його включення до різних cryptреалізацій (у тому числі в PHP, який я використовую), коли я читав оригінальне запитання, я навіть припускав, що це означає ОП, коли він запитав про SHA-512 - що він насправді мав на увазі тисячі раундів SHA-512 проти bcrypt, який використовує сотні чи тисячі ітерацій.
thomasrutter

33

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

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

Це 2 різні речі, призначені для використання в різних завданнях. Немає "правильної" відповіді на те, "чи крапчиво краще, ніж SHA512?" Ви також можете запитати "чи яблука краще, ніж кенгуру?"

Якщо ви хочете ознайомитись ще з темою, ось декілька посилань:


18
Я думаю, що питання полягає у використанні bcrypt як незворотного захисту паролів, наскільки для цього використовується хешування.
erickson

3
@erickson текст "Q: але чи Blowfish краще, ніж SHA512?" мені здається досить зрозумілим і показує, що ОП не розуміє відмінностей між двома алгоритмами
Глен

1
ОП тут. Насправді, ґрунтуючись на визнанні Глена, що blowfish - це алгоритм шифрування (який я розумію, відрізняється від хешування), я розумію, що моє питання так було заплутано. Зараз, однак, заплутано те, що клас phpass (який я вважаю, що використовується для хешування паролів) використовує bcrypt (тобто, удар, тобто шифрування). Якщо blowfish - це шифрування, то як приходить phpass використовувати його для хеш-паролів, мені здається недоліком, ні? Я щось пропускаю?
Кріс

2
однак питання задає питання, які з яблук та кенгуру краще підходять для конкретного завдання. Blowfish є кращою функцією хешування, ніж sha через час, який припадає на хеш. Більшість реалізацій ша, які я бачив, дуже швидкі. Вам потрібно повільний алгоритм хешування паролів.
Джон Миколай

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

4

Сипуха не краща за MD5 або SHA512, оскільки вони служать різним цілям. MD5 і SHA512 є алгоритмами хешування, Blowfish - алгоритм шифрування. Дві абсолютно різні криптографічні функції.


2

Я рекомендував би реалізацію криптовалюти на основі SHA-256 / SHA-512 Ulrich Drepper.

Ми перенесли ці алгоритми на Java, і ви можете знайти їх вільно ліцензовану версію на ftp://ftp.arlut.utexas.edu/java_hashes/ .

Зауважте, що більшість сучасних (L) Unices підтримують алгоритм Drepper у своїх / etc / тіньових файлах.


PWDTK sourceforge.net/projects/pwdtknet використовує HMAC-SHA512, однак це робиться під час багатьох ітерацій, щоб створити "повільність" ака-розтягування, як говорили інші. BCrypt краще, ніж один SHA-512, як уже згадувалося, однак, якщо ви використовуєте SHA-512 у чомусь подібному PBKDF2, то ви добре захищені (Поки ви використовуєте велику крипто-випадкову сіль і достатньо ітерацій, щоб примусити час зробити таблицю веселки) в API Я тільки що відправлену побудований мною і буде робити те , що ви хочете в .NET , якщо це те , що ви розробляєте для (для читачів майбутніх вигод)
thashiznets

2

Я щойно натрапив на це:

http://codahale.com/how-to-safely-store-a-password/

Чи може автор цієї статті помилитися?


2
Справа не в тому, що він помиляється, це просто те, що він ігнорує велику кількість літератури про те, як застосовувати алгоритми хешу, а саме. їх слід ітераційно використовувати в ключових функціях деривації, як це робить bcrypt.
erickson
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.