如何在不使用 Flask-Security 的情况下验证由 Flask-Security 生成的哈希值?
How can I validate a hash generated by Flask-Security without using it?
我有一个装有 Flask-Security 的 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-sha512000$pXROaU2JUSrlnDPm3BsjBA$ckspsls2SWPhl9dY7XDiAZh5yucWq27fWRuVj4aOUc5dA2Ez5VH1LYiz5KjaZJscaJYAFhWIwPhkAsHiPOrvrg
这是密码 123456
散列。
在另一个应用程序中,我需要验证此散列,但通过使用 Flask-Security,它要求我在具有相同配置集的 Flask 应用程序中。
我已经尝试了很多东西,但如果没有 Flask-Security,我就无法验证这个密码,而且必须有一种方法可以做到这一点。
你们能帮我解决这个问题吗?
好吧,多亏了@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")
我有一个装有 Flask-Security 的 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-sha512000$pXROaU2JUSrlnDPm3BsjBA$ckspsls2SWPhl9dY7XDiAZh5yucWq27fWRuVj4aOUc5dA2Ez5VH1LYiz5KjaZJscaJYAFhWIwPhkAsHiPOrvrg
这是密码 123456
散列。
在另一个应用程序中,我需要验证此散列,但通过使用 Flask-Security,它要求我在具有相同配置集的 Flask 应用程序中。
我已经尝试了很多东西,但如果没有 Flask-Security,我就无法验证这个密码,而且必须有一种方法可以做到这一点。
你们能帮我解决这个问题吗?
好吧,多亏了@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")