业务背景:
项目在解决临时权限的问题,欲引入JWT,故评估对比JWT实现方式之一JWS(RFC文档)的相关签名算法(由JWA规定),指导签名算法选择。
测试代码:
性能测试:
测试环境:
操作系统:Mac OS
内存:8GB
CPU core: 2
本地测试只做性能纵向对比,具体耗时取决于具体运行环境
测试结果:
算法 | 循环次数 | 总耗时(ms) | 平均耗时(ms) |
---|---|---|---|
对称 | |||
HS256 | 10000 | 2142 | 0.21 |
HS384 | 10000 | 2492 | 0.24 |
HS512 | 10000 | 2153 | 0.21 |
HS256 | 100000 | 5964 | 0.059 |
HS384 | 100000 | 5368 | 0.053 |
HS512 | 100000 | 5210 | 0.052 |
非对称 RSA | |||
RS256 | 10000 | 30342 | 3.03 |
RS384 | 10000 | 88314 | 8.83 |
RS512 | 10000 | 196748 | 19.67 |
RS256 | 100000 | 285911 | 2.85 |
RS384 | 100000 | 858241 | 8.58 |
RS512 | 100000 | 1861344 | 18.61 |
非对称 ECDSA | |||
ES256 | 10000 | 32375 | 3.23 |
ES384 | 10000 | 64646 | 6.46 |
ES512 | 10000 | 86273 | 8.62 |
ES256 | 100000 | 285097 | 2.85 |
ES384 | 100000 | 667266 | 6.67 |
ES512 | 100000 | 764695 | 7.64 |
测试结论:
- 对称加密性能由于非对称加密
- RS256 RS284 RS512 签名验签时间依次递增,强度依次增大,ES256 ES384 ES512 同理
- ES系列算法 加密时间要小于 RS系列算法
长度测试:
测试数据有效长度:
61个字符串
测试结果:
算法 | header+body长度 | 总长度 | 签名长度 |
---|---|---|---|
HS256 | 193 | 236 | 43 |
RS256 | 193 | 535 | 342 |
ES256 | 193 | 279 | 86 |
header+body长度不变,因为都是base64编码;相同的签名算法,无论加密多大的数据的签名长度都是一致的。
测试结论:
- 对称加密签名长度要小于非对称加密签名长度
- RS系列算法签名长度要远大于ES系列签名算法
最终选择:
ES256