Как я могу проверить ха sh, сгенерированный Flask -Security, без его использования? - PullRequest
1 голос
/ 15 марта 2020

У меня запущено приложение Flask, на котором установлена ​​Flask -Безопасность. Мой config.py файл выглядит следующим образом:

...

# Flask-Security config
SECURITY_URL_PREFIX = "..." # my URL prefix
SECURITY_PASSWORD_HASH = "pbkdf2_sha512"
SECURITY_PASSWORD_SALT = "..." # my 29-character long salt

...

, и он генерирует ха sh, как это в базе данных:

$pbkdf2-sha512$25000$pXROaU2JUSrlnDPm3BsjBA$ckspsls2SWPhl9dY7XDiAZh5yucWq27fWRuVj4aOUc5dA2Ez5VH1LYiz5KjaZJscaJYAFhWIwPhkAsHiPOrvrg

, который является паролем 123456, хэшированный.

В другом приложении мне нужно было проверить этот ha sh, но с помощью Flask -Безопасность требует, чтобы я был в Flask приложение с такими же настройками. Я перепробовал много вещей, но я просто не могу подтвердить этот пароль без Flask -Безопасности, и ДОЛЖЕН быть способ сделать это. Ребята, не могли бы вы помочь мне в этом?

1 Ответ

0 голосов
/ 16 марта 2020

Хорошо, так что благодаря @jwag и еще нескольким поискам исходного кода Flask -Security мне удалось это сделать.

Для тех, кто находится в той же ситуации, вот что я сделал:

import hmac
import hashlib
import base64
from passlib.context import CryptContext

text_type = str
salt = "YOUR_SALT_HERE"

def get_pw_context ():
  pw_hash = 'pbkdf2_sha512'
  schemes = ['bcrypt', 'des_crypt', 'pbkdf2_sha256', 'pbkdf2_sha512', 'sha256_crypt', 'sha512_crypt', 'plaintext']
  deprecated = ['auto']
  return CryptContext (schemes=schemes, default=pw_hash, deprecated=deprecated)

def encode_string(string):
  if isinstance(string, text_type):
    string = string.encode('utf-8')
  return string

def get_hmac (password):
  h = hmac.new(encode_string(salt), encode_string(password), hashlib.sha512)
  return base64.b64encode(h.digest())

def verify_password (password, hash):
  return get_pw_context().verify(get_hmac(password), hash)

# Finally
verify_password ("MY_PASSWORD", "MY_PASSWORD_HASH")
...