Этот пост может слишком отклониться от вашего первоначального вопроса, но я надеюсь, что вы найдете его полезным;
Безопасность - это преодоление барьеров и препятствий;глубокоэшелонированная защитаНе существует действительно безопасного решения хеширования, только те, которые трудно взломать.Это похоже на установку охранной сигнализации и оконных замков в вашем доме - сделать ваш сайт менее привлекательным для взлома, чем чужой.
Соль для алгоритма склепа - лишь малая часть проблемы безопасности.Одна соль просто означает, что при попытке взломать пароль для нескольких пользователей нужно разобраться на одну вещь меньше.Соль с низкой энтропией (например, время сервера) делает его немного сложнее, а соль с высокой энтропией - еще труднее.Какой из них использовать, и нужно ли о чем-то беспокоиться, в первую очередь зависит как от чувствительности данных, которые вы защищаете, так и от других мер безопасности, которые вы используете.Сайт, который просто дает персонализированный прогноз погоды для выбранного города, очевидно, имеет менее конфиденциальные данные, чем сайт, на котором указан ваш домашний адрес, девичья фамилия матери, дата рождения и другая информация, которую можно использовать для идентификации.
Так вот в чем проблема;соль с высокой энтропией все еще является плохой солью, если ее легко получить.
В реальном мире хранение соли в базе данных (случайной или нет), вероятно, менее безопасно, чем использование постоянной соли и ее захоронение подальше отличные глаза в файле, недоступном через веб-браузер.Трудно угадать уникальную соль с высокой энтропией, но если вы разрешили вход в систему с любого сервера на MySql и установили пароль на «пароль», это на самом деле не имеет значения!Покажите, как легко взломать базу данных по сравнению с получением действительного имени входа на ваш сервер - что, возможно, труднее сделать дискретно, так как вы можете установить fail2ban и множество других средств наблюдения за векторами атаки в зависимости от вашей настройки.
Вы можете объединить два подхода, сохранив местоположение файла, содержащего специфическую для пользователя соль в базе данных, а не саму соль.Необходимость взлома как файловой системы, так и базы данных зависит от того, оправдывает ли чувствительность данных, которые вы пытаетесь защитить, эти издержки.
Еще одна альтернативная рекомендация экспертов по безопасности - сохранить имя пользователя в отдельной базе данных (и, в идеале, другую технологию), пароль и ссылку между ними, используя UUID.Например, используйте MySQL и SQLite.Это означает, что обе базы данных должны быть взломаны (а также, поэтому, чтобы перейти к отдельной кроличьей норе ради примера, не следует хранить данные пользователя и номера кредитных карт в одной базе данных, так как одна из них бесполезна бездругое).
Обратите внимание, что такие алгоритмы, как SHA-512 и Blowfish, могут возвращать соль как часть своего хэша.Будьте осторожны с этим, как будто вы сохраняете полный хэш, вы отдаете алгоритм, а это значит, что хакерам нужно разобраться на две вещи меньше (соль также выдает алгоритм).
Убедитесь, что вы применяете сильныйпароли и имена пользователей, поэтому атаки по словарю будут неудачными;Мне известны словари для всех 6-буквенно-цифровых комбинаций записей имени пользователя и пароля для MD5, и я подозреваю, что есть больше, чем это доступно для всех видов алгоритмов.С появлением недорогих облачных и CPGPU-вычислений размер и сложность доступных словарей будет стремительно расти.
В конечном счете, самый безопасный способ - никогда не генерировать соль программным способом, а требовать, чтобы пользователь вводил ее вместе со своим именем пользователя и паролем по SSL-ссылке (поэтому нельзя было ее отследить), но никогда не сохранял ее. Это подход, принятый компаниями-эмитентами кредитных карт; то есть 3-значный ключ безопасности CSV на вашей кредитной карте, который вы должны вводить каждый раз при покупке через Интернет, поскольку он никогда не должен храниться в какой-либо базе данных. Если вы действительно хотите создать соль, отправьте ее им отдельно (например, через SMS-сообщение или по электронной почте) и все равно заставляйте их вводить ее каждый раз вручную. При таком подходе, хотя и более безопасном, вам необходимо сопоставить сложность с тем, не перестанут ли пользователи просто использовать сайт, поскольку вы сделали его слишком сложным для него.
Все вышеперечисленное все еще основывается на том факте, что у вас также есть защита от перехвата сеансов, межсайтовых сценариев и т. Д. И т. Д. Самый сильный в мире алгоритм паролей не имеет значения, если все, что мне нужно сделать, - это вычислить действительный PHPSESSID для вошедшего в систему пользователя и взломать его!
Я не эксперт по безопасности, но прочитал об этом столько, сколько смог. Тот факт, что на эту тему так много книг, показывает, насколько велик ответ на ваш вопрос.
Несколько действительно замечательных книг, которые вы могли бы попробовать, которые я нашел бесценными;
Уязвимости веб-приложений: обнаружение, использование, предотвращение - ISBN-13: 978-1-59749-209-6
Предотвращение веб-атак с помощью Apache - ISBN-13: 978-0-321-32128-2