Я генерирую хэш в приложении Python, используя пакет flask-bcrypt поверх flask-security. Для пароля test12 я получил результат «$ 2a $ 12 $ ibinoz7sTc76Vh09shUhruYD8CrJyUxPpu1m.kb6LmFmzvWBbb52a».
(использовал случайно сгенерированную соль, согласно документации bcrypt)
но когда я делаю следующее в терминале Python:
import py-bcrypt
print bcrypt.hashpw("test12", '$2a$12$ibinoz7sTc76Vh09shUhruYD8CrJyUxPpu1m.kb6LmFmzvWBbb52a')
Я получаю: $2a$12$ibinoz7sTc76Vh09shUhru1wllZi3KqQEluhhInj5FAghM4uczmxe
когда я думаю, что мне следует вернуть оригинал в качестве совпадения. Я также проверил с помощью .checkpw, и он возвращает False.
Что я делаю неправильно? Могут ли они дать разные результаты? Мое приложение отлично аутентифицируется.
ОБНОВЛЕНИЕ: когда я вручную вызываю (в приложении Flask) print check_password_hash('$2a$12$ibinoz7sTc76Vh09shUhruYD8CrJyUxPpu1m.kb6LmFmzvWBbb52a', 'test12')
, я также получаю False. действительно очень странно, учитывая, что «test12» работает для входа в систему. Если я сгенерирую новый хэш пароля в приложении и проверю его, используя приведенное выше, он пройдет.
ОБНОВЛЕНИЕ 2: я узнал, что flask-security использует HMAC, а также выбранный бэкэнд для хэширования паролей (в моем случае bcrypt), и я подозреваю, что это может быть причиной несоответствия. Предполагая, что это правда, возникает вопрос, как проверить хэш пароля, к которому применяются как HMAC, так и bcrypt. Мое приложение настроено на предоставление секретного ключа в виде соли HMAC (sha512), поэтому я попытался:
result = hmac.new('...my apps secretkey...', 'test12', hashlib.sha512).hexdigest()
print bcrypt.checkpw(result, '$2a$12$ibinoz7sTc76Vh09shUhruYD8CrJyUxPpu1m.kb6LmFmzvWBbb52a')
Но это тоже не работает.