jwt私钥和公钥怎么获取_jwt 用rsa公钥私钥进行验证(python发送,java接受)

JWT的主要应用场景

身份认证在这种场景下,一旦用户完成了登陆,在接下来的每个请求中包含JWT,可以用来验证用户身份以及对路由,服务和资源的访问权限进行验证。由于它的开销非常小,可以轻松的在不同域名的系统中传递,所有目前在单点登录(SSO)中比较广泛的使用了该技术。 信息交换在通信的双方之间使用JWT对数据进行编码是一种非常安全的方式,由于它的信息是经过签名的,可以确保发送者发送的信息是没有经过伪造的。

JWT的结构

JWT包含了使用.分隔的三部分: Header 头部 Payload 负载 Signature 签名

其结构看起来是这样的Header.Payload.Signature

Header

在header中通常包含了两部分:token类型和采用的加密算法。{ "alg": "HS256", "typ": "JWT"} 接下来对这部分内容使用 Base64Url 编码组成了JWT结构的第一部分。

Payload

Token的第二部分是负载,它包含了claim, Claim是一些实体(通常指的用户)的状态和额外的元数据,有三种类型的claim:reserved, public 和 private.Reserved claims: 这些claim是JWT预先定义的,在JWT中并不会强制使用它们,而是推荐使用,常用的有 iss(签发者),exp(过期时间戳), sub(面向的用户), aud(接收方), iat(签发时间)。 Public claims:根据需要定义自己的字段,注意应该避免冲突 Private claims:这些是自定义的字段,可以用来在双方之间交换信息 负载使用的例子:{ "sub": "1234567890", "name": "John Doe", "admin": true} 上述的负载需要经过Base64Url编码后作为JWT结构的第二部分。

Signature

创建签名需要使用编码后的header和payload以及一个秘钥,使用header中指定签名算法进行签名。例如如果希望使用HMAC SHA256算法,那么签名应该使用下列方式创建: HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret) 签名用于验证消息的发送者以及消息是没有经过篡改的。 完整的JWT 完整的JWT格式的输出是以. 分隔的三段Base64编码,与SAML等基于XML的标准相比,JWT在HTTP和HTML环境中更容易传递。 下列的JWT展示了一个完整的JWT格式,它拼接了之前的Header, Payload以及秘钥签名:

encoded-jwt3.png

python发送数据

import calendar

import datetime

import time

import jenkins

import requests

import json

import logging

import configparser

import jwt

#read the private_key

with open('rsa_private_key.pem') as f:

private_key = f.read()

exp = datetime.datetime.utcnow() + datetime.timedelta(minutes=10)

exp = calendar.timegm(exp.timetuple())

# Generate the JWT

payload = {

# issued at time

'iat': int(time.time()),

# JWT expiration time (10 minute maximum)

'exp': exp,

# Integration's GitHub identifier

'iss': 'tom',

}

encoded = jwt.encode(payload, private_key, algorithm='RS256')

try:

headers = {

'content-type': "application/json",

'jwt': encoded

}

response = requests.post(server_url, headers=headers)

if response.status_code != 200:

logger.error("commit builds post go wrong , status code is : {}".format(response.status_code))

logger.error(response.text)

except Exception as e:

logger.error("commit builds post Error: {}".format(e))

java接受数据(springboot拦截器)

public class WebInterceptor implements HandlerInterceptor {

static final Logger logger = LoggerFactory.getLogger(WebInterceptor.class);

@Autowired

private MyConfig myconfig;

@Override

public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {

logger.info("============== request before ==============");

String jwt = httpServletRequest.getHeader("jwt");

logger.info("jwt is : " + jwt);

String str = null;

if(myconfig == null){

WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(httpServletRequest.getServletContext());

myconfig = wac.getBean(MyConfig.class);

}

try {

//read the public key

File file = ResourceUtils.getFile(myconfig.getRsaPublicKeyDir());

FileReader reader = new FileReader(file);

BufferedReader bReader = new BufferedReader(reader);

StringBuilder sb = new StringBuilder();

String s;

while ((s = bReader.readLine()) != null) {

sb.append(s);

}

bReader.close();

str = sb.toString();

RsaKeyUtil rsaKeyUtil = new RsaKeyUtil();

PublicKey publicKey = rsaKeyUtil.fromPemEncoded(str);

// create a JWT consumer

JwtConsumer jwtConsumer = new JwtConsumerBuilder()

.setRequireExpirationTime()

.setVerificationKey(publicKey)

//不能少不然会报错

.setRelaxVerificationKeyValidation()

.setJwsAlgorithmConstraints( // only allow the expected signature algorithm(s) in the given context

new AlgorithmConstraints(AlgorithmConstraints.ConstraintType.WHITELIST, // which is only RS256 here

AlgorithmIdentifiers.RSA_USING_SHA256))

.build();

// validate and decode the jwt

JwtClaims jwtDecoded = jwtConsumer.processToClaims(jwt);

Map jwtClaims = jwtDecoded.getClaimsMap();

Object iss = jwtClaims.get("iss");

logger.info("jwtClaims is : "+ jwtClaims);

}catch (Exception e){

logger.error(e.getMessage());

return false;

}

return true;

}

}

签名的目的

最后一步签名的过程,实际上是对头部以及载荷内容进行签名。一般而言,加密算法对于不同的输入产生的输出总是不一样的。对于两个不同的输入,产生同样的输出的概率极其地小(有可能比我成世界首富的概率还小)。所以,我们就把“不一样的输入产生不一样的输出”当做必然事件来看待吧。

所以,如果有人对头部以及载荷的内容解码之后进行修改,再进行编码的话,那么新的头部和载荷的签名和之前的签名就将是不一样的。而且,如果不知道服务器加密的时候用的密钥的话,得出来的签名也一定会是不一样的。

服务器应用在接受到JWT后,会首先对头部和载荷的内容用同一算法再次签名。那么服务器应用是怎么知道我们用的是哪一种算法呢?别忘了,我们在JWT的头部中已经用alg字段指明了我们的加密算法了。

如果服务器应用对头部和载荷再次以同样方法签名之后发现,自己计算出来的签名和接受到的签名不一样,那么就说明这个Token的内容被别人动过的,我们应该拒绝这个Token,返回一个HTTP 401 Unauthorized响应。

信息会暴露?

是的。

所以,在JWT中,不应该在载荷里面加入任何敏感的数据。在上面的例子中,我们传输的是用户的User ID。这个值实际上不是什么敏感内容,一般情况下被知道也是安全的。

但是像密码这样的内容就不能被放在JWT中了。如果将用户的密码放在了JWT中,那么怀有恶意的第三方通过Base64解码就能很快地知道你的密码了。

JWT的适用场景

我们可以看到,JWT适合用于向Web应用传递一些非敏感信息。例如在上面提到的完成加好友的操作,还有诸如下订单的操作等等。

其实JWT还经常用于设计用户认证和授权系统,甚至实现Web应用的单点登录。在下一次的文章中,我将为大家系统地总结JWT在用户认证和授权上的应用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/346550.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

通过OAuth 2.0和Okta构建具有安全的服务器到服务器通信的Spring Boot应用

“我喜欢编写身份验证和授权代码。” 〜从来没有Java开发人员。 厌倦了一次又一次地建立相同的登录屏幕? 尝试使用Okta API进行托管身份验证,授权和多因素身份验证。 大多数OAuth 2.0指南都围绕用户的上下文,即使用Google,Github…

springboot java获取版本号_深入实践Spring Boot 实战篇,大佬整理出的PDF文档

如何使用Spring Boot 本文章将会详细介绍如何使用Spring Boot。它覆盖了构建系统,自动配置和运行/部署选项等主题。我们也覆盖了一些Spring Boot最佳实践。尽管Spring Boot没有什么特别的(只是一个你能消费的库),但仍有一些建议,如果你遵循的…

vue v html安全,vue 中控制v-html 中的样式,但不影响全局的小技巧

我们知道在 Vue 中,style可以用两种方式来导入:// method1import (./a.css);//method2复制代码但是不管哪一种,导进的css文件都是应用于全局的,有时候我们不想要这样的效果。而要使得css只对当前的组件有效,即局部应用…

6 redis 编译失败_Centos7.8环境搭建Redis主从复制和哨兵模式

本节我们搭建Redis主从复制和哨兵模式集群,集群的好处是把数据分散不不同的服务器上,解决网站中的很多高并发,高负载等问题,很好的提高网站的性能,也能解决mysql的数据读写问题,所以我们搭建集群非常有必要…

springboot异步注解_Spring Boot 2 :Spring Boot 中的响应式编程和 WebFlux 入门

【小宅按】Spring 5.0 中发布了重量级组件 Webflux,拉起了响应式编程的规模使用序幕。WebFlux 使用的场景是异步非阻塞的,使用 Webflux 作为系统解决方案,在大多数场景下可以提高系统吞吐量。Spring Boot 2.0 是基于 Spring5 构建而成&#x…

结尾的单词_22个以“ez”结尾的西语单词,你掌握了吗?

22 palabras que terminan en -ez22个以“-ez”结尾的西语单词ntido → nitidez 清澈,透明lcido → lucidez 光亮;清楚plido → palidez 苍白;暗淡rpido → rapidez 迅速cido → acidez 酸性estrecho → estrechez 狭窄esbelto → esb…

python xlwt xlrd模块详解_python操作excel之xlrd、xlwt模块详解

python操作excel主要用到xlrd和xlwt这两个库,即xlrd是读excel,xlwt是写excel的库。 可从这里下载https://pypi.python.org/pypi。下面分别记录python读和写excel. python读excel——xlrd 这个过程有几个比较麻烦的问题,比如读取日期、读合并单…

江苏省计算机等级知识,江苏省计算机二级考试基础知识_计算机基础练习题

计算机及发展1.早期计算机的主要应用是_________。A.科学计算 B. 信息处理 C. 实时控制 D. 辅助设计2.数据库技术在信息系统中主要用于_________。A.信息采集 B. 信息存储 C. 信息传输 D. 信息检索3.中国的巨型机的典型…

java知识回顾_Java7 –回顾

java知识回顾我开始写博客文章,介绍即将发布的Java8版本中的新增功能 ,并认为我将从快速回顾一下Java7带给我们的内容开始。 Java7于2011年7月发布,被描述为“更具进化性而非革命性”。 “虽然有了一些重大改进,但并没有真正破土…

python应届生找工作在深圳_应届毕业程序员找工作,企业最看重你们这些地方

这篇文章来谈一下应届生找工作的问题,最近有很多在校大学生跟我咨询很多企业很多工作要求有工作经验,那这样没工作经验的人都去哪学经验,要求工作经验真的有必要吗?应届生毕业找工作,一直有一个困惑是什么,…

计算机模拟技术在教学上的应用,计算机模拟技术在水利工程学科试验教学中的应用...

[摘要]本文对水利工程试验教学中计算机模拟技术的应用问题进行了初步探讨,计算机模拟是一项技术,同时也是一种学习环境、教学模式、教学思想。计算机模拟教学应用的研究涉及了现代教育技术、教育心理、课程结构、教学内容的安排等多个领域。本文尝试为水…

PHP密码问题陈婷代码_PHP实现登录注册

一、首先实现一个PHP的简单登录注册的话 我们要简单的与后端定义一下接口和传输数据的方式 并且我们要有一个phpStudy服务器。第一步:当我们点击注册按钮的时候数据库要接收到客户端请求的数据 第二步:接收到数据以后服务器要处理数据:1.确定…

在Spring Boot中使用Vaadin的简介

介绍 Vaadin的工作方式依赖于服务器端渲染,因此可以自然地集成到诸如Spring之类的框架中。 Vaadin的Spring集成已经存在了一段时间,并且提供了用于在Spring容器中配置和管理Vaadin的工具,如果您希望将Vaadin与Spring Boot结合使用&#xff0c…

python如何读取数据保存为新格式_python,初学者应用实例:读取文件中的数据,将将北京时间转换成世界时间,再保存成新的CSV格式文件...

数据格式转换是科研工作中经常需要完成的任务。本程序实现了这个功能。将文本文件“TableS1.dat”中的数据读取,原文件格式为: No Date Time Mag Dis 11999/07/2505:28:39.580 21999/07/2523:06:31.940 31999/08/0601:54:40.6001.012.5 41999/08/1708:01…

哈工大三本计算机考研,纯干货【普通三本逆袭哈工大】—城市规划考研必胜经验...

【专业课】楼主就想起来什么就总结点什么吧,你们就知足吧!话说专业课是你相对来说比较吃亏的一科目(与本校学生相比较),为什么说吃亏呢?No.1:人家本校都学过,至少知道每门课的知识点是什么,每个…

excel转las文件_这3种Word、Excel格式不变的互转方法,实在太好用了

日常工作中用Word写总结、写报告,写分析,一定离不开数据支持。但在制作的过程中你一定碰到过这些问题:Excel里做的表格、图表,一复制到word就变的乱七八糟!那么,有没有什么好的方法,即省时&…

stm32编码器正反转计数程序_光电编码器接线图分析

编码器(encoder)是将信号(如比特流)或数据进行编制、转换为可用以通讯、传输和存储的信号形式的设备。光电编码器如果按信号原理来分类的话,可以分为增量型编码器和绝对型编码器。旋转编码器是一种光电式旋转测量装置,它将被测的角位移直接转换成数字信号…

jieba库词频统计_如何用python对《三国演义》、《红楼梦》等名著开展词云分析及字频统计、出场统计等工作。...

以下以《红楼梦》为例进行设计。在制作词云图及统计之前,需要下载python的几个库,wordcloud、jieba以及imageio等,我的操作系统为Windows10,IDE环境为idle,下载方式就直接搜索cmd,打开命令提示符窗口&#…

计算机学院考勤管理办法,计科学院进一步加强课堂考勤实施意见(试行)

为了加强课堂教学管理、规范教学秩序、强化学生课堂出勤率、提高课堂教学效果,进一步推动教风、学风建设,结合我院课堂教学中存在的实际问题,提出如下实施意见:一、学生必须严格按照修读课程计划表按时上课,不得迟到或…

java8的新特性_Java8的

java8的新特性Java8没有安排释放,直到2014年3月,但早期发行版本已经可用了一段时间。 一些最有趣的新功能是: 流 功能接口 默认方法 Lambdas Java时间 流 新的java.util.stream软件包包含“支持元素流上的功能样式操作的类”。 流不是一…