zoukankan      html  css  js  c++  java
  • Flask开发中的用户密码加密

    Flask开发中的用户密码加密

    虽然MD5加盐加密挺流行的,但是据说hash加盐加密是无法破解的。

    那么我们就看看flask当中是这么使用哈希加密和验证的。

    主要使用werkzeug的generate_password_hash,check_password_hash

    例子一:

    from werkzeug.security import generate_password_hash,check_password_hash
    
    for i in range(5):
        print(generate_password_hash('hello'))
    

    结果大概是这样的:

    pbkdf2:sha256:150000$ODedbYPS$4d1bd12adb1eb63f78e49873cbfc731e35af178cb9eb6b8b62c09dcf8db76670
    pbkdf2:sha256:150000$rEUFsDtH$e63823ba2f90af4116ed8ff73a0ccedc0256a061aa2a8cabc43de5a78281f8e1
    pbkdf2:sha256:150000$EyGbxmTY$fe19de43d9f3a20db0275a6509d412a499adfe1f3395bf576cd00f6d0601e5d0
    pbkdf2:sha256:150000$0xoXdJPX$cbd9d9ce9afb7ab59adaa72fafed93b546fa6eabe5fd435047b96e229081eec7
    pbkdf2:sha256:150000$611ZQpcE$18bcac13bebcc961a9424ca7b4a2457eb4ad44fd339025f4b9e2a0fbb36f5044

    5次加密结果不一样,

    例子二:

    from werkzeug.security import generate_password_hash, check_password_hash
    
    pass_hash = [
        'pbkdf2:sha256:150000$ODedbYPS$4d1bd12adb1eb63f78e49873cbfc731e35af178cb9eb6b8b62c09dcf8db76670',
        'pbkdf2:sha256:150000$rEUFsDtH$e63823ba2f90af4116ed8ff73a0ccedc0256a061aa2a8cabc43de5a78281f8e1',
        'pbkdf2:sha256:150000$EyGbxmTY$fe19de43d9f3a20db0275a6509d412a499adfe1f3395bf576cd00f6d0601e5d0',
        'pbkdf2:sha256:150000$0xoXdJPX$cbd9d9ce9afb7ab59adaa72fafed93b546fa6eabe5fd435047b96e229081eec7',
        'pbkdf2:sha256:150000$611ZQpcE$18bcac13bebcc961a9424ca7b4a2457eb4ad44fd339025f4b9e2a0fbb36f5044'
    ]
    
    for i in pass_hash:
        print(i)
        print('密码校验结果:%s', check_password_hash(i, 'hello'))

    结果大概是这样:

    hash密码串: pbkdf2:sha256:150000$ODedbYPS$4d1bd12adb1eb63f78e49873cbfc731e35af178cb9eb6b8b62c09dcf8db76670
    密码校验结果: True
    hash密码串: pbkdf2:sha256:150000$rEUFsDtH$e63823ba2f90af4116ed8ff73a0ccedc0256a061aa2a8cabc43de5a78281f8e1
    密码校验结果: True
    hash密码串: pbkdf2:sha256:150000$EyGbxmTY$fe19de43d9f3a20db0275a6509d412a499adfe1f3395bf576cd00f6d0601e5d0
    密码校验结果: True
    hash密码串: pbkdf2:sha256:150000$0xoXdJPX$cbd9d9ce9afb7ab59adaa72fafed93b546fa6eabe5fd435047b96e229081eec7
    密码校验结果: True
    hash密码串: pbkdf2:sha256:150000$611ZQpcE$18bcac13bebcc961a9424ca7b4a2457eb4ad44fd339025f4b9e2a0fbb36f5044
    密码校验结果: True

    反正验证是通过了。加密解密校验步骤就不用操心了。

    例子三:

    当然,为了在flask当中使用更方便,数据库定义还是改一下吧,具体如下:

    # !/usr/bin/python3
    # -*- coding: utf-8 -*-
    # @Time    : 2020/1/15 14:09
    # @Author  : Jackadam
    # @Email   :
    # @File    : model.py
    # @Software: PyCharm
    from sqlalchemy import Column, String, Integer
    from sqlalchemy import create_engine
    from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy.orm import sessionmaker
    from werkzeug.security import generate_password_hash, check_password_hash
    
    db_url = 'sqlite:///test.db'
    engine = create_engine(db_url, encoding='utf-8')
    Base = declarative_base()  # 生成orm基类
    Session_class = sessionmaker(bind=engine)  # 创建与数据库的会话session class ,注意,这里返回给session的是个class,不是实例
    db_session = Session_class()  # 生成session实例
    
    
    class Users(Base):
        __tablename__ = 'users'
        id = Column(Integer, primary_key=True)
        username = Column(String(32))
        _password_hash_ = Column(String(256))  # 加下划线作为私有函数,无法被外部访问。
    
        @property
        def password(self):
            raise Exception('密码不能被读取')  #为了保持使用习惯,还是设置一个password字段用来设置密码,当然也不能被读取。
    
        # 赋值password,则自动加密存储。
        @password.setter
        def password(self, value):
            self._password_hash_ = generate_password_hash(value)
    
        # 使用check_password,进行密码校验,返回True False。
        def check_password(self, pasword):
            return check_password_hash(self._password_hash_, pasword)
    
    
    Base.metadata.create_all(engine)
    
    # 新增用户
    new = Users(username='jack', password='123')
    
    db_session.add(new)
    db_session.commit()
    
    # 查询用户
    tag = db_session.query(Users).filter_by(username='jack').first()
    print(tag.check_password('123'))

    在flask当中,多几个表单处理就好了。

  • 相关阅读:
    项目中的注意事项
    复合查询
    树型控件的处理(完整版)
    图的存储结构(邻接矩阵)
    图的定义与术语2 数据结构和算法55
    图的存储结构(邻接矩阵)
    赫夫曼编码 数据结构和算法52
    赫夫曼编码 数据结构和算法52
    图的存储结构(邻接矩阵)
    图的定义与术语 数据结构和算法54
  • 原文地址:https://www.cnblogs.com/jackadam/p/12196826.html
Copyright © 2011-2022 走看看