Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Python 使用rsa类库基于RSA256算法生成JWT

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

作者头像
授客
发布于 2021-07-08 02:47:28
发布于 2021-07-08 02:47:28
1.4K00
代码可运行
举报
文章被收录于专栏:授客的专栏授客的专栏
运行总次数:0
代码可运行

JWT简介

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

JWT构成

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

header

格式如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  '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,从而避免重放攻击。
公共声明

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

私有声明

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

格式如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
    "iss":"shouke", 
    "sub":"test_subject",  
    "aud":"tester",    
    "iat":1624499492,
    "exp":1624535491, 
    "jti":"8NLazrgnXpAvmHA6eybETH7RT8sUWbag",   
    "username":"shouke",
    "hobby":"unknow"
}

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
eyJpc3MiOiAiY2Fzc21hbGwuY29tIiwgInN1YiI6ICJtYW5keSIsICJhdWQiOiAiY2Fzc21hbGwiLCAiaWF0IjogMTYyNTI4NzIzNSwgImV4cCI6IDE2NTY4MjMyMzUsICJqdGkiOiAiSmVRbUxqUlpaR0hjVEh1ZE5FdWRiUyIsICJ1c2VybmFtZSI6ICJzaG91a2UiLCAiaG9iYnkiOiAidW5rbm93In0=

signature

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
L1THOR4+gsksnDzwjGDsVCjvwlO7NBRdC6cVHAy1pycUGBugE6UM6mj/So1QRivVOyzk/OafHg9KpsR3/93SJ4SJXIyYhLaJXfIH+6tvi9Z72h6A2ko2AT//gfdtAtTJEMAF8rlsuu58FgYSQn2GjCIgn8oRNyX5S4w5Zmz+cJk=

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
eyJ0eXAiOiAiSldUIiwgImFsZyI6ICJSUzI1NiJ9.eyJpc3MiOiAiY2Fzc21hbGwuY29tIiwgInN1YiI6ICJtYW5keSIsICJhdWQiOiAiY2Fzc21hbGwiLCAiaWF0IjogMTYyNTI4NzIzNSwgImV4cCI6IDE2NTY4MjMyMzUsICJqdGkiOiAiSmVRbUxqUlpaR0hjVEh1ZE5FdWRiUyIsICJ1c2VybmFtZSI6ICJzaG91a2UiLCAiaG9iYnkiOiAidW5rbm93In0=.L1THOR4+gsksnDzwjGDsVCjvwlO7NBRdC6cVHAy1pycUGBugE6UM6mj/So1QRivVOyzk/OafHg9KpsR3/93SJ4SJXIyYhLaJXfIH+6tvi9Z72h6A2ko2AT//gfdtAtTJEMAF8rlsuu58FgYSQn2GjCIgn8oRNyX5S4w5Zmz+cJk=

代码实现

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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())
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-07-04 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
一分钟搞懂JWT
JWT(JSON Web Tokens)是一种标准, 它定义了一些用于能用户各方安全传输的信息, 因为经过数字签名, 所以能够被当做用户的身份标识.
一个架构师
2022/06/20
4680
一分钟搞懂JWT
理解JWT(JSON Web Token)认证及实践
HTTP Basic Auth 在HTTP中,基本认证是一种用来允许Web浏览器或其他客户端程序在请求时提供用户名和口令形式的身份凭证的一种登录验证方式,通常用户名和明码会通过HTTP头传递。
goodspeed
2020/12/22
1.3K0
理解JWT(JSON Web Token)认证及实践
邮件退订的设计与实现
在平常的验证码, 推广邮件中, 我们通常会在最下角找到 退订链接。通常访问它, 我们就不会再收到他们发送的邮件。
xcsoft
2022/05/17
1.4K0
彻底搞懂JWT,看这篇就够了!
载荷就是存放有效信息的地方。这个名字像是特指飞机上承载的货品,这些有效信息包含三个部分
架构师修炼
2020/09/24
1.7K0
彻底搞懂JWT,看这篇就够了!
Spring Security 之 JWT介绍
Json Web Token 简称JWT,是一个开放的行业标准(RFC 7519),它定义了一种简洁的、自包含的协议格式,用于在通信双方传递JSON对象,传递的信息经过数字签名可以被验证和信任。JWT可以使用HMAC算法或使用RSA的公钥/私钥来签名,防止被篡改。
阿提说说
2022/11/18
4950
Spring Security 之 JWT介绍
什么是JWT?
JSON Web Token (JWT) 是一个开源标准(RFC 7519),它定义了一种紧凑且自完备的方法用于在各参与方之间以JSON对象传递信息。以该种方式传递的信息已经被数字签名,因而可以被验证并且被信任。JWT既可以使用盐(secret)(HMAC算法)进行签名,也可以使用基于RSA/ECDSA算法的公钥/秘钥对进行签名。
Steve Wang
2022/04/13
9770
什么是JWT?
一篇文章告诉你JWT的实现原理
编辑:业余草 来源:https://www.xttblog.com/?p=4940 写篇文章不容易,昨天晚上深夜写完忘记保存了。联想一下那个画面,真的是泪目啊! 哎,过去的就让他过去吧,今天我们继续
业余草
2020/04/08
2.3K0
一篇文章告诉你JWT的实现原理
面试官:JWT Token的原理是啥?
是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准(RFC 7519)。
小锟哥哥
2022/05/10
7110
面试官:JWT Token的原理是啥?
JWT
在实际应用中,有很大一部分的后台接口应该是在用户登录的情况下才能进行操作的,而这种需要用户认证的接口显然不可能每次都去传一遍用户名和密码,另外不同的用户,操作后台系统的权限也会有所不同,为了解决这些问题,相信你对 token 这个词不陌生吧。
凌虚
2020/07/20
8180
JWT
SpringBoot整合JWT实现验证登陆
Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的, 特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息, 以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。
乱敲代码
2019/06/03
1.3K0
PHP JWT简易使用
今天突然就想用一下jwt生成一下token,那么说干就干 首先我先下载了一下composer composer.phar 下载到本地以后,通过cmd命令行进行下载php-jwt,命令为:
超级小可爱
2023/02/20
1.7K0
JWT入门简介
官网:https://jwt.io/ 文档:https://jwt.io/introduction/
编程随笔
2019/09/11
1.1K0
JWT入门简介
php 后端实现JWT认证方法示例
JWT是json web token缩写。它将用户信息加密到token里,服务器不保存任何用户信息。服务器通过使用保存的密钥验证token的正确性,只要正确即通过验证。基于token的身份验证可以替代传统的cookie+session身份验证方法。
用户2323866
2021/07/13
1.4K0
读懂JWT的使用,你就会用PHP如何实现了
什么是JWT JWT(json web token)是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准。 JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源。比如用在用户登录上。
友儿
2022/09/11
1K0
JWT 到底应该怎么用才对?
JWT 全称为 JSON Web Token,是一份开源的标准协议,它定义了一种传输内容基于 JSON、轻量级、安全的数据传输方式。
松鼠专栏
2020/03/24
3.3K0
JWT 到底应该怎么用才对?
JWT实现跨域身份验证
JWT(JSON Web Token)是目前流行的跨域认证解决方案,是一个开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式,用于作为JSON对象在各方之间安全地传输信息。该信息可以被验证和信任,因为它是数字签名的。
别团等shy哥发育
2023/02/25
1.5K0
JWT实现跨域身份验证
JWT (Json Web Token)教程
JWT第一部分是header,header主要包含两个部分,alg指加密类型,可选值为HS256、RSA等等,typ=JWT为固定值,表示token的类型。。
allsmallpig
2021/02/12
9030
php JWT在web端中的使用方法教程
JWT就是一个字符串,经过加密处理与校验处理的字符串,由三个部分组成。基于token的身份验证可以替代传统的cookie+session身份验证方法。三个部分分别如下:
用户2323866
2021/07/13
2.1K0
ASP.NET Core 集成JWT
Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。
Echo_Wish
2023/11/30
4160
ASP.NET Core 集成JWT
浅析JWT Attack
文章首发于合天安全实验室https://mp.weixin.qq.com/s/WvVgavjJMXSZQsVFtHEOhA
用户9691112
2023/05/18
1.3K0
浅析JWT Attack
相关推荐
一分钟搞懂JWT
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验