一、密码加密介绍
- 用户密码不能明文存放到数据库,需要加密处理后密文保存
- 如果密码明文存放数据库,一旦数据库被攻破,不仅拿走用户信息,用户密码也就直接暴露了
- 如果密码密文存放数据库,一旦数据库被攻破,虽然也拿走用户信息,不能直接知道用户密码,不需要花费一定时间去破解密码,才能登录上用户的帐号
- 以前用的较多的是MD5,不可逆的加密算法。MD5加密有个特点:密码加密之后密文就固定了,如果有人把常用密码的MD5加密密文都保存到数据库,就相当于密码是相对公开的了,所以MD5加密不是被破解了,是被变相的破解了。
- 现在一般不直接用MD5加密,采用MD5+ salt(盐),相当于MD5+随机字符串,提高破解难度,也不特别安全
- 现在一般用 sha1 sha256,相当于把MD5 和 盐都保存起来了,更难被破解
- 密码加密算法一般都写在 user模型里面
二、密码加密实现
- 这里采用flask提供的密码加密算法 werkzeug.security.generate_password_hash 和check_password_hash
1、修改user类,增加密码加密方法
- 对密码明文加密后,直接修改类的属性password_hash
def passwd_hash(self,origin_password):
'''对密码进行加密'''
self.password_hash=generate_password_hash(origin_password)
2、调用
- 直接调用user类的方法
user.passwd_hash(password)
3、利用装饰器进行优化
3 .1 密码加密方法优化
- 利用装饰器对密算法进行优化
@property
def password(self):
"""读取属性的方法"""
# return self.password_hash # 该属性不应调用,调用抛出异常
raise AttributeError('这个属性只能设置,不能读取')
@password.setter
def password(self, value):
"""设置属性"""
# 调用方法 user.password = password
self.password_hash = generate_password_hash(value)
3.2 调用优化
user.password = password
三、密码校验实现
- 采用flask提供的密码加密算法 check_password_hash方法实现密码校验
1、修改user类,增加密码加密方法
# loghome/models.py
def check_pwd_hash(self, password):
"""验证密码的正确性"""
# check_password_hash(密文, 明文)
return check_password_hash(self.password_hash, password)
2、调用方法
user.check_pwd_hash(password)