Мой вопрос заключается в том, должна ли соль быть случайной и сохраняться в БД, как это, или я могу сгенерировать 10-байтовую соль и сохранить ее в своем коде и всегда использовать ту же самую соль, чтобы сохранить себя, сохраняясоль в БД и просто хранить ключ?
АБСОЛЮТНО НЕ.
Вы вообще не понимаете назначение соли, если выдаже задавая этот вопрос.
Цель соли - произвольно усложнить для злоумышленника использование предварительно вычисленной таблицы хешированных общих паролей.Если соль всегда одна и та же, то злоумышленник просто вычисляет таблицу хэшированных общих паролей с этой солью.
Позвольте мне прояснить это.Предположим, что злоумышленник получил вашу базу данных паролей и в свободное время проводит атаку на все сохраненные хэши, чтобы выяснить, какой пароль соответствует хешу.Если каждая соль различна, то злоумышленник должен выполнить свежую атаку против каждой записи в базе данных.Если каждая соль одинакова, то атакующий одного пользователя атакует каждого пользователя .
Более того: предположим, что вы используете одну и ту же соль для каждого пользователя.Предположим, у двух пользователей один и тот же пароль.И предположим, что злоумышленник получил базу паролей. Злоумышленник теперь знает, какие два пользователя имеют один и тот же пароль , поскольку они имеют одинаковый соленый хеш, и может сделать разумное предположение, что это самый слабый пароль в базе данных .Злоумышленник может сосредоточить свои усилия (какими бы они ни были) на атаке этого пользователя в частности.И как только она узнает пароль этого пользователя, велика вероятность, что пользователь использовал это имя пользователя и слабый пароль в других системах, которые злоумышленник может теперь скомпрометировать , не имея своих файлов паролей.
Хорошо, что вы хотите узнать о безопасности;плохо, что вы пытаетесь написать настоящую систему паролей с вашим уровнем понимания.Если это для реальной системы, которая должна защищать реальных пользователей, используйте систему, созданную экспертами , или нанимайте своего собственного эксперта .Вы создадите систему, которую вы не сможете сломать, а не систему, которую атакующий не сможет сломать.
Более того: youпросят незнакомцев в интернете о помощи по безопасности .Незнакомцы, о которых вы не знаете, знают ли они, о чем говорят, или просто придумывают. Получить настоящего эксперта по безопасности (а это не я - я эксперт по семантическим анализаторам).Построение системы безопасности является одной из самых сложных задач программирования.Вам нужна профессиональная помощь.
Подробное введение в основные схемы аутентификации по паролю см. в моей серии статей:
http://blogs.msdn.com/b/ericlippert/archive/tags/salt/