Python中利用ItsDangerous快捷实现数据加密

yizhihongxing

Python中利用ItsDangerous快捷实现数据加密

1. ItsDangerous简介

ItsDangerous是一个模块,可以用于给用户生成和验证数据的安全令牌,以保证数据的合法性和完整性。ItsDangerous采用激活、验证和签名等依次进行的方法来处理消息签名和序列化。

2. 安装ItsDangerous

ItsDangerous模块可以通过pip进行安装。

pip install itsdangerous

3. ItsDangerous使用指南

3.1 提供一个有限期的票据

使用ItsDangerous可以提供有限期的票据,票据内包含有关用户的信息,例如用户ID等,以便后续的数据处理,保证数据的有效性和时限性。

下面是一个简单的凭据生成和验证示例。

from itsdangerous import TimedJSONWebSignatureSerializer as Serializer, BadSignature, SignatureExpired

# step1: 凭证生成
def generate_token(app, user):
    # 设置过期时间seconds
    s = Serializer(app.config['SECRET_KEY'], expires_in=86400)
    return s.dumps({'id': user.id}).decode('utf-8')

# step2: 凭证校验
def verify_token(app, token):
    s = Serializer(app.config['SECRET_KEY'])
    try:
        data = s.loads(token)
    except SignatureExpired:
        return None  # Token已过期
    except BadSignature:
        return None  # Token无效
    user = User.query.get(data['id'])  # 查询用户
    return user

3.2 给数据签名

有时候,我们需要对我们的数据进行签名,以便在传输或存储时防止被篡改或修改。ItsDangerous可以通过使用固定密钥及签名算法来为数据生成签名。

下面是一个例子,用于为电子邮件生成签名。

from itsdangerous import URLSafeTimedSerializer

def send_confirmation_email(app, user):
    token = user.generate_confirmation_token()
    confirm_url = url_for('confirm_email', token=token, _external=True)
    message_body = "Please click the link below to confirm your email address:\n{}".format(confirm_url)
    subject = "Please Confirm Your Email"
    send_email(user.email, subject, message_body)

class User(db.Model):

    def __init__(self, **kwargs):
        super(User, self).__init__(**kwargs)
        self.confirmed = False

    def generate_confirmation_token(self, expires_in=3600):
        s = URLSafeTimedSerializer(app.config['SECRET_KEY'])
        return s.dumps({'confirm': self.id}, salt=app.config['EMAIL_CONFIRM_SALT'])

    def confirm(self, token):
        s = URLSafeTimedSerializer(app.config['SECRET_KEY'])
        try:
            data = s.loads(token, salt=app.config['EMAIL_CONFIRM_SALT'], max_age=3600)
        except:
            return False
        if data.get('confirm') != self.id:
            return False
        self.confirmed = True
        db.session.add(self)
        return True

4. 总结

使用ItsDangerous可以提供安全、高效的数据处理和合法性验证,确保数据的时效性和完整性。同时,ItsDangerous具有便捷、可配置的特性,可以适用于各种数据处理场景。

5. 示例一:以Flask和ItsDangerous实现token身份验证

Flask 提供了Flask-HTTPAuth扩展,可以帮助我们轻松实现 token 身份验证。我们也可以不使用扩展,结合 Flask 和 ItsDangerous 实现 token 验证。

from flask import Flask, jsonify, g
from werkzeug.exceptions import Unauthorized

app = Flask(__name__)
app.config['SECRET_KEY'] = 'some secret key'

# 凭证生成
def generate_token(username):
    s = Serializer(app.config['SECRET_KEY'], expires_in=600)
    return s.dumps({'username': username}).decode('utf-8')

# 凭证校验
def verify_token(token):
    s = Serializer(app.config['SECRET_KEY'])
    try:
        data = s.loads(token)
    except SignatureExpired:
        return None  # Token已过期
    except BadSignature:
        return None  # Token无效
    user = User.query.filter_by(username=data['username']).first() # 校验用户是否存在
    return user

@app.route('/login', methods=['POST'])
def login():
    # 用户校验...
    user = User.query.filter_by(username=username).first()
    # 生成凭证
    token = generate_token(user.username)
    return jsonify({'token': token})

@app.route('/getinfo', methods=['GET'])
def getinfo():
    token = request.headers.get('token') # 获取token
    user = verify_token(token)
    if user is None:
        raise Unauthorized()  # 返回401错误
    # 返回user信息
    return jsonify({'user': user.to_dict()})

if __name__ == '__main__':
    app.run(debug=True)

6. 示例二:以itsdangerous实现token登录

from flask import Flask, request, jsonify
from itsdangerous import TimedJSONWebSignatureSerializer as Serializer, SignatureExpired, BadSignature

app = Flask(__name__)
app.config['SECRET_KEY'] = "123456"

# 凭证生成
def generate_token(id, name):
    s = Serializer(app.config['SECRET_KEY'], expires_in=600)
    return s.dumps({'id': id, 'name': name}).decode('utf-8')

# 凭证校验
def verify_token(token):
    s = Serializer(app.config['SECRET_KEY'])
    try:
        data = s.loads(token)
    except SignatureExpired:
        return False, 'Signature expired'
    except BadSignature:
        return False, 'Bad signature'
    return True, data

@app.route('/login', methods=['POST'])
def login():
    # 总之就是用户校验操作
    if login_success:
        token = generate_token(username, password)
        return jsonify({'ret': 0, 'token': token})
    else:
        return jsonify({'ret': -1, 'msg': '用户名或密码错误'})

@app.route('/getuser', methods=['GET'])
def get_user():
    token = request.headers.get('Authorization')
    if token is None:
        return jsonify({'ret': -1, 'msg': '缺少认证token'})
    ok, user_info = verify_token(token)
    if not ok:
        return jsonify({'ret': -1, 'msg': user_info})
    # 取出user id 查询用户的具体信息
    user_id = user_info['id']
    user_name = user_info['name']
    user_dict = {"id": user_id, "name": user_name, "other_info": "..."}
    return jsonify({'ret': 0, 'user_info': user_dict})

if __name__ == '__main__':
    app.run(debug=True)

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python中利用ItsDangerous快捷实现数据加密 - Python技术站

(0)
上一篇 2023年5月25日
下一篇 2023年5月25日

相关文章

  • Vmware部署Nginx+KeepAlived集群双主架构的问题及解决方法

    我来详细讲解“Vmware部署Nginx+KeepAlived集群双主架构的问题及解决方法”的完整攻略。 一、背景介绍 在高并发场景下,单一节点的服务器会出现性能瓶颈,因此需要使用集群架构来提高服务器性能。本文主要介绍如何在Vmware虚拟机上部署Nginx+KeepAlived集群双主架构。 二、架构设计 本文将使用两个Web服务器节点来搭建集群,其中一个…

    人工智能概览 2023年5月25日
    00
  • Python smtp邮件发送模块用法教程

    当你需要通过Python发送电子邮件时,你可以使用Python的内置标准库smtplib库进行邮件发送。本文将简单介绍如何使用Python内置smtplib库来发送邮件。 步骤一:连接SMTP服务器 首先,我们需要使用smtplib库中的SMTP类来与SMTP服务器建立连接。在连接类SMTP服务器之前,你需要提供SMTP服务器主机名和端口号,可以是邮件服务提…

    人工智能概论 2023年5月25日
    00
  • 设备APP开发环境配置细节介绍

    下面是设备APP开发环境配置细节介绍的完整攻略。 设备APP开发环境配置细节介绍 1. 安装开发工具 首先需要确保本地已安装开发工具,建议选择Android Studio、Xcode等官方推荐的开发工具,它们对设备APP开发提供了全方位的支持。 2. 配置开发环境 Android 针对Android开发,可以按照以下步骤来配置开发环境: 安装Java环境和A…

    人工智能概览 2023年5月25日
    00
  • 导入tensorflow:ImportError: libcublas.so.9.0 报错

    导入 TensorFlow 是进行机器学习和深度学习的重要步骤。在导入 TensorFlow 时,有时会遇到错误,例如:ImportError: libcublas.so.9.0。这种错误通常在使用 NVIDIA 的 GPU 时出现,因为在使用 GPU 运行 TensorFlow 需要 CUBALIB 库作为支持。 以下是解决 ImportError: li…

    人工智能概论 2023年5月24日
    00
  • 高质量Python代码编写的5个优化技巧

    当编写Python代码时,有许多可以提高其质量和性能的技巧。下面是五个优化技巧的攻略,您可以使用这些技巧优化您的Python代码。 1. 使用生成器 生成器可以在内存方面更具优势。在使用可迭代对象时,它们允许您逐个地生成值,而不是将它们全部加载到内存中。例如,以下代码通过使用生成器计算了一个列表中所有数字的总和: def sum_list(numbers):…

    人工智能概论 2023年5月25日
    00
  • Ubuntu20.04 VNC 安装与设置实现

    下面是 Ubuntu20.04 VNC 安装与设置实现的完整攻略步骤: 1. 安装 VNC 服务 打开终端,输入以下命令进行 VNC 服务的安装: sudo apt-get update sudo apt-get install -y tightvncserver 2. 设置 VNC 密码 输入以下命令启动 tightvncserver 并设置密码: vnc…

    人工智能概览 2023年5月25日
    00
  • Python实现字符串逆序输出功能示例

    实现字符串逆序输出是Python中非常基础的操作。下面我会提供两种示例,来详细讲解如何使用Python实现这个功能。 示例一 第一种方法是使用Python内置的slice(切片)方法。代码如下: string = "hello world" reversed_string = string[::-1] print(reversed_str…

    人工智能概览 2023年5月25日
    00
  • Django drf请求模块源码解析

    下面是关于” Django drf请求模块源码解析”的完整攻略,希望可以帮到你。 什么是Django drf? Django drf(Django REST framework)是一个基于 Django 框架的灵活、可扩展的轻量级 Web API 框架,支持认证、限流、缓存等常见的 API 开发需求。Django drf 是目前 Web API 开发最流行的…

    人工智能概论 2023年5月25日
    00
合作推广
合作推广
分享本页
返回顶部