接口地址

  • keycloak开放接口地址:/auth/realms/fabao/.well-known/openid-configuration

rsa算法相关术语

RSA算法是一种非对称加密算法,其安全性基于大整数分解的困难性。在RSA算法中,有以下几个关键参数:

  1. n(模数):n 是一个大整数,通常为两个大素数 p 和 q 的乘积,即 n = p * q。n 用于生成公钥和私钥,并且决定了加密和解密的计算过程。

  2. e(公钥指数):e 是一个与 φ(n) 互质的小整数,其中 φ(n) 是欧拉函数,表示小于 n 且与 n 互质的正整数的个数。e 在加密时使用,作为公钥的一部分。

  3. 公钥:公钥由 (n, e) 组成,其中 n 是模数,e 是公钥指数。公钥用于加密消息,任何人都可以获得公钥进行加密操作。

  4. 私钥:私钥由 (n, d) 组成,其中 n 是模数,d 是私钥指数。私钥用于解密已经被公钥加密的消息,只有私钥的持有者才能获得解密能力。

总结来说,RSA算法通过公钥加密、私钥解密的方式实现信息的安全传输,公钥用于加密数据,私钥用于解密数据;反过来,私钥可以用来生成签名,而公钥可以用来验证签名的有效性。

RSA和RS256

  1. RSA:RSA是一种非对称加密算法,可以用于数据的加密和数字签名。在RSA中,公钥和私钥是成对存在的,公钥用于加密数据或验证数字签名,私钥用于解密数据或生成数字签名。

  2. 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签名的验证方式的更多相关文章

  1. ASP.NET WebApi 基于JWT实现Token签名认证

    一.前言 明人不说暗话,跟着阿笨一起玩WebApi!开发提供数据的WebApi服务,最重要的是数据的安全性.那么对于我们来说,如何确保数据的安全将会是需要思考的问题.在ASP.NET WebServi ...

  2. ASP.NET Core Web API + Angular 仿B站(三)后台配置 JWT 的基于 token 的验证

    前言: 本系列文章主要为对所学 Angular 框架的一次微小的实践,对 b站页面作简单的模仿. 本系列文章主要参考资料: 微软文档: https://docs.microsoft.com/zh-cn ...

  3. vue & nodejs jwt 的基于token身份验证

    现在比较流行的验证方式,是带着token的登录验证 原理 1. 登陆时,客户端发送用户名密码 2. 服务端验证用户名密码是否正确,校验通过就会生成一个有时效的token串,发送给客户端 3. 客户端储 ...

  4. WebApi基于Token和签名的验证

    最近一段时间在学习WebApi,涉及到验证部分的一些知识觉得自己并不是太懂,所以来博客园看了几篇博文,发现一篇讲的特别好的,读了几遍茅塞顿开(都闪开,我要装逼了),刚开始读有些地方不理解,所以想了很久 ...

  5. Java 程序的打包、签名和验证

    参考资料 该文中的内容来源于 Oracle 的官方文档.Oracle 在 Java 方面的文档是非常完善的.对 Java 8 感兴趣的朋友,可以直接找到这个总入口 Java SE 8 Document ...

  6. iOS使用Security.framework进行RSA 加密解密签名和验证签名

    iOS 上 Security.framework为我们提供了安全方面相关的api: Security框架提供的RSA在iOS上使用的一些小结 支持的RSA keySize 大小有:512,768,10 ...

  7. Azure Service Bus 中的身份验证方式 Shared Access Signature

    var appInsights=window.appInsights||function(config){ function r(config){t[config]=function(){var i= ...

  8. 加密解密(2)*客户端,服务器,CA(Certificate Authority),公钥,私钥,证书,签名,验证

    加密解密(2)*客户端,服务器,CA(Certificate Authority),公钥,私钥,证书,签名,验证 各角色比喻 客户端:通常为请求方,要验证服务器的身份. 服务器:通常为响应方,有时也要 ...

  9. openssl生成签名与验证签名

    继上一篇RSA对传输信息进行加密解密,再写个生成签名和验证签名. 一般,安全考虑,比如接入支付平台时,请求方和接收方要互相验证是否是你,就用签名来看. 签名方式一般两种,对称加密和非对称加密.对称加密 ...

  10. RSA加密解密及RSA签名和验证及证书

    RSA加密解密及RSA签名和验证及证书 公钥是给别人的 发送密文使用公钥加密 验证签名使用公钥验证 私钥是自己保留的 接受密文使用私钥解密 发送签名使用私钥签名 上述过程逆转是不行的,比如使用私钥加密 ...

随机推荐

  1. Python文件操作系统

    [一]文件操作基本流程 # 1. 打开文件,由应用程序向操作系统发起系统调用open(...),操作系统打开该文件,对应一块硬盘空间,并返回一个文件对象赋值给一个变量f f=open('a.txt', ...

  2. ADS1299开发调试总结之寄存器使用说明简析

    一 前记 在生物生理信号测量领域,ads12xx系列是一个无法绕过去的存在.笔者最近几个项目围绕着动物生理信号测量来做.所以用ads12xx比较多一些. 中间遇到了一些问题,这里做一个总结吧. 二 寄 ...

  3. Python 的结构体函数 struct pack, unpack 用法详解

    一 python 结构体 * python struct 模块可以用来在存储二进制文件,广泛用在文件系统,网络连接领域. *  它可以用在c语言和python语言之间的数据的格式转换. 二  Pyth ...

  4. Java加密技术(五)——非对称加密算法的由来DH

    Java非对称加密算法dh     接下来我们分析DH加密算法,一种适基于密钥一致协议的加密算法. DH Diffie-Hellman算法(D-H算法),密钥一致协议.是由公开密钥密码体制的奠基人Di ...

  5. SpringBoot 支付宝付款接口类、支付异步回调函数模板

    1.付款接口类 1.1.引入Maven依赖 <dependency> <groupId>com.alipay.sdk</groupId> <artifactI ...

  6. Android USB开发1—开发环境搭建

    通过Genymotion 与 VirtualBox 可以实现将电脑中的USB设备转接到Android模拟器中进行通信. Genymotion 配置 首先从https://www.genymotion. ...

  7. Performance Improvements in .NET 8 -- Exceptions & Reflection & Primitives【翻译】

    Exceptions 在 .NET 6 中,ArgumentNullException 增加了一个 ThrowIfNull 方法,我们开始尝试提供"抛出助手".该方法的目的是简洁地 ...

  8. 【剑指 Offer II 118. 多余的边】并查集求回路

    class Solution { int[] parent; int[] rank; public void init(int n) { parent = new int[n + 1]; rank = ...

  9. Dll堆栈问题(Dll的静态变量与全局变量、vs的MT与MD)

    问题引入:dll有一个导出函数,函数参数是string&,string在函数内部被=赋值.在exe动态加载此dll,调用此导出函数后,会崩溃. 原因:如果任何STL类的实现中使用了静态变量(我 ...

  10. gRPC入门学习之旅(三)

    gRPC入门学习之旅(一) gRPC入门学习之旅(二) 2.3.创建自定义服务 除上面的模板中自带的一个gRPC服务之后,我们再创建一个自己的服务,我将创建一个用户信息gRPC服务,主要功能有三个,登 ...