py-bcrypt дает другие результаты хеширования, чем flask-bcrypt - возможно?

Я генерирую хэш в приложении 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')

Но это тоже не работает.


person domoarigato    schedule 05.08.2014    source источник


Ответы (1)


Если вы хотите сгенерировать один и тот же хеш, вам нужны и один и тот же пароль, и одна и та же соль.

person Roland Smith    schedule 05.08.2014
comment
хм, кажется, я использую тот же пароль и соль. Соль содержится в хэше для bcrypt, и их API поддерживает передачу полного хэшированного значения для получения соли при проверке. - person domoarigato; 05.08.2014
comment
Теперь я в замешательстве. Вы используете flask-security или flask-bcrypt? поскольку flask-bcrypt не использует отдельный HMAC, посмотрите на исходный код. - person Roland Smith; 05.08.2014
comment
только что говорил с mattupstate, сопровождающим flask-security, по-видимому, он использует оба последовательно, а этап HMAC использует кодировку base 64: мне не хватало части кодировки base64. для справки, шаги (на псевдопитоне): HMAC.base64(пароль, соль, sha256) = 1st_stage bcrypt(1st_stage) открытое пиво Спасибо! - person domoarigato; 05.08.2014
comment
В этом случае вы должны использовать Source. Затем вы сможете увидеть, точно как это делается. И чем вы знаете, как воспроизвести его. - person Roland Smith; 05.08.2014
comment
это то, что я в конечном итоге сделал, хотя сначала я не знал, что это проблема. В любом случае, спасибо за вашу помощь - дал вам голос. - person domoarigato; 05.08.2014