为什么Spring的默认OAuth JWT实现将JWT验证程序公开?
问题描述:
Spring的默认OAuth JWT流(使用client_credentials许可)如下:为什么Spring的默认OAuth JWT实现将JWT验证程序公开?
- 启动的认证服务器(AS)
- 启动资源服务器(RS)
- 启动时,RS请求tokenKey通过使用基本认证
- 的AS返回使用RS256(SHA256withRSA) 公钥调用
- 一段时间后,客户端通过使用client_credentials授予
- 的AS返回包含一个JWS signature
- 所述客户端的JWT accessToken发送JWT作为承载的令牌至RS
- 的RS使用主叫
GET /oauth/token
请求一个的accessToken它在启动时从AS接收到的tokenKey,以验证JWT accessToken来自AS。这是我困惑的地方...
这种事情安全吗?为什么要使用公共证书而不是共享密钥?黑客不能轻易获得公钥并签署他们自己有效的JWT访问令牌吗?公钥证书和JWT签名的使用如何协同工作以验证发件人实际上是Auth服务器而不是攻击者?
任何见解都会有帮助。
答
一些研究公共密钥加密和数字签名的性质拾荒者这样的:
数字签名实现非对称加密。数字签名使接收方有理由相信该消息是由声明的发件人发送的。类似于手写签名,他们很难伪造。签名者(在本例中为AS)保留其私钥并使用私钥创建签名。一些不可否认计划为数字签名提供时间戳,因此即使私钥暴露,签名也是有效的。
数字签名方案通常由3种算法
1)key generation algorithm
,在随机从一组可能的私有密钥的均匀选择一个私钥。该算法输出私钥和相应的公钥。
2)创建使用消息和私钥
3)的签名的signing algorithm
甲signature verifying algorithm
,鉴于信息,公钥和签名,接受或拒绝该消息的权利要求来真实性。
在这种情况下(RS256),使用SHA256withRSA创建签名,该签名不用作加密算法,而是用于验证数据的来源或真实性。签名是使用私钥生成的。公钥被传递给资源服务器以用于验证签名。在这种情况下,即使攻击者拥有公钥,他们也不能通过签名创建欺骗消息或更改内容。