как безопасно хранить соль пароля

Я использую pbkdf2 для соления и хеширования паролей. Я понимаю, что соль должна быть незашифрованной и доступной, чтобы я мог снова использовать ее для проверки. Соль каждого пароля должна быть доступна, чтобы я мог солить и хэшировать пароль, который нужно проверить, и сравнить его с сохраненным.

Я думал хранить соль вот так

Предполагая, что соль всегда является строкой фиксированной длины, например, 10 символов.

finalPassword = salt + password;
//save finalPassword in the db

а затем проверить

salt = getFirst10CharsOf (finalPassword);

hash to-be-validated password with that salt

compare hashed password with the saved one

Мой вопрос: если хакер достаточно умен, чтобы получить мои хешированные пароли, что мешает ему увидеть часть getFirst10CharsOf в моем коде и получить пару солей, чтобы она могла легко расшифровать пару хешей?

Я нашел много теории, но понятия не имею, как безопасно хранить соли на практике. Таким образом, они всегда могут быть доступны только для кода проверки, но не для всех.

Спасибо


person slevin    schedule 26.12.2015    source источник
comment
Этот вопрос кажется расширением этого другого вопроса SO.   -  person zaph    schedule 26.12.2015
comment
@zaph Да, это указано в части соли и спрашивает, верна ли моя идея о сохранении соли.   -  person slevin    schedule 26.12.2015


Ответы (2)


Соль не обязательно должна быть секретной, она используется для нескольких целей: 1. для затруднения использования радужных таблиц и 2. для обеспечения того, чтобы два пароля не хешировали одно и то же значение, чтобы, если один будет скомпрометирован, другие одинаковые пароли не будут ( разные хеши).

person zaph    schedule 26.12.2015

что ей мешает увидеть в моем коде часть getFirst10CharsOf и получить пару солей,

Ничего такого

чтобы она могла легко расшифровать пару хешей?

Смысл использования одностороннего хеширования в том, что вы не можете расшифровать их (даже с солью).

Смысл использования соли (и каждый раз другой) в том, что вы не можете перебрать их с помощью радужной таблицы.

Я понятия не имею, как безопасно хранить соли на практике.

Просто сохраните их с хешированным паролем. Нет необходимости держать их в недоступности.

Таким образом, они всегда могут быть доступны только для кода проверки, но не для всех.

Если бы можно было хранить данные где-нибудь, к чему ваш код может получить доступ, но кто-то не сможет получить незаконный доступ к системе, в которой работает код, тогда вообще не было бы необходимости хэшировать пароли.

person Quentin    schedule 26.12.2015
comment
Хороший ответ. Итак, чтобы было ясно, мой подход безопасен, и я должен его развернуть? - person slevin; 26.12.2015
comment
@slevin - на самом деле соль должна быть длиннее 10 символов. Существует широко используемый общий формат, как хранить соль. Я бы порекомендовал найти существующую библиотеку BCrypt / PBKDF2, которая генерирует безопасную соль и создает этот перспективный формат. - person martinstoeckli; 05.01.2016