Перенести хэш пароля bcrypt из PHP в Python - ValueError: Недопустимая соль hashed_password - PullRequest
0 голосов
/ 18 октября 2018

У меня есть приложение PHP7, которое хэширует пароли пользователей, например:

$hash = password_hash($password, PASSWORD_BCRYPT);

Например, если я передам test1234, я получу:

$2y$10$aazE9OUKZlOQiM6axwxU/utpOURLQ58pluqtFZkkGE3R9ShtUxBOm

СейчасУ меня есть приложение Python, которое также должно обновлять пароли пользователей.Он использует что-то вроде этого:

import bcrypt

hash = bcrypt.hashpw(password, bcrypt.gensalt())

Например, тот же пароль test1234 хешируется как:

$2a$12$vsI9Vf9gWj/Au3McYradxuozyZychmlfqoCJcSacDWuMzUDVpv33m

Как вы можете видеть, PHP сгенерировал $2y, где Python сделал$2a - так что это несколько разные версии хэшей.

Теперь, если я попытаюсь проверить, хэши Python и PHP, в PHP вот так:

$result = password_verify($password, $hash);

Iиметь true в обоих случаях.Но, если я попытаюсь проверить оба на стороне Python:

bcrypt.checkpw(password, hash)

Это работает только тогда, когда я передаю хэш, сгенерированный в Python.Если я передаю хэш, сгенерированный в PHP, я получаю:

Traceback (most recent call last):
   File "<stdin>", line 1, in <module>
ValueError: Invalid hashed_password salt

Мой вопрос: есть ли что-то, чего мне не хватает?

Модуль bcrypt поставляется py-bcrypt проект версии 0.4, который я установил с помощью pip:

pip3 install py-bcrypt

1 Ответ

0 голосов
/ 18 октября 2018

2y и 2a являются двумя различными версиями алгоритма bcrypt .Как гласит Википедия, 2y - это , специфичный только для PHP * :

В июне 2011 года была обнаружена ошибка в crypt_blowfish, реализации PHP BCrypt. [...] Они также предложили идею иметь crypt_blowfish emit $2y$ для хэшей, генерируемых фиксированным алгоритмом.

Никто другой, включая канонический OpenBSD, не принял идею 2x /2y.Это изменение маркера версии было ограничено crypt_blowfish.

Модуль py-bcrypt отстал здесь, поскольку он поддерживает только версию 2a!По состоянию на февраль 2014 года версия 2b является текущей версией (исправлена ​​ошибка хеширования паролей длиной более 255 символов).Текущая версия 0.4 была выпущена в 2013 году, поэтому на данный момент я считаю проект мертвым.

Вместо этого вам следует установить bcrypt project .Хотя он поддерживает только с 2a и 2b до генерации хешей, он явно поддерживает нормализацию 2y хешей для обработки их как 2b хешей , и поэтому у меня не было проблемпроверка хеша 2y с использованием этого проекта:

>>> import bcrypt
>>> bcrypt.__version__
'3.1.4'
>>> hash = b'$2y$10$aazE9OUKZlOQiM6axwxU/utpOURLQ58pluqtFZkkGE3R9ShtUxBOm'
>>> bcrypt.checkpw(b'test1234', b'$2y$10$aazE9OUKZlOQiM6axwxU/utpOURLQ58pluqtFZkkGE3R9ShtUxBOm')
True
...