How select a best jwt cryptographic algorithm

Introduction

The common data security concerns:

  • Integrity: That data has not been tampered with
  • Authenticity: That the origin of the data can be verified
  • Non-repudiation: The origin of the data must be verifiable by others
  • Confidentiality: That data is kept secret from unauthorised parties and processes

Digital signatures

Key Type

  • RSA
  • EC
  • OKP

Algorithms

  • RSA signature with PKCS #1 and SHA-2: RS256 RS384 RS512
  • RSA PSS signature with SHA-2: PS256
  • EC DSA signature with SHA-2:
  • Edwards-curve DSA signature with SHA-2:

RSA、DSA、ECDSA 三者的区别

EdDSA与ECDSA 的区别

ECDSA签名算法的安全性是比较依赖于安全的随机数生成算法的,如果随机数算法存在问题,使用了相同的k进行签名,那么攻击者是可以根据签名信息恢复私钥的,历史上也出过几次这样的事故,比如10年索尼的PS3私钥遭破解以及12年受Java某随机数生成库的影响造成的比特币被盗事件。所以说ECDSA签名在设计上还是存在一些问题的, 这也激励了新的EdDSA算法的出现。

EdDSA签名算法由Schnorr签名发展变化而来,可以在RFC8032中看到它的定义实现,由曲线和参数的选择不同又可以划分为Ed25519和Ed448算法,顾命思义,它们两分别是基于curve25519和curve448曲线,一般用的比较多的是Ed25519算法,相比Ed448而言运算速度要更快,秘钥与签名空间也较小,二者的使用场景还是有点区别。

Ed25519所使用的曲线由curve25519变换而来,curve25519是蒙哥马利曲线,经过变换得到Ed25519使用的扭爱德华曲线edwards25519,curve25519曲线的安全性是非常高的。

EdDSA的运算速度也比ECDSA算法要快很多,优势可以说是非常明显的,门罗币和zcash等加密货币已经将算法切换到了EdDSA了,目前其也被确认为下一代椭圆曲线算法。


Reference

https://connect2id.com/products/nimbus-jose-jwt/algorithm-selection-guide
https://security.stackexchange.com/questions/194830/recommended-asymmetric-algorithms-for-jwt
数字签名算法介绍和区别: https://zhuanlan.zhihu.com/p/33195438
算法性能测试: https://zhuanlan.zhihu.com/p/27615345
针对EdDSA的fault attack: https://www.anquanke.com/post/id/167018
ECDSA Digital Signature Verification in Java: https://metamug.com/article/sign-verify-digital-signature-ecdsa-java.html
Google Implementation Libary: https://github.com/google/tink