ToB企服应用市场:ToB评测及商务社交产业平台

标题: keycloak~jwt的rs256签名的验证方式 [打印本页]

作者: 盛世宏图    时间: 2024-5-17 17:25
标题: keycloak~jwt的rs256签名的验证方式
接口地址


rsa算法相干术语

RSA算法是一种非对称加密算法,其安全性基于大整数分解的困难性。在RSA算法中,有以下几个关键参数:
总结来说,RSA算法通过公钥加密、私钥解密的方式实现信息的安全传输,公钥用于加密数据,私钥用于解密数据;反过来,私钥可以用来生成签名,而公钥可以用来验证签名的有效性。
RSA和RS256

因此,可以说RS256是RSA算法的一种特定应用,用于数字签名,而且结合了SHA-256哈希算法。RSA算法还可以用于加密数据等其他用途,而RS256主要用于数字签名。
获取keycloak颁发的公钥



keycloak中jwt的验证

  1. // RSA公钥的模数
  2. String modulus = "yOCNCy8x280...";
  3. // RSA公钥的指数
  4. String exponent = "AQAB";
  5. // keycloak拿到的公钥
  6. String publicKeyString = "MIIBIjANBg...B";
  7. String KcJwtToken = "eyJh...";
复制代码
  1. @Test
  2. public void verifySign() throws Exception {
  3.         String[] jwtParts = KcJwtToken.split("\\.");
  4.         String header = jwtParts[0];
  5.         String payload = jwtParts[1];
  6.         // 解码Base64格式的模数和指数
  7.         byte[] decodedModulus = Base64.getUrlDecoder().decode(modulus);// getMimeDecoder()会忽略非Base64字符(如换行符、空格等)
  8.         byte[] decodedExponent = Base64.getUrlDecoder().decode(exponent);
  9.         // 构建RSA公钥对象
  10.         RSAPublicKeySpec publicSpec = new RSAPublicKeySpec(new BigInteger(1, decodedModulus),
  11.                         new BigInteger(1, decodedExponent));
  12.         // 验征RSA签名
  13.         PublicKey publicKey = KeyFactory.getInstance("rsa").generatePublic(publicSpec);
  14.         boolean result = RSAUtils.verify(header + "." + payload, publicKey, jwtParts[2]);
  15.         System.out.print("验签结果:" + result);
  16. }
复制代码
  1. // 根据认证平台颁发的公钥字符串来验证签名
  2. @Test
  3. public void verifyJwtToken() throws Exception {
  4.         String[] jwtParts = KcJwtToken.split("\\.");
  5.         String header = jwtParts[0];
  6.         String payload = jwtParts[1];
  7.         String sign = jwtParts[2];
  8.         PublicKey publicKey = RSAUtils.getPublicKey(publicKeyString);
  9.         boolean result = RSAUtils.verify(header + "." + payload, publicKey, sign);
  10.         System.out.print("验签结果:" + result);
  11. }
复制代码
需要注意的是,以上jwt的token签名利用rs256(SHA256withRSA)算法生成的签名,所以本例子都是采用这种签名算法实现的,例外,也有h256,h512等哈希算法。
keycloak支持的签名算法
  1. public static final String RS256 = "SHA256withRSA";
  2. public static final String RS384 = "SHA384withRSA";
  3. public static final String RS512 = "SHA512withRSA";
  4. public static final String HS256 = "HMACSHA256";
  5. public static final String HS384 = "HMACSHA384";
  6. public static final String HS512 = "HMACSHA512";
  7. public static final String ES256 = "SHA256withECDSA";
  8. public static final String ES384 = "SHA384withECDSA";
  9. public static final String ES512 = "SHA512withECDSA";
  10. public static final String PS256 = "SHA256withRSAandMGF1";
  11. public static final String PS384 = "SHA384withRSAandMGF1";
  12. public static final String PS512 = "SHA512withRSAandMGF1";
  13. public static final String AES = "AES";
  14. public static final String SHA256 = "SHA-256";
  15. public static final String SHA384 = "SHA-384";
  16. public static final String SHA512 = "SHA-512";
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4