关于tornado-web开发密码加密的使用

一、安装pbkdf2

pip install pbkdf2

二、创建数据表的时候

  • 1、引入加密的模块(必须的)

    from pbkdf2 import PBKDF2
  • 2、引入uuid4作为用户id(非必须的)

    from uuid import uuid4
  • 3、定义类创建表的代码

    
    # coding=utf-8
    
    from datetime import datetime
    from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy import create_engine, Column, Integer, String, Boolean, DateTime, ForeignKey
    from models import engine
    from models import dbSession
    from sqlalchemy.orm import relationship
    
    #引入uuid4作为id
    
    from uuid import uuid4
    
    #引入第三方模块加密处理
    
    from pbkdf2 import PBKDF2
    Base = declarative_base(engine)
    
    
    
    # 定义好一些属性,与user表中的字段进行映射,并且这个属性要属于某个类型
    
    class User1(Base):
        __tablename__ = 'user1'
        #设置uuid4的id(防止别人知道你用户量多少)
        uuid = Column(String(36),unique=True,nullable=False,default=lambda: str(uuid4()))
        id = Column(Integer, primary_key=True, autoincrement=True)
        username = Column(String(50), nullable=False)
        #Column('password',...)表示使用password作为列名
        _password = Column('password', String(64))
        createtime = Column(DateTime, default=datetime.now)
        last_login = Column(DateTime)
        loginnum = Column(Integer, default=0)
        _locked = Column(Boolean, default=False, nullable=False)
    
        #定义一个内部使用加密的方法
        def _hash_password(self,password):
            return PBKDF2.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 == PBKDF2.crypt(pwd, self.password)
            else:
                return False
  • 4、总结上面的代码:

    • 1、 使用lambda: str(uuid4())生成uuid
    • 2、使用@property使方法变成类属性
    • 3、在密码字段使用_password = Column('password', String(64))详解见上面代码
    • 4、在类里面定义密码赋值的方法与密码校验的方法

三、测试

  • 1、用户注册的试图函数

    ```python
    # 注册试图
    class RegistHandle(BaseHandle):
        def get(self):
            self.render("regist.html")
    
        def post(self):
            username = self.get_argument("username", "")
            password = self.get_argument("password", "")
            if not username and not password:
                self.write(u"用户名或密码输入有错误")
            # 先查询数据库是否已经存在该用户
            search_name = self.db.query(User1).filter_by(username=username).first()
            if search_name:
                self.write(u"该用户名已经存在,不能重复注册")
            else:
                user = User1()
                user.username = username
                user.password = password
                self.db.add(user)
                self.db.commit()
                self.write(u"注册成功")
    ```
    
  • 2、用户登录的试图函数

    ```python
    # 登录试图
    class LoginHandle(BaseHandle):
        def get(self):
            self.render("login.html", next=self.get_argument("next"))
    
        def post(self):
            username = self.get_argument("username", "")
            password = self.get_argument("password", "")
            # 根据用户名去查找数据库
            search_user = self.db.query(User1).filter_by(username=username).first()
            if search_user and search_user.auth_password(password):
                # 登录成功调用方法
                self.success_login(search_user)
                self.redirect(self.get_argument("name"))
            else:
                self.write(u"登录失败")
    
        # 登录成功附加别的属性
        def success_login(self, user):
            user.last_login = datetime.now()
            user.loginnum += 1
            self.db.add(user)
            self.db.commit()
            self.session.set('username', user.username)
    
    ```
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

水痕01

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值