我如何验证由FlaskSecurity生成的哈希而不使用它?

2024-04-16 18:43:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个正在运行的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

...

它在数据库上生成如下哈希:

$pbkdf2-sha512$25000$pXROaU2JUSrlnDPm3BsjBA$ckspsls2SWPhl9dY7XDiAZh5yucWq27fWRuVj4aOUc5dA2Ez5VH1LYiz5KjaZJscaJYAFhWIwPhkAsHiPOrvrg

这是散列的密码123456

在另一个应用程序中,我需要验证此散列,但通过使用Flask安全性,它要求我位于具有相同配置集的Flask应用程序中。
我已经尝试了很多方法,但如果没有Flask Security,我无法验证此密码,必须有一种方法来验证。
你们能帮我一下吗


Tags: 文件方法pyconfig应用程序url密码flask
1条回答
网友
1楼 · 发布于 2024-04-16 18:43:38

好的,多亏了@jwag和对Flask安全源代码的进一步挖掘,我成功地做到了这一点

对于那些处境相同的人,以下是我所做的:

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

相关问题 更多 >