2013-09-25 4 views
2

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

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

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

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

ответ

3

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

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

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

+0

Спасибо за ссылку на документы. Я прочитал документы password_hash() и не думал о чтении функции password_verify() – michaelward82

-1

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

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

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 ") 
+0

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

2

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

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

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

+0

Мне известно о стоимости, но я рад, что вы упомянули об этом. Я решил использовать двоичный файл (60) для хранения хэш-значений - см. Http: // stackoverflow.com/questions/5881169/storing-a-hashed-password-bcrypt-in-a-database-type-length-of-column – michaelward82

+0

@ michaelward82 Обычно я использую сортировку «latin1» для таблиц, которые не хранят значения, зависящие от локали, но 'binary' будет делать все отлично :) –

1

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

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

Смежные вопросы