我们直接开始 蓝色为标题,灰色为代码,每一步更新代码,都会从第一步代码延续 首先,这是一个普通形式的数据库后台user表(已经用sqlalchemy映射到数据库了) class CMSUser(db.Model): __tablename__ = 'cms_user' id = db.Column(db.Integer,primary_key=True,autoincrement=True) username = db.Column(db.String(50),nullable=False) password = db.Column(db.String(100),nullable=False) email = db.Column(db.String(50),nullable=False,unique=True) join_time = db.Column(db.DateTime,default=datetime.now)
此时我们的password密码内容,是明文展示的状态
之后,开始我们的加密处理
在这一步里,使用了 property 函数(作用:将方法属性化,使其可以被当做属性访问)
并更改密码字段,避免出现同名重复调用
class CMSUser(db.Model):
__tablename__ = 'cms_user'
id = db.Column(db.Integer,primary_key=True,autoincrement=True)
username = db.Column(db.String(50),nullable=False)
_password = db.Column(db.String(100),nullable=False)
email = db.Column(db.String(50),nullable=False,unique=True)
join_time = db.Column(db.DateTime,default=datetime.now)
@property
def password(self):
return self._password
然后,我们需要使用flask中的一个加密函数 werkzeug 已经安装过可以直接转到④
① win+R 输入 cmd 打开命令指示符
②cd (此处一个空格) C:\Users\Administrator\AppData\Local\Programs\Python\Python37\(这一串是Python路径,根据自己情况输入)
③输入指令 pip install werkzeug 安装
④导入
此处导入两个,第一个用来加密,第二个用来检查
from werkzeug.security import generate_password_hash,check_password_hash
⑤使用该函数,并写出检查密码的方法(深色部分),用来判断是否正确
原理就是,将原本的密码 raw_password 加密,再传递给_password
检查同理,检查方法将取得的密码按同样方法加密一遍,与加密后的_password核对
最后返回结果
class CMSUser(db.Model): __tablename__ = 'cms_user' id = db.Column(db.Integer,primary_key=True,autoincrement=True) username = db.Column(db.String(50),nullable=False) _password = db.Column(db.String(100),nullable=False) email = db.Column(db.String(50),nullable=False,unique=True) join_time = db.Column(db.DateTime,default=datetime.now) @property def password(self): return self._password @password.setter def password(self,raw_password): self._password = generate_password_hash(raw_password) def check_password(self,raw_password): result = check_password_hash(self.password,raw_password) return result
最后,做规范化整理,方便使用
加入深色部分,可以在项目其他位置,可以用 password 直接使用加密后的密码
class CMSUser(db.Model): __tablename__ = 'cms_user' id = db.Column(db.Integer,primary_key=True,autoincrement=True) username = db.Column(db.String(50),nullable=False) _password = db.Column(db.String(100),nullable=False) email = db.Column(db.String(50),nullable=False,unique=True) join_time = db.Column(db.DateTime,default=datetime.now) def __init__(self,username,password,email): self.username = username self.password = password self.email = email @property def password(self): return self._password @password.setter def password(self,raw_password): self._password = generate_password_hash(raw_password) def check_password(self,raw_password): result = check_password_hash(self.password,raw_password) return result
效果:重新添加数据后,密码已被加密
明文显示密码不可取
数据库内有用户更多信息
如果被攻击
危害不仅在单方面