Loading

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

posted @ 2020-01-15 15:11  上官飞鸿  阅读(3507)  评论(0编辑  收藏  举报