Солити свій пароль: кращі практики?


162

Мені завжди було цікаво ... Що краще, коли солить пароль для хешування: префікса чи постфікса? Чому? Або це має значення, поки ви солите?

Для пояснення: Ми всі (сподіваємось) до цього часу знаємо, що нам слід посолити пароль, перш ніж ми його хешимо для зберігання в базі даних [ Редагувати: Таким чином, ви можете уникнути таких речей, як те, що відбулося нещодавно з Джеффом Етвудом ]. Зазвичай це робиться шляхом об'єднання солі з паролем перед передачею через алгоритм хешування. Але приклади різні ... Деякі приклади солі перед паролем. Деякі приклади додають сіль після пароля. Я навіть бачив деяких, які намагаються покласти сіль в середину.

То який кращий метод, і чому? Чи існує метод, який зменшує ймовірність хеш-зіткнення? Мій Google не знайшов гідного аналізу з цього приводу.

Редагувати: Чудові відповіді, люди! Вибачте, що міг вибрати лише одну відповідь. :)


1
Дивіться також: stackoverflow.com/questions/1645161/…
Жакко

1
@Jaccco: чудовий вклад. Дякую!
Рандольфо

3
Найкраща практика - використовувати криптографічну функцію, яка робить засолювання для вас, використовуючи або PBKDF2 (стандарт), bcrypt або навіть scrypt. Дякую Стівену, що вказав на це.
Maarten Bodewes

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

1
@ Ому Погана рекомендація. 1) Одноразова ітерація SHA-1 занадто швидка, ви повинні використовувати щонайменше 10000, і навіть це досить слабо. 2) Сіль за замовчуванням занадто мала. 8 байт - мінімум, а 16 - рекомендується.
CodesInChaos

Відповіді:


111

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

Слід розглянути ці три речі:

  1. Сіль має бути різною для кожного пароля, який ви зберігаєте. (Це досить поширене непорозуміння.)
  2. Використовуйте криптографічно захищений генератор випадкових чисел.
  3. Вибирайте досить довгу сіль. Подумайте про проблему з днем ​​народження.

Є відмінна відповідь Дейва Шеромана на ще одне запитання, чому слід використовувати випадково генеровані солі замість імені користувача (або інших особистих даних). Якщо ви дотримуєтесь цих пропозицій, це насправді не має значення, куди ви кладете сіль.


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

39
Випадкова сіль для загального сайту є поганою, оскільки зловмисник може попередньо обчислити веселкові таблиці та захопити всю вашу базу даних користувачів. Якщо ви цього не розумієте, будь ласка, не пишіть системи входу / безпеки :) - вам ПОТРІБНІ солі для кожного користувача.
snemarch

3
Так, сіль на кожного користувача. В ідеалі - ітерації на кожного користувача, що зберігаються (щоб ви могли збільшити кількість ітерацій, використаних у часі). Будь-яка гідна основа матиме це вбудований. (.NET має PasswordDeriveBytes, який буде обробляти все за вас.)
MichaelGG

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

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

27

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

Той факт, що саме там, має перемогти веселкові столи.

Модель загрози, на яку я натякав, буде сценарієм, коли противник може додавати до пароля райдужні таблиці звичайних солей. (Скажіть АНБ) Ви здогадуєтесь, що вони або додали його, або попередньо, але не обидва. Це нерозумно, і це погана здогадка.

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

Як я вже сказав. Це семантика. Виберіть іншу сіль для пароля, довгу сіль та додайте до неї непарні символи, як символи та коди ASCII: © ¤¡


@onebyone, чорт! Він виявив мою сіль "passwordsalt"!
Самуїл

6
@Samuel: Я не знаю про вас, хлопці, але ми використовуємо '12345' для своєї солі. :)
Рандольфо

@onebyone дійсний. Я справді мав на увазі "загальний", як "всі солі довжиною X у наборі символів Y", де X, Y є розумними; скажімо, 20 символів та буквено-цифрові верхні та малі літери. Розширюється, щоб сказати всі шістнадцяткові рядки під довжиною Z (скажімо, 160), оскільки я думаю, що райдужна таблиця хешованих хешів буде корисною ..
Том Ріттер,

1
@Randolpho: Гей, це теж моя сіль! Які шанси?
Адріан

І переконайтеся, що сіль не передбачувана / Випадково: stackoverflow.com/questions/1645161/…
Jacco

18

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

HMAC - кращий підхід, але навіть тоді, якщо ви використовуєте щось на зразок SHA-1, ви вже вибрали алгоритм, непридатний для хешування паролів через його дизайн для швидкості. Використовуйте щось на кшталт bcrypt або, можливо, scrypt, і виймайте проблему з ваших рук цілком.

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


1
Щодо останнього абзацу: як міг зловмисник отримати будь-яку інформацію про точну кількість символів порівняння не вдалося? Це не має сенсу ..
halloweenlv

1
Ви і правильні, і неправильні. Тимчасові атаки реальні і неодноразово демонстрували свою життєздатність із страхітливою точністю навіть через мережеві з'єднання із змінною затримкою, щоб точно визначити, де порівняння не вдалося. Однак це означає, що тимчасові атаки насправді не застосовуються до загальних хешів паролів, оскільки обчислювально неможливо знайти входи, які змінюють лише невеликі частини результату.
Стівен Тузет

9

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


1
Зіткнення хешу залежать від розміру хешу. Завдяки іменинниці зіткнення є цілком ймовірними.
Георг Шоллі

2
Тільки якщо ви усічете результат. У будь-якому разі, я все ще стою те, що це не змінить місця, де знаходиться сіль, тому що точка хешу полягає в тому, щоб співвідношення між входом і виходом не містило шаблонів.
Філ Х

7

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

Що є важливим, проте, використовують довгі солі, генеруючи їх з відповідним криптографічним ПСЧ, і з кожним користувачем сіллю. Зберігання солі для кожного користувача в базі даних це НЕ проблема безпеки, використовуючи веб-вузол хеша є .


2
Неправильне враження: зловмисник може попередньо обчислити MD (пропуск) для багатьох часто використовуваних паролів, а потім дуже дешево обчислити MD (пас + сіль), оскільки дайвінг роботи працює поступово, щоб підтримувати потокове передавання.
Ерван Легранд

5

Перш за все, термін "райдужний стіл" послідовно вживається. Стіл «веселка» - це просто особливий вид таблиці пошуку, який дозволяє стиснути певний вид даних на клавішах. Торгуючи обчисленнями простору, таблицю пошуку, яка займе 1000 ТБ, можна стиснути в тисячу разів, щоб її можна було зберігати на меншому накопичувачі.

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

@ onebyone.livejournal.com:

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

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

Для простої хеш-функції, яка сканує лінійно через вхідний рядок, наприклад, простий лінійний конгруентний генератор, це практична атака. Але криптографічно захищена хеш-функція свідомо розроблена таким чином, щоб мати кілька раундів, кожен з яких використовує всі біти вхідного рядка, так що обчислення внутрішнього стану безпосередньо перед додаванням солі не має сенсу після першого раунду. Наприклад, SHA-1 має 80 патронів.

Більше того, алгоритми хешування паролів, такі як PBKDF, складають свою хеш-функцію кілька разів (рекомендується повторити PBKDF-2 мінімум 1000 разів, кожна ітерація, застосовуючи SHA-1 двічі), що робить цю атаку вдвічі непрактичною.


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

4

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


3
Як я знаю, BCrypt Hash потребує засолювання, як і будь-яка інша схема хешування.
Жакко

2

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

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