2017-06-16 33 views
1

Spring的默认OAuth JWT流(使用client_credentials许可)如下:为什么Spring的默认OAuth JWT实现将JWT验证程序公开?

  1. 启动的认证服务器(AS)
  2. 启动资源服务器(RS)
    • 启动时,RS请求tokenKey通过使用基本认证
  3. 的AS返回使用RS256(SHA256withRSA)
  4. 公钥调用
  5. 一段时间后,客户端通过使用client_credentials授予
  6. 的AS返回包含一个JWS signature
  7. 所述客户端的JWT accessToken发送JWT作为承载的令牌至RS
  8. 的RS使用主叫GET /oauth/token请求一个的accessToken它在启动时从AS接收到的tokenKey,以验证JWT accessToken来自AS。这是我困惑的地方...

这种事情安全吗?为什么要使用公共证书而不是共享密钥?黑客不能轻易获得公钥并签署他们自己有效的JWT访问令牌吗?公钥证书和JWT签名的使用如何协同工作以验证发件人实际上是Auth服务器而不是攻击者?

任何见解都会有帮助。

回答

0

一些研究公共密钥加密和数字签名的性质拾荒者这样的:

数字签名实现非对称加密。数字签名使接收方有理由相信该消息是由声明的发件人发送的。类似于手写签名,他们很难伪造。签名者(在本例中为AS)保留其私钥并使用私钥创建签名。一些不可否认计划为数字签名提供时间戳,因此即使私钥暴露,签名也是有效的。

数字签名方案通常由3种算法

1)key generation algorithm,在随机从一组可能的私有密钥的均匀选择一个私钥。该算法输出私钥和相应的公钥。

2)创建使用消息和私钥

3)的签名的signing algorithmsignature verifying algorithm,鉴于信息,公钥和签名,接受或拒绝该消息的权利要求来真实性。

在这种情况下(RS256),使用SHA256withRSA创建签名,该签名不用作加密算法,而是用于验证数据的来源或真实性。签名是使用私钥生成的。公钥被传递给资源服务器以用于验证签名。在这种情况下,即使攻击者拥有公钥,他们也不能通过签名创建欺骗消息或更改内容。