JWT简介

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

JWT构成

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

header

格式如下:

{
'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())

Python 使用rsa类库基于RSA256算法生成JWT的更多相关文章

  1. Python实现一条基于POS算法的区块链

    区块链中的共识算法 在比特币公链架构解析中,就曾提到过为了实现去中介化的设计,比特币设计了一套共识协议,并通过此协议来保证系统的稳定性和防攻击性. 并且我们知道,截止目前使用最广泛,也是最被大家接受的 ...

  2. 基于雪花算法生成分布式ID(Java版)

    SnowFlake算法原理介绍 在分布式系统中会将一个业务的系统部署到多台服务器上,用户随机访问其中一台,而之所以引入分布式系统就是为了让整个系统能够承载更大的访问量.诸如订单号这些我们需要它是全局唯 ...

  3. 基于OpenSLL的RSA加密应用(非算法)

    基于OpenSLL的RSA加密应用(非算法) iOS开发中的小伙伴应该是经常用der和p12进行加密解密,而且在通常加密不止一种加密算法,还可以加点儿盐吧~本文章主要阐述的是在iOS中基于openSL ...

  4. 基于OpenSSL的RSA加密应用(非算法)

    基于OpenSSL的RSA加密应用(非算法) iOS开发中的小伙伴应该是经常用der和p12进行加密解密,而且在通常加密不止一种加密算法,还可以加点儿盐吧~本文章主要阐述的是在iOS中基于openSL ...

  5. 基于MMSeg算法的中文分词类库

    原文:基于MMSeg算法的中文分词类库 最近在实现基于lucene.net的搜索方案,涉及中文分词,找了很多,最终选择了MMSeg4j,但MMSeg4j只有Java版,在博客园上找到了*王员外*(ht ...

  6. [Python学习笔记-003] 使用PyOTP获取基于OTOP算法的动态口令

    建立安全的VPN连接,不仅需要输入用户名和密码,还需要输入动态口令(token).作为一个懒人,我更喜欢什么手工输入都不需要,既不需要输入password,也不需要输入token.也就是说,只需一个命 ...

  7. python实现基于两张图片生成圆角图标效果的方法

    python实现基于两张图片生成圆角图标效果的方法 这篇文章主要介绍了python实现基于两张图片生成圆角图标效果的方法,实例分析了Python使用pil模块进行图片处理的技巧,分享给大家供大家参考. ...

  8. Python 生成 JWT(json web token) 及 解析方式

    一.关于 jwt 的原理及概念可以自行在网络上搜索了解一下,这里推荐一篇写的比较好的博客 深入了解Json Web Token之概念篇 另附 JWT 的官方文档: https://jwt.io/int ...

  9. OpenSSL和Python实现RSA Key公钥加密私钥解密

    基于非对称算法的RSA Key主要有两个用途,数字签名和验证(私钥签名,公钥验证),以及非对称加解密(公钥加密,私钥解密).本文提供一个基于OpenSSL和Python进行非对称加解密的例子. 1. ...

  10. 开源Math.NET基础数学类库使用(14)C#生成安全的随机数

    原文:[原创]开源Math.NET基础数学类库使用(14)C#生成安全的随机数                本博客所有文章分类的总目录:http://www.cnblogs.com/asxinyu/ ...

随机推荐

  1. 通过 InnoSetup 美化安装界面

    InnoSetup 的美化相应的帖子也比较多,但是代码不是很全...所以我专门出了这篇文章来记录下这个美化过程.废话不多说,先上个成果: 前端er们可以直接下载 vue-nw-seed 这个分支,一键 ...

  2. HashMap设置初始容量一直都用错了?

    1 背景 今天在代码审查的时候,发现一位离职的同事留下了这样一串代码: Map<String,String> map = new HashMap<>((int)(list.si ...

  3. grafan+cadvisor+prometheus监控docker

    grafan+cadvisor+prometheus监控docker: 运行cadvisor: docker run \ --volume=/:/rootfs:ro \ --volume=/var/r ...

  4. wireshark常见使用技巧

    (1)wireshark根据报文不同字段排序 举例说明:现在有50000个1588 sync报文,我想根据报文的originalTimestamp(seconds)字段进行排序,该如何操作呢? 操作过 ...

  5. Kubernetes监控手册03-宿主监控实操

    生产环境大都是在 Linux 下的,所以这篇文章我们先来分享如何使用 Categraf 采集 Linux OS 相关的指标.读完本篇内容,你应该可以完成机器层面的监控了. 原理概述 Categraf ...

  6. Vue学习:11.了解生命周期

    Vue.js框架为组件设计了一套完整的生命周期,涵盖了从创建到销毁的全过程.这些生命周期钩子函数(lifecycle hooks)允许开发者在特定的阶段执行自定义逻辑,以便更好地管理组件的状态和与其交 ...

  7. react的类组件的ts写法

    react的类组件的ts写法,声明的变量,props和state的写法 import React, { PureComponent } from 'react'; interface Iprops { ...

  8. 消息sms 邮箱/手机号/push发送的方案 & 定时任务xxlJob灵活度 & 泛型和发送的模板类设计

    消息sms 邮箱/手机号/push发送的方案 & 定时任务xxlJob灵活度 & 泛型和发送的模板类设计 1.消息sms 邮箱/手机号/push发送的方案 1.判断收件人地址是否为空, ...

  9. Externalizable接口实现序列化与反序列化

    Externalizable接口实现序列化与反序列化 package com.example.core.mydemo.java; import com.example.core.mydemo.json ...

  10. spring jpa restful请求示例

    创建项目 导入jar包mysql 数据库和连接池jar <dependency> <groupId>org.springframework.boot</groupId&g ...