ES256 使用 ECDSA 进行签名,它的安全性和运算速度目前和 RS256 差距不大,但是拥有更短的签名长度。
对于需要频繁发送的 JWT 而言,更短的长度长期下来可以节约大量流量。
因此更推荐使用 ES256 算法。
使用 OpenSSL 生成 RSA/ECC 公私钥RS256 使用 RSA 算法进行签名,可通过如下命令生成 RSA 密钥:
# 1. 生成 2048 位(不是 256 位)的 RSA 密钥 openssl genrsa -out rsa-private-key.pem 2048 # 2. 通过密钥生成公钥 openssl rsa -in rsa-private-key.pem -pubout -out rsa-public-key.pemES256 使用 ECDSA 算法进行签名,该算法使用 ECC 密钥,生成命令如下:
# 1. 生成 ec 算法的私钥,使用 prime256v1 算法,密钥长度 256 位。(强度大于 2048 位的 RSA 密钥) openssl ecparam -genkey -name prime256v1 -out ecc-private-key.pem # 2. 通过密钥生成公钥 openssl ec -in ecc-private-key.pem -pubout -out ecc-public-key.pem密钥的使用应该就不需要介绍了,各类语言都有对应 JWT 库处理这些,请自行查看文档。
如果是调试/学习 JWT,需要手动签名与验证的话,推荐使用 jwt 工具网站 - jwt.io
参考RFC 7518 - JSON Web Algorithms (JWA)
什么是 JWT -- JSON WEB TOKEN
jwt 工具网站 - jwt.io