引用:
安全存储密码
把密码明文存储在数据库中是极其危险的,假如攻击者窃取了你的数据库,那么用户的账号和密码就会被直接泄露。更保险的方式是对每个密码进行计算生成独一无二的密码散列值,这样即使攻击者拿到了散列值,也几乎无法逆向获取到密码。
Flask 的依赖 Werkzeug 内置了用于生成和验证密码散列值的函数,werkzeug.security.generate_password_hash()
用来为给定的密码生成密码散列值,而 werkzeug.security.check_password_hash()
则用来检查给定的散列值和密码是否对应。使用示例如下所示:
from werkzeug.security import generate_password_hash,check_password_hash
import unittest
class MyTest(unittest.TestCase):
def test_password(self):
password = 'my_password_123'
p_hash_1 = generate_password_hash(password)
print("p_hash_1: ", p_hash_1)
p_hash_2 = generate_password_hash(password)
print("p_hash_2: ", p_hash_2)
print("password 与 p_hash_1 是否相等: ",check_password_hash(p_hash_1, password))
print("password 与 p_hash_2 是否相等: ",check_password_hash(p_hash_2, password))
'''
p_hash_1: pbkdf2:sha256:260000$MhRcKnKgUDUUclp6$3906c09a8476c5c82f5442e8fed4ac2c0ba1027b13dd1621ca8fc0e876ad3f52
p_hash_2: pbkdf2:sha256:260000$2mQbaSTwXxSFg1FT$c653be4b90d8f32340ae8e3975bb29d18f77b38915e93c7f0be94c0acc76f9be
password 与 p_hash_1 是否相等: True
password 与 p_hash_2 是否相等: True
'''
同一密码每次生成散列值不同, 但是根据算法还是可以判断出是否与原密码相同。