keycloak~jwt的rs256签名的验证方式
接口地址
- keycloak开放接口地址:/auth/realms/fabao/.well-known/openid-configuration
rsa算法相关术语
RSA算法是一种非对称加密算法,其安全性基于大整数分解的困难性。在RSA算法中,有以下几个关键参数:
n(模数):n 是一个大整数,通常为两个大素数 p 和 q 的乘积,即 n = p * q。n 用于生成公钥和私钥,并且决定了加密和解密的计算过程。
e(公钥指数):e 是一个与 φ(n) 互质的小整数,其中 φ(n) 是欧拉函数,表示小于 n 且与 n 互质的正整数的个数。e 在加密时使用,作为公钥的一部分。
公钥:公钥由 (n, e) 组成,其中 n 是模数,e 是公钥指数。公钥用于加密消息,任何人都可以获得公钥进行加密操作。
私钥:私钥由 (n, d) 组成,其中 n 是模数,d 是私钥指数。私钥用于解密已经被公钥加密的消息,只有私钥的持有者才能获得解密能力。
总结来说,RSA算法通过公钥加密、私钥解密的方式实现信息的安全传输,公钥用于加密数据,私钥用于解密数据;反过来,私钥可以用来生成签名,而公钥可以用来验证签名的有效性。
RSA和RS256
RSA:RSA是一种非对称加密算法,可以用于数据的加密和数字签名。在RSA中,公钥和私钥是成对存在的,公钥用于加密数据或验证数字签名,私钥用于解密数据或生成数字签名。
RS256:RS256是一种基于RSA算法的数字签名算法,其中“RS”代表RSA算法,“256”表示使用SHA-256哈希算法生成摘要。RS256常用于JWT(JSON Web Token)的数字签名过程中,用于验证数据的完整性和真实性。
因此,可以说RS256是RSA算法的一种特定应用,用于数字签名,并且结合了SHA-256哈希算法。RSA算法还可以用于加密数据等其他用途,而RS256主要用于数字签名。
获取keycloak颁发的公钥
- 从jwks公钥开放地址获取公钥 /auth/realms/fabao/protocol/openid-connect/certs
- 从keycloak后台获取公钥
keycloak中jwt的验证
- 在客户端验证keycloak的token是否在传输过程中被篡改,即签名验证是否通过
// RSA公钥的模数
String modulus = "yOCNCy8x280...";
// RSA公钥的指数
String exponent = "AQAB";
// keycloak拿到的公钥
String publicKeyString = "MIIBIjANBg...B";
String KcJwtToken = "eyJh...";
// 根据n和e生成公钥来验证签名
@Test
public void verifySign() throws Exception {
String[] jwtParts = KcJwtToken.split("\\.");
String header = jwtParts[0];
String payload = jwtParts[1];
// 解码Base64格式的模数和指数
byte[] decodedModulus = Base64.getUrlDecoder().decode(modulus);// getMimeDecoder()会忽略非Base64字符(如换行符、空格等)
byte[] decodedExponent = Base64.getUrlDecoder().decode(exponent);
// 构建RSA公钥对象
RSAPublicKeySpec publicSpec = new RSAPublicKeySpec(new BigInteger(1, decodedModulus),
new BigInteger(1, decodedExponent));
// 验征RSA签名
PublicKey publicKey = KeyFactory.getInstance("rsa").generatePublic(publicSpec);
boolean result = RSAUtils.verify(header + "." + payload, publicKey, jwtParts[2]);
System.out.print("验签结果:" + result);
}
// 根据认证平台颁发的公钥字符串来验证签名
@Test
public void verifyJwtToken() throws Exception {
String[] jwtParts = KcJwtToken.split("\\.");
String header = jwtParts[0];
String payload = jwtParts[1];
String sign = jwtParts[2];
PublicKey publicKey = RSAUtils.getPublicKey(publicKeyString);
boolean result = RSAUtils.verify(header + "." + payload, publicKey, sign);
System.out.print("验签结果:" + result);
}
需要注意的是,以上jwt的token签名使用rs256(SHA256withRSA)算法生成的签名,所以本例子都是采用这种签名算法实现的,例外,也有h256,h512等哈希算法。
keycloak支持的签名算法
public static final String RS256 = "SHA256withRSA";
public static final String RS384 = "SHA384withRSA";
public static final String RS512 = "SHA512withRSA";
public static final String HS256 = "HMACSHA256";
public static final String HS384 = "HMACSHA384";
public static final String HS512 = "HMACSHA512";
public static final String ES256 = "SHA256withECDSA";
public static final String ES384 = "SHA384withECDSA";
public static final String ES512 = "SHA512withECDSA";
public static final String PS256 = "SHA256withRSAandMGF1";
public static final String PS384 = "SHA384withRSAandMGF1";
public static final String PS512 = "SHA512withRSAandMGF1";
public static final String AES = "AES";
public static final String SHA256 = "SHA-256";
public static final String SHA384 = "SHA-384";
public static final String SHA512 = "SHA-512";
keycloak~jwt的rs256签名的验证方式的更多相关文章
- ASP.NET WebApi 基于JWT实现Token签名认证
一.前言 明人不说暗话,跟着阿笨一起玩WebApi!开发提供数据的WebApi服务,最重要的是数据的安全性.那么对于我们来说,如何确保数据的安全将会是需要思考的问题.在ASP.NET WebServi ...
- ASP.NET Core Web API + Angular 仿B站(三)后台配置 JWT 的基于 token 的验证
前言: 本系列文章主要为对所学 Angular 框架的一次微小的实践,对 b站页面作简单的模仿. 本系列文章主要参考资料: 微软文档: https://docs.microsoft.com/zh-cn ...
- vue & nodejs jwt 的基于token身份验证
现在比较流行的验证方式,是带着token的登录验证 原理 1. 登陆时,客户端发送用户名密码 2. 服务端验证用户名密码是否正确,校验通过就会生成一个有时效的token串,发送给客户端 3. 客户端储 ...
- WebApi基于Token和签名的验证
最近一段时间在学习WebApi,涉及到验证部分的一些知识觉得自己并不是太懂,所以来博客园看了几篇博文,发现一篇讲的特别好的,读了几遍茅塞顿开(都闪开,我要装逼了),刚开始读有些地方不理解,所以想了很久 ...
- Java 程序的打包、签名和验证
参考资料 该文中的内容来源于 Oracle 的官方文档.Oracle 在 Java 方面的文档是非常完善的.对 Java 8 感兴趣的朋友,可以直接找到这个总入口 Java SE 8 Document ...
- iOS使用Security.framework进行RSA 加密解密签名和验证签名
iOS 上 Security.framework为我们提供了安全方面相关的api: Security框架提供的RSA在iOS上使用的一些小结 支持的RSA keySize 大小有:512,768,10 ...
- Azure Service Bus 中的身份验证方式 Shared Access Signature
var appInsights=window.appInsights||function(config){ function r(config){t[config]=function(){var i= ...
- 加密解密(2)*客户端,服务器,CA(Certificate Authority),公钥,私钥,证书,签名,验证
加密解密(2)*客户端,服务器,CA(Certificate Authority),公钥,私钥,证书,签名,验证 各角色比喻 客户端:通常为请求方,要验证服务器的身份. 服务器:通常为响应方,有时也要 ...
- openssl生成签名与验证签名
继上一篇RSA对传输信息进行加密解密,再写个生成签名和验证签名. 一般,安全考虑,比如接入支付平台时,请求方和接收方要互相验证是否是你,就用签名来看. 签名方式一般两种,对称加密和非对称加密.对称加密 ...
- RSA加密解密及RSA签名和验证及证书
RSA加密解密及RSA签名和验证及证书 公钥是给别人的 发送密文使用公钥加密 验证签名使用公钥验证 私钥是自己保留的 接受密文使用私钥解密 发送签名使用私钥签名 上述过程逆转是不行的,比如使用私钥加密 ...
随机推荐
- ANDROID : NEW IDEA
•前言 学习了 Android 开发后,小脑袋瓜中时不时会蹦跶出一些想法: 这些想法大都是我现在实现不了的,所以就需要记录一下,等学到相关知识时,在着手解决. •NEW IDEA 1 将一款 APP( ...
- STM32 LwIP学习过程问题总结(一):LwIP ping不通,抓包发现ICMP校验和为0x0000
一.问题 今天在将之前的STM32 LwIP1.4.1版本程序移植到2.1.2版本上时,发现ping不同,但是开发板有ICMP回复包,黄颜色警告checksum为0x0000.说明LwIP移植应该是没 ...
- C++学习笔记之高级语法
目录 高级语法 面向对象--类 对象的属性 运算符重载 拷贝构造函数 IO缓存 头文件的重复包含问题 深拷贝与浅拷贝 面向对象三大特性 高级语法 面向对象--类 C++使用struct.class来定 ...
- 基于ads1299生物电信号采集研发总结之参考信号的接法
一 概念 ads1299的电极端有两种采集方式,单端和差分.两种的使用方式又有很大的区别,怎么高质量的采集信号,这个是一个比较难的问题. 二 解析 参考信号SRB1的接法,决定了采集到数据的精确度和信 ...
- JavaScript js 教程 视频教程
一个完整的JavaScript实现应该由以下三个部分构成: ECMAScript,DOM和BOM 1 特点: JS的特点 解释型语言 类似于 C 和 Java 的语法结构 动态语言 基于原型的面向对象 ...
- 通达信金融终端解锁Level-2功能 续(202307)
外挂方式,不修改原程序.解锁Level-2 逐笔分析.对"非法访问"Say NO! LEVEL2逐笔分析破解后,仍然被防调试. 竞价分析,实时资金示例. 逆向通达信Level-2 ...
- github 上不去
win:C:\WINDOWS\system32\drivers\etc linux:/etc/hosts 在这个网址查询每个网址对应的ip:https://www.ipaddress.com/ 202 ...
- 直播预告:面对技术带来的新机遇,CG人如何腾飞?
"新锐先锋,玩转未来"--首届实时染3D动画创作大赛由瑞云科技主办,英伟达.青椒云.3DCAT实时渲染云协办,戴尔科技集团.Reallusion.英迈.万生华态.D5渲染器.中视典 ...
- linux权限、特殊权限、ACL控制
Linux基本权限 1.权限基本概述 1.什么是权限? 我们可以把它理解为操作系统对用户能够执行的功能所设立的限制,主要用于约束用户能对系统所做的操作,以及内容访问的范围,或者说,权限是指某个特定的用 ...
- vue项目nginx部署二级目录
一.修改router.js中添加base根目录配置 const vueRouter = new Router({ mode: 'history', base: 'app', 二.修改vue.confi ...