目的:
PBKDF2的 crypt 加密後的密碼:
$p5k2$2537$onn0HWXp$TJBLhym0V2H/CNqDN04j8d8M28i3igH3
過程:
1、表模型
#導包
from pbkdf2 import crypt
class Userinfo(Base):
__tablename__ = 'Userinfo'
OprID = Column(TINYINT(3), primary_key=True, autoincrement=True)
UserName = Column(String(45))
_password = Column('Password', String(64))
# def __repr__(self):
# return "<Userinfo(name='%s')>" % self.UserName
# 定義一個內部使用加密的方法
def _hash_password(self, password):
return crypt(password, iterations=0x2537)
# 使用property裝飾器使方法變爲屬性
@property
def password(self):
return self._password
# 設置加密後給類屬性賦值
@password.setter
def password(self, password):
self._password = self._hash_password(password)
# 定義一個密碼校驗的方法
def auth_password(self, pwd):
if self._password is not None:
return self.password == crypt(pwd, self.password)
else:
return False
2、修改密碼
修改密碼過程邏輯:
①、先校驗提交的用戶名和密碼,通過執行②,否則返回錯誤信息
②、生成用戶表的實例,因爲在表模型中自定義生成密碼加密方法,使用:實例.password = 前端密碼參數 即可生成加密密碼
③、通過SQL alchemy更新表字段方法替換原有的密碼值
class ForgetHandle(BaseHandler):
def get(self):
pass
async def post(self):
username = self.get_argument("username", "")
password = self.get_argument("password", "")
password1 = self.get_argument("password1", "")
try:
if not username and not password and not password1:
self.write({'code': 1001, 'msg': 'Error', 'data': "用戶名或密碼錯誤!"})
# 先查詢數據庫是否已經存在該用戶
with session_maker() as session:
search_name = session.query(Userinfo).filter_by(UserName=username).first()
if search_name and search_name.auth_password(password):
#先創建Userinfo實例
oper = Userinfo()
# 通過實例把需要修改的密碼加密
oper.password = password1
#更新修改後的密碼
res = session.query(Userinfo).filter_by(UserName=username).update(
{'_password': oper.password})
if res == 1:
self.write({'code': 0, 'msg': 'Success', 'data': "修改成功"})
else:
self.write({'code': 1001, 'msg': 'Error', 'data': "用戶名或密碼錯誤!"})
except Exception as e:
logging.error("修改密碼錯誤", e)