Привет, ребята, я прочитал о том, как солить пароль, но это может показаться немного странным. Но как я могу хранить и защищать соль. Например, в архитектуре с несколькими шинами говорят, что я использую GUID клиентских машин для генерации моей соли, тогда пользователь ограничивается одной машиной, но если я использую случайную соль, ее нужно где-то хранить. Несколько дней назад я увидел пример приложения, в котором хэш и соль были сгенерированы в клиентской системе всякий раз, когда новый пользователь был создан, а затем соленый пароль и хэш передаются на сервер, где они хранятся на SQL-сервере. Но если я следую этому методу, и база данных будет скомпрометирована, для человека X будут доступны пароли и значения солей для каждого пароля. Итак, должен ли я снова солить/зашифровать пароли и получить соль на стороне сервера? Какова наилучшая практика соления?
Каков наилучший способ соления и хранения соли?
Ответ 1
Сохранение соли, незашифрованной в базе данных рядом с хешированными паролями, не является проблемой.
Цель соли не должна быть секретной. Цель состоит в том, чтобы отличаться для каждого хэша (т.е. случайного) и достаточно долго, чтобы победить использование радужных таблиц, когда атакующий получает свои руки в базе данных.
Смотрите этот отличный пост по теме Томаса Птачека.
edit @ZJR: даже если соли были полностью публичными, они все равно победят преимущество радужных столов. Когда у вас есть данные с солью и хешей, лучшее, что вы можете сделать, чтобы отменить это, - это грубая сила (при условии, что хеш-функция криптографически защищена).
edit @n10i. См. статью wikipedia для безопасной хэш-функции. Что касается размера соли, в популярной реализации bcrypt.gensalt() используется 128 бит.
Ответ 2
Пожалуйста, найдите минутку, чтобы прочитать это очень хорошее описание солей и хеширования