基于 ECDSA(椭圆曲线数字签名算法)生成 JWT Token

张开发
2026/4/11 7:30:24 15 分钟阅读

分享文章

基于 ECDSA(椭圆曲线数字签名算法)生成 JWT Token
文章目录1. 为什么选择 ECDSA椭圆曲线数字签名算法2. 生成签名公私钥2.1. 使用 Open SSL 生成公私钥2.2. Java 语言 pkcs8 格式私钥转换3. SpringBoot 分环境配置密钥3.1. yaml 文件配置3.2. 密钥配置类4. 使用 auth0 生成 JWT Token4.1. 依赖4.2. 生成 Token5. 注意事项1. 为什么选择 ECDSA椭圆曲线数字签名算法JWT Token 提供的签名算法有对称和非对称两种。通常在业务网关或微服务间的零信任场景下的 Token 验证验证 Token 签名的密钥管理是主要问题。如果有其他方案能够提升对称加密密钥安全与验证签名性能则可不考虑使用非对成加密算法进行签名。使用 ECDSA 有以下优势非对称加密算法相较于对称加密算法密钥管理安全度更高ECDSA 相较于 RSA 相同的安全级别使用的密钥更短相反使用较长的密钥 ECDSA 的安全度更高ECDSA 相较于 RSA 所需计算资源更少2. 生成签名公私钥2.1. 使用 Open SSL 生成公私钥openssl ecparam-genkey-namesecp521r1-out./crt/access-token-ec-private-key.pem openssl ec-in./crt/access-token-ec-private-key.pem-pubout-out./crt/access-token-ec-public-key.pem2.2. Java 语言 pkcs8 格式私钥转换openssl pkcs8-topk8-informpem-in./crt/access-token-ec-private-key.pem-outformpem-nocrypt-out./crt/access-token-ec-private-key-pkcs8.pem3. SpringBoot 分环境配置密钥3.1. yaml 文件配置token:access:publicKey:粘贴公钥privateKey:粘贴私钥3.2. 密钥配置类ConfigurationpublicclassJWTSecretConfigure{privatestaticfinalStringALGORITHMEC;Value(${token.access.privateKey})privateStringaccessTokenECPrivateKey;Value(${token.access.publicKey})privateStringaccessTokenECPublicKey;Bean(AccessTokenECPrivateKey)publicECPrivateKeycreateAccessTokenECPrivateKey()throwsNoSuchAlgorithmException,InvalidKeySpecException{KeyFactorykfKeyFactory.getInstance(ALGORITHM);EncodedKeySpeckeySpecnewPKCS8EncodedKeySpec(Base64.decode(accessTokenECPrivateKey));return(ECPrivateKey)kf.generatePrivate(keySpec);}Bean(AccessTokenECPublicKey)publicECPublicKeycreateAccessTokenECPublicKey()throwsNoSuchAlgorithmException,InvalidKeySpecException{KeyFactorykfKeyFactory.getInstance(ALGORITHM);EncodedKeySpeckeySpecnewX509EncodedKeySpec(Base64.decode(accessTokenECPublicKey));return(ECPublicKey)kf.generatePublic(keySpec);}}4. 使用 auth0 生成 JWT Token4.1. 依赖propertiesauth0-jwt.version3.6.0/auth0-jwt.version/propertiesdependenciesdependencygroupIdcom.auth0/groupIdartifactIdjava-jwt/artifactIdversion${auth0-jwt.version}/version/dependency/dependencies4.2. 生成 Token// 注入密钥Resource(nameAccessTokenECPrivateKey)privateECPrivateKeyaccessTokenECPrivateKey;Resource(nameAccessTokenECPublicKey)privateECPublicKeyaccessTokenECPublicKey;// 生成 TokenAlgorithmalgorithmAlgorithm.ECDSA512(accessTokenECPublicKey,accessTokenECPrivateKey);StringaccessTokenJWT.create().withExpiresAt(newDate(System.currentTimeMillis()EXPIRES)).withIssuedAt(newDate()).withIssuer(ISSUER).sign(algorithm);5. 注意事项在要求性能场景下需要做好基准测试评估使用 ECDSA 签名算法签发 Token 的性能是否符合要求。非对称加密算法相对于对称加密算法管理密钥安全性有提升但请注意私钥仅在签发 Token 的服务中使用且定期更换。基于配置文件的密钥管理请确保配置文件网络传输加密且配置有白名单或其他访问配置文件的认证方式。

更多文章