PHP password_hash(): переносятся ли хэши паролей между системами?

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

Насколько я понимаю, хэш bcrypt содержит все необходимые компоненты, которые в сочетании с простым текстовым паролем могут быть проверены. Из-за этого хэш можно передать в любую систему с совместимой реализацией и использовать для проверки.

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

Это правильно?


person michaelward82    schedule 25.09.2013    source источник


Ответы (4)


Да, это правильно. В документации для password_verify указано:

Обратите внимание, что password_hash() возвращает алгоритм, стоимость и соль как часть возвращаемого хэша. Поэтому вся информация, необходимая для проверки хэша, включена в него. Это позволяет функции проверки проверять хэш без необходимости отдельного хранения соли или информации об алгоритме.

Конечно, также легко увидеть, что эта информация есть, проверив вывод password_hash и crypt (что, если немного обобщить, в основном одно и то же).

person Jon    schedule 25.09.2013
comment
Спасибо за ссылку на документы. Я прочитал документы password_hash() и не подумал читать о функции password_verify() - person michaelward82; 25.09.2013

Да, хэши на основе crypt() переносимы; они могут быть переданы в любую систему и могут быть использованы для успешной проверки заданного пароля, поскольку он содержит все необходимые данные для выполнения этой проверки.

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

Также позаботьтесь о требованиях к хранению; если вы всегда собираетесь использовать bcrypt, безопасно хранить хэши паролей в столбцах varchar(60). В противном случае рекомендуется varchar(255).

person Ja͢ck    schedule 25.09.2013
comment
Я знаю о проблеме стоимости, но я рад, что вы упомянули об этом. Я решил использовать двоичный код (60) для хранения хэш-значений - см. stackoverflow.com/questions/5881169/ - person michaelward82; 25.09.2013
comment
@ michaelward82 michaelward82 Обычно я использую сортировку latin1 для таблиц, в которых не хранятся значения, зависящие от локали, но binary тоже подойдет :) - person Ja͢ck; 26.09.2013

Алгоритм bcrypt включает в себя собственный вектор и/или соль и должен быть переносимым. Ни хэш, ни векотор/соль не содержат ничего специфичного для системы.

Это также должно быть применимо к любому другому алгоритму, который либо не использует vecotr (или другой элемент в дополнение к хэшу), либо включает этот хэш в свой вывод.

person ToBe    schedule 25.09.2013

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

пример (с шифрованием)

INSERT INTO table (pass_hash,....) VALUES ( MD2 | MD4 | MD5 | SHA | SHA1 | SHA2_256 | SHA2_512 (" $password ") )
SELECT * FROM table WHERE pass_hash = MD2 | MD4 | MD5 | SHA | SHA1 | SHA2_256 | SHA2_512 (" $password ")
person timod    schedule 25.09.2013
comment
Мы уже используем хэши. Мне нужно знать, есть ли какая-либо причина, по которой я не могу взять хэш, сохранить его в другом месте для другой системы и при этом ожидать проверки хэша. Я не вижу актуальности этого ответа. - person michaelward82; 25.09.2013