密码存储的主要形式:
密码加密的几类方式:
签名加密算法的数据是无法被反解析成明文的,但因为加密算法的固定性(同样的字符串加密后哈希值是一样的),通过建立加密前后的映射关系,就能暴力破解加密后的哈希值。
import hashlib password_map = {"e10adc3949ba59abbe56e057f20f883e": "123456"} # 哈希值与明文映射表 password = "123456" # 待加密明文 # 加密明文 _md5 = hashlib.md5() _md5.update(password.encode("utf-8")) p_md5 = _md5.hexdigest() print(f"md5加密后的值为:{p_md5},通过md5映射表暴力破解出加密后的密码明文为:{password_map.get(p_md5)}")
加盐哈希加密算法的原理是在加密时混入一段“随机”字符串(盐值)再进行哈希加密。即使密码相同,如果盐值不同,那么哈希值也是不一样的。
import hashlib import random import string def generate_salt_hash(s: str): # 随机生成长度为4的盐值 salt = "".join([random.choice(string.ascii_lowercase) for i in range(4)]) # 拼接原始密码和盐值 s = s + salt # 对加入盐值的字符串加密 _md5 = hashlib.md5() _md5.update(s.encode("utf-8")) return salt + "$" + _md5.hexdigest() # 返回 盐值+哈希值 的字符串 # 原始密码 password = "123456" p_md5_1 = generate_salt_hash(password) p_md5_2 = generate_salt_hash(password) print(p_md5_1) print(p_md5_2)
flask中主要用werkzeug.security 包中的generate_password_hash函数对密码进行加密,以及check_password_hash函数用于验证经过generate_password_hash哈希的密码
generate_password_hash函数语法:
generate_password_hash(password, method="pbkdf2:sha256", salt_length=8)
参数说明:
生成的hash值格式如下:
method$salt$hash
check_password_hash函数语法:
check_password_hash(pwhash, password)
参数说明:
from werkzeug.security import generate_password_hash, check_password_hash # 明文密码 password = "123456" # 生成加密哈希值 p_hash = generate_password_hash(password) print(p_hash) # 验证密码 ret = check_password_hash(p_hash, password) print(ret) ret = check_password_hash(p_hash, "afdasfsda") print(ret)
Flask_generate_password_hash的加盐哈希加密算法与check_password_hash的校验
原文:https://www.cnblogs.com/testlearn/p/14328143.html