Python 使用rsa类库基于RSA256算法生成JWT

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: Python 使用rsa类库基于RSA256算法生成JWT

JWT简介

JWT(Json web token),是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准。JWT提供了一种简单、安全的身份认证方法,特别适合分布式站点单点登录、或者是签名。

JWT构成

JWT是由3部分信息组成,分别为headerpayloadsignature,组合形式为:header.payload.signature(注意:这里的headerpayloadsignature都是经过base64加密的值)

格式如下:

{
  'typ': 'JWT', # 声明类型
  'alg': 'RS256' # 声明加密算法 # RSA Signature withSHA-256
}

要构成JWT组成部分之前,需要对其进行base64加密,得到一字符串,形如:eyJ0eXAiOiAiSldUIiwgImFsZyI6ICJSUzI1NiJ9

payload

payload用于存放有效信息,可划分为三部分。

  • 标准声明
  • 公共声明
  • 私有声明

标准声明(建议但不强制使用)

  • iss:issue,JWT签发者
  • sub:subject,主题
  • aud:audience,受众,该JWT所面向的用户
  • exp JWT过期时间戳,单位秒,这个过期时间必须要大于签发时间
  • nbf:定义在什么时间之前,该JWT都是不可用的
  • iatJWT签发时间
  • jtiJWT的唯一身份标识,主要用来作为一次性token,从而避免重放攻击。

公共声明

公共声明可以添加任何的信息,一般添加用户的相关信息或其他业务需要的必要信息。一般不建议添加敏感信息,因为该部分在客户端可解密。

私有声明

私有声明是提供者和消费者所共同定义的声明,一般不建议添加敏感信息,因为该部分在客户端也是可解密。

格式如下

{
    "iss":"shouke", 
    "sub":"test_subject",  
    "aud":"tester",    
    "iat":1624499492,
    "exp":1624535491, 
    "jti":"8NLazrgnXpAvmHA6eybETH7RT8sUWbag",   
    "username":"shouke",
    "hobby":"unknow"
}

header一样,要构成JWT组成部分之前,需要对其进行base64加密,得到一字符串,形如:

eyJpc3MiOiAiY2Fzc21hbGwuY29tIiwgInN1YiI6ICJtYW5keSIsICJhdWQiOiAiY2Fzc21hbGwiLCAiaWF0IjogMTYyNTI4NzIzNSwgImV4cCI6IDE2NTY4MjMyMzUsICJqdGkiOiAiSmVRbUxqUlpaR0hjVEh1ZE5FdWRiUyIsICJ1c2VybmFtZSI6ICJzaG91a2UiLCAiaG9iYnkiOiAidW5rbm93In0=

signature

headerpayload构成了signature基础信息,格式为:header.payload,其中headerpayload,也是base64加密后的值。

构成JWT组成部分之前,需要采用headeralg配置对应的算法,对上述基础信息进行加密,然后对加密结果进行base64编码,得到最终的signature

L1THOR4+gsksnDzwjGDsVCjvwlO7NBRdC6cVHAy1pycUGBugE6UM6mj/So1QRivVOyzk/OafHg9KpsR3/93SJ4SJXIyYhLaJXfIH+6tvi9Z72h6A2ko2AT//gfdtAtTJEMAF8rlsuu58FgYSQn2GjCIgn8oRNyX5S4w5Zmz+cJk=

最后,将以上三部分用.连接起来,得到JWT,如下

eyJ0eXAiOiAiSldUIiwgImFsZyI6ICJSUzI1NiJ9.eyJpc3MiOiAiY2Fzc21hbGwuY29tIiwgInN1YiI6ICJtYW5keSIsICJhdWQiOiAiY2Fzc21hbGwiLCAiaWF0IjogMTYyNTI4NzIzNSwgImV4cCI6IDE2NTY4MjMyMzUsICJqdGkiOiAiSmVRbUxqUlpaR0hjVEh1ZE5FdWRiUyIsICJ1c2VybmFtZSI6ICJzaG91a2UiLCAiaG9iYnkiOiAidW5rbm93In0=.L1THOR4+gsksnDzwjGDsVCjvwlO7NBRdC6cVHAy1pycUGBugE6UM6mj/So1QRivVOyzk/OafHg9KpsR3/93SJ4SJXIyYhLaJXfIH+6tvi9Z72h6A2ko2AT//gfdtAtTJEMAF8rlsuu58FgYSQn2GjCIgn8oRNyX5S4w5Zmz+cJk=

代码实现

import rsa
import base64
import json
import shortuuid
from datetime import datetime, timedelta
def make_jwt():
    header = { 'typ': 'JWT',  # 令牌类型
               'alg': 'RS256' # 使用的算法 # RSA Signature withSHA-256
             }
    header = base64.b64encode(json.dumps(header).encode()).decode() # encode  decode 默认使用utf-8
    print(header)
    payload = {
        "iss":"cassmall.com",
        "sub":"mandy",
        "aud":"cassmall",
        "iat":int(datetime.now().timestamp()),
        "exp":int((datetime.now()+ timedelta(seconds=31536000)).timestamp()), # JWT过期时间戳,单位秒
        "jti":shortuuid.uuid(),
        "username":"shouke",
        "hobby":"unknow"
    }
    payload = base64.b64encode(json.dumps(payload).encode()).decode()
    print(payload)
    signature = genrate_signature(1024, '{header}.{payload}'.format(header=header, payload=payload).encode('utf-8'), 'SHA-256')
    print(signature)
    return '{header}.{payload}.{signature}'.format(header=header,
                                                      payload=payload,
                                                      signature=signature)
def genrate_signature(nbits, message, hash_method):
    (pubkey, privkey) = rsa.newkeys(nbits)
    if not isinstance(message, bytes):
        message = message.encode('utf-8')
    hash = rsa.compute_hash(message, hash_method)
    return base64.b64encode(rsa.sign(hash, privkey, hash_method)).decode()
if __name__ == '__main__':
    print(make_jwt())
目录
相关文章
|
10天前
|
机器学习/深度学习 人工智能 算法
猫狗宠物识别系统Python+TensorFlow+人工智能+深度学习+卷积网络算法
宠物识别系统使用Python和TensorFlow搭建卷积神经网络,基于37种常见猫狗数据集训练高精度模型,并保存为h5格式。通过Django框架搭建Web平台,用户上传宠物图片即可识别其名称,提供便捷的宠物识别服务。
139 55
|
26天前
|
搜索推荐 Python
利用Python内置函数实现的冒泡排序算法
在上述代码中,`bubble_sort` 函数接受一个列表 `arr` 作为输入。通过两层循环,外层循环控制排序的轮数,内层循环用于比较相邻的元素并进行交换。如果前一个元素大于后一个元素,就将它们交换位置。
126 67
|
26天前
|
存储 搜索推荐 Python
用 Python 实现快速排序算法。
快速排序的平均时间复杂度为$O(nlogn)$,空间复杂度为$O(logn)$。它在大多数情况下表现良好,但在某些特殊情况下可能会退化为最坏情况,时间复杂度为$O(n^2)$。你可以根据实际需求对代码进行调整和修改,或者尝试使用其他优化策略来提高快速排序的性能
116 61
|
27天前
|
算法 数据安全/隐私保护 开发者
马特赛特旋转算法:Python的随机模块背后的力量
马特赛特旋转算法是Python `random`模块的核心,由松本真和西村拓士于1997年提出。它基于线性反馈移位寄存器,具有超长周期和高维均匀性,适用于模拟、密码学等领域。Python中通过设置种子值初始化状态数组,经状态更新和输出提取生成随机数,代码简单高效。
105 63
|
20天前
|
机器学习/深度学习 人工智能 算法
【宠物识别系统】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+图像识别
宠物识别系统,本系统使用Python作为主要开发语言,基于TensorFlow搭建卷积神经网络算法,并收集了37种常见的猫狗宠物种类数据集【'阿比西尼亚猫(Abyssinian)', '孟加拉猫(Bengal)', '暹罗猫(Birman)', '孟买猫(Bombay)', '英国短毛猫(British Shorthair)', '埃及猫(Egyptian Mau)', '缅因猫(Maine Coon)', '波斯猫(Persian)', '布偶猫(Ragdoll)', '俄罗斯蓝猫(Russian Blue)', '暹罗猫(Siamese)', '斯芬克斯猫(Sphynx)', '美国斗牛犬
109 29
【宠物识别系统】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+图像识别
|
2天前
|
存储 运维 监控
探索局域网电脑监控软件:Python算法与数据结构的巧妙结合
在数字化时代,局域网电脑监控软件成为企业管理和IT运维的重要工具,确保数据安全和网络稳定。本文探讨其背后的关键技术——Python中的算法与数据结构,如字典用于高效存储设备信息,以及数据收集、异常检测和聚合算法提升监控效率。通过Python代码示例,展示了如何实现基本监控功能,帮助读者理解其工作原理并激发技术兴趣。
41 20
|
26天前
|
存储 算法 搜索推荐
Python 中数据结构和算法的关系
数据结构是算法的载体,算法是对数据结构的操作和运用。它们共同构成了计算机程序的核心,对于提高程序的质量和性能具有至关重要的作用
|
26天前
|
数据采集 存储 算法
Python 中的数据结构和算法优化策略
Python中的数据结构和算法如何进行优化?
|
1月前
|
机器学习/深度学习 算法 大数据
蓄水池抽样算法详解及Python实现
蓄水池抽样是一种适用于从未知大小或大数据集中高效随机抽样的算法,确保每个元素被选中的概率相同。本文介绍其基本概念、工作原理,并提供Python代码示例,演示如何实现该算法。
34 1
|
1天前
|
机器学习/深度学习 算法
基于改进遗传优化的BP神经网络金融序列预测算法matlab仿真
本项目基于改进遗传优化的BP神经网络进行金融序列预测,使用MATLAB2022A实现。通过对比BP神经网络、遗传优化BP神经网络及改进遗传优化BP神经网络,展示了三者的误差和预测曲线差异。核心程序结合遗传算法(GA)与BP神经网络,利用GA优化BP网络的初始权重和阈值,提高预测精度。GA通过选择、交叉、变异操作迭代优化,防止局部收敛,增强模型对金融市场复杂性和不确定性的适应能力。
101 80