ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

jwt4cj RSA非对称签名教程:RS256/RS384/RS512公私钥JWT签发与验证详解

jwt4cj RSA非对称签名教程:RS256/RS384/RS512公私钥JWT签发与验证详解 jwt4cj RSA非对称签名教程RS256/RS384/RS512公私钥JWT签发与验证详解【免费下载链接】jwt4cj一个用于生成和验证JSON Web Token的库项目地址: https://gitcode.com/Cangjie-TPC/jwt4cjjwt4cj 是一款基于 RFC 7519 标准的仓颉语言 JWT 库支持使用 RSA 非对称算法RS256、RS384、RS512签发与验证 JSON Web Token。本文面向新手从零讲清 RSA 公私钥在 JWT 签发与验证中各自扮演什么角色以及如何用 jwt4cj 三步完成签发、解码与校验帮助你快速把 JWT 安全认证用到自己的仓颉项目里。为什么 JWT 验签要选 RSA 非对称算法对称签名如 HMAC要求签发方和验证方持有同一把密钥密钥必须保密传输多服务场景下容易泄露。而 RSA 非对称签名采用公私钥配对角色持有密钥执行操作签发方Server ARSA 私钥生成 JWT 签名验证方Server B / 网关RSA 公钥校验 JWT 签名私钥永不外发只有签发方能生成合法 Token公钥可以分发任何拿到公钥的服务都能验证非常适合微服务、前后端分离架构无状态Token 自带签名服务端无需存储会话。jwt4cj 完整覆盖了这条链路核心流程如下图所示Builder负责设置 Header/Payload 并签名生成 Token 字符串Verification负责添加校验规则JWTVerifier最终完成签名与 Claim 双重验证。第一步准备 RSA 公私钥文件PEM 格式jwt4cj 通过RSAKeyProvider从 PEM 文件加载密钥仓库测试目录中就自带了可直接参考的密钥文件公钥示例test_rsa_publicKey.pem私钥示例test_rsa_privateKey.pem自己生成密钥对的常用命令openssl# 生成 2048 位私钥 openssl genrsa -out rsa_privateKey.pem 2048 # 从私钥导出公钥 openssl rsa -in rsa_privateKey.pem -pubout -out rsa_publicKey.pem 生产环境请使用 2048 位以上密钥并将私钥文件加入.gitignore严禁提交到代码仓库。jwt4cj 提供两种密钥加载方式源码见 rsa_key_provider_impl.cjRSAKeyProviderFileImpl(私钥路径, 公钥路径)直接从 PEM 文件加载最常用RSAKeyProviderImpl(私钥对象, 公钥对象)先自行解析 PEM 得到密钥对象再传入适合密钥来自内存或密钥管理服务的场景。参考 test_rsa_key_provider.cj 可以看到内存方式的完整写法RSAPrivateKey.decodeFromPem解析私钥、RSAPublicKey(privateKey)派生公钥再交给RSAKeyProviderImpl。第二步用 RSA 算法签发 JWT Tokenjwt4cj 通过Algorithm抽象类统一了三种 RSA 算法的入口源码位于 algorithm.cj算法构造函数底层签名算法适用场景RS256Algorithm.RSA256(keyProvider)SHA256withRSA日常首选性能与安全性均衡RS384Algorithm.RSA384(keyProvider)SHA384withRSA对摘要强度要求更高的场景RS512Algorithm.RSA512(keyProvider)SHA512withRSA金融、政务等高安全级别场景签发时签名原文是Header.Base64(Payload)的拼接内容见 buildContent私钥对摘要签名后经 Base64Url 编码作为第三段 Token。签发示例import std.fs.* import std.posix.* import jwt4cj.* main() { let path getcwd() let pri ${path}/test_rsa_privateKey.pem let pub ${path}/test_rsa_publicKey.pem // 用公私钥文件构造 RS256 算法对象 let alg Algorithm.RSA256(RSAKeyProviderFileImpl(pri, pub)) // 链式构建 Header / Payload 并用私钥签名 let token JWT.create() .withKeyId(keyId) // 写入 Header 的 kid便于多密钥轮换 .withIssuer(my-service) // 签发者 .withSubject(user-1001) // 主题用户标识 .withAudience([web, app]) .withExpiresAt(DateTime.now().add(duration: Duration(hours: 2))) .sign(alg) println(token) // xxxxx.yyyyy.zzzzz第三段即 RSA 签名值 0 }切换 RS384 / RS512 只需把Algorithm.RSA256(...)换成Algorithm.RSA384(...)或Algorithm.RSA512(...)业务代码零改动。更多完整用例可参考 test_Verifier_Algorithm_rsa.cj。第三步用公钥验证 JWT 签名与 Claim验证方只需要公钥。jwt4cj 的校验分两层JWT.require(算法)生成Verification添加业务规则build()得到JWTVerifier后调用verify(token)先做签名验证、再逐项校验 Claim。import jwt4cj.* main() { let pub ${path}/test_rsa_publicKey.pem // 仅公钥即可 let alg Algorithm.RSA256(RSAKeyProviderFileImpl(pub)) let verifier: JWTVerifier JWT.require(alg) .withIssuer([my-service]) // 期望的签发者 .withSubject(user-1001) // 期望的主题 .withAnyOfAudience([web, app]) .withClaimPresence(role) // 要求该 Claim 存在 .build() try { let decoded verifier.verify(token) // 签名 Claim 双重校验 println(验证通过过期时间, decoded.getExpiresAt()) } catch (e: Exception) { println(验证失败, e.message) } 0 }验证失败时 jwt4cj 会抛出细粒度异常便于精准定位问题异常定义集中在src目录例如签名不匹配抛出 signature_verification_exception.cj、Token 过期抛出 token_expired_exception.cj、算法不一致抛出 algorithm_mismatch_exception.cj。RS256 / RS384 / RS512 怎么选常见坑位清单✅默认选 RS256签名值更短、计算更快是业界主流✅算法必须前后一致用 RS256 签发就不能拿 RS384 算法对象去验证否则抛出算法不匹配异常原理见 rsa_algorithm.cj 中按SHAxxxwithRSA分发摘要逻辑⚠️签发带私钥、验证带公钥RSAKeyProviderFileImpl(私钥, 公钥)两个参数都有但签发场景验证方只传公钥即可⚠️kid 建议写上多密钥轮换时用withKeyId标识当前密钥方便验证方按kid选取对应公钥⚠️注意 PKCS1 填充jwt4cj 的padType默认 PKCS1与主流库Java/Go生成的 Token 互认无障碍。项目路线图中RSA 验签相关能力已按里程碑持续完善进展一览常见问题 FAQQ1验证方必须知道签发方的私钥吗不需要。这正是 RSA 非对称方案的核心价值——验证端仅持有公钥即可确认 Token 来自合法签发方且未被篡改。Q2一个服务可以签发多个不同算法的 Token 吗可以。Algorithm是运行时传入的同一服务内对 RS256 与 RS512 各建一个算法对象分别签名即可验证端按 Header 中alg声明选择对应算法对象。Q3如何单独验证签名、不校验 Claim直接用算法对象验证let jd JWTDecoder(token); rsa.verify(jd)参考 test_rsa_algorithm_256_verify.cj。而JWT.require(...).verify(token)则会同时执行签名与业务 Claim 校验生产环境推荐后者。Q4jwt4cj 还支持哪些签名算法除 RSA 系外还支持 HMAC 对称签名HS256/384/512、ECDSA 椭圆曲线签名ES256/384/512以及none算法完整接口说明见 feature_api.md项目特性总览见 README.md。小结本文带你走完了 jwt4cj 的 RSA 全链路准备 PEM 公私钥文件 →Algorithm.RSA256/RSA384/RSA512RSAKeyProviderFileImpl构造算法对象 →JWT.create().sign()用私钥签发 →JWT.require().build().verify()用公钥验证。掌握这套模式后你就能在仓颉项目中安全地落地 JWT 非对称签名认证让签发方与验证方在密钥层面彻底解耦。【免费下载链接】jwt4cj一个用于生成和验证JSON Web Token的库项目地址: https://gitcode.com/Cangjie-TPC/jwt4cj创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表