Я забезпечу трохи інший погляд на це.
Я завжди зберігаю сіль, змішану з хешем соленого пароля.
Наприклад, я поставлю першу половину солі перед засоленим хешем пароля, а останню половину солі - після засоленого хешу пароля. Програма знає про цю конструкцію, тому може отримати ці дані та отримати хеш солі та солоного пароля.
Моє обґрунтування такого підходу:
Якщо дані про пароль / хеш порушені і потрапляють до рук зловмисника, зловмисник не дізнається, що таке сіль, коли вона переглядає дані. Таким чином, зловмисник практично не може здійснити жорстоку атаку, щоб отримати пароль, який відповідає хешу, оскільки він не знає хеш для початку і не має можливості знати, які частини даних є частиною солі, або частини хешу солоного пароля ( якщо він не знає логіки аутентифікації вашої програми ).
Якщо хеш солоного пароля зберігається таким, який є, тоді може бути здійснена атака грубої сили, щоб отримати пароль, який при соленому і хешированном виданні тих же даних, що і хеш солоного пароля.
Однак, навіть якщо хеш солоного пароля зберігався як є, але попередньо відкладений одним випадковим байтом, доки зловмисник не знає, що цей перший байт слід відкинути, це також збільшить труднощі нападу. Ваша програма знає, як відкинути перший байт даних, коли використовується для автентифікації користувача.
Висновок до цього ..
1) Ніколи не зберігайте дані, які використовує ваша програма аутентифікації, у точно визначеному вигляді.
2) По можливості зберігайте таємницю логіки аутентифікації для додаткової безпеки.
Ідіть на крок далі ..
Якщо ви не можете зберегти таємницю автентифікації вашої програми в таємниці - багато людей знають, як ваші дані зберігаються в базі даних. І припустимо, ви вирішили зберігати хеш солоного пароля, змішаний разом із сіллю, при цьому частина солі є попередньою хеш-соленою паролем, а решта солі додається.
Під час генерування випадкової солі ви також можете випадковим чином визначити, яку частину солі ви будете зберігати до / після хешу солоного пароля.
Наприклад, ви генеруєте випадкову сіль у 512 байт. Ви додасте сіль до свого пароля і отримаєте хеш SHA-512 вашого засоленого пароля. Ви також генеруєте випадкове ціле число 200. Потім ви зберігаєте перші 200 байт солі, а потім хеш солоного пароля, а потім решту солі.
Під час автентифікації введення пароля користувача ваша програма перейде через рядок і припустить, що перший 1 байт даних є першим 1 байтом солі, а потім сольовим хешем. Цей прохід не вдасться. Застосування програми буде продовжено, використовуючи перші 2 байти даних як перші 2 байти солі, і повторювати, поки позитивний результат не буде знайдений після використання перших 200 байт як перших 200 байт солі. Якщо пароль невірний, додаток продовжує пробувати всі перестановки, поки жодна з них не буде знайдена.
Плюси цього підходу:
Підвищена безпека - навіть якщо ваша логіка автентифікації відома, точна логіка невідома під час компіляції. Зробити грубу силу нападу практично неможливо, навіть маючи знання точної логіки. Збільшена довжина солі ще більше підвищить безпеку.
Мінуси цього підходу:
Оскільки точна логіка виводиться під час виконання, такий підхід дуже інтенсивний процесором. Чим більше довжина солі, тим інтенсивнішим є процесорний підхід.
Автентифікація неправильних паролів передбачає найвищі витрати на процесор. Це може бути контрпродуктивним для законних запитів, але підвищує безпеку проти зловмисників.
Цей підхід може бути реалізований різними способами і може бути ще більш безпечним, використовуючи солі змінної ширини та / або солі паролів.