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当中,多几个表单处理就好了。