简介
bcrypt 可以通过加盐的方式对密码进行加密,更加的安全可靠。
优点
md5加密,每个对应的明文密码,对应的是一样的加密的密文,比较容易的进行解密。而bcrypt每一次的明文密码得到的是不同的加密的密文,因为密文是通过随机的盐结合加密,所以更加安全。
tornado使用bcrypt 加密密码
在utils目录新建encryption.py文件
from bcrypt import hashpw, gensalt # 加密 def passwd_encryption(pwd, passwd=None, is_encrypt=True): if is_encrypt: # 这个是随机生成的盐 salt = gensalt(12) # 这个是通过盐去加密 passwd = hashpw(pwd.encode('utf8'), salt) return passwd else: # 将输入的明文密码与密文密码进行加密,是否等于密文密码。 return hashpw(pwd.encode('utf8'), passwd.encode('utf8'))
在users.py文件里面把它导入过来
import tornado.web import re from models.auth import User from utils.account import passwd_encryption from handlers.main import BaseHandler class RegisterHandler(tornado.web.RequestHandler): ''' 注册 ''' def get(self): return self.render('register.html') def post(self): # 1.获取前端参数 username = self.get_argument('username', '').strip() password = self.get_argument('password', '').strip() repeat_password = self.get_argument('repeat_password', '').strip() # 2.校验参数 # 判断是否为空 if not all([username, password, repeat_password]): return self.write('参数错误') # 判断格式 if not(re.match('^\w{6,20}$', username) and password == repeat_password): return self.write('格式错误') # 判断用户是否已存在 if User.check_username(username): return self.write('用户名已存在') # 密码加密 passwd = passwd_encryption(password) # 3.入库 User.add_user(username, passwd) # 保存user数据 # 4.返回数据给前端 return self.write('注册成功') class LoginHandler(BaseHandler): ''' 登录 ''' def get(self): return self.render('login.html') def post(self): # 1.获取用户名和密码 username = self.get_argument('username', '').strip() password = self.get_argument('password', '').strip() if username and password: # 2.判断密码是否正确 user = User.check_username(username) # 获取用户实例 passwd = user.password if user else '' # 数据库中已经加密的密码 if passwd_encryption(password, passwd, False) == passwd.encode('utf8'): self.session.set('user', username) next = self.get_argument('next', '/') # 获取需登录前一个页面路由 return self.redirect(next) # 重定向到登录前一个页面 else: return self.write('用户名或密码错误') else: self.write('参数错误') # 3.设置会话 pass