【问题标题】:JWT - asymmetric encryptionJWT——非对称加密
【发布时间】:2020-02-20 06:55:35
【问题描述】:

我有三台服务器: - 授权服务器 - api服务器 - 前端服务器

授权服务器返回 JWT 自包含访问令牌(+刷新令牌)。 JWT 不存储在授权服务器中的任何位置。 我想用非对称加密来保护 JWT,但我不确定我的想法是否正确。 让我描述一下流程:

  1. 从前端服务器登录后,授权服务器获取用户凭据,然后生成 JWT 令牌并使用公钥对其进行编码。
  2. 前端服务器接收加密的 JWT 令牌,客户端(Web 浏览器)将其保存为 HTTP-Only cookie。
  3. 客户端向安全资源发送请求,因此前端根据获得的编码 JWT 令牌,请求安全数据 API 服务器。
  4. API 服务器基于安全的 JWT 和私钥解密值,并检查用户是否有足够的访问权限来执行操作。
  5. 如果 JWT 令牌过期,前端会使用刷新令牌向授权服务器发送请求以获取新的 JWT 令牌。

在这种情况下,授权服务器和 API 服务器需要存储私钥以进行解密。 这个解决方案是否足够安全?可以在两台服务器中存储相同的私钥吗? 你知道流量是否正确吗?或者也许数据流应该不同?

【问题讨论】:

  • 通常令牌的内容不是秘密,但您要保证它是由授权服务器生成的。这将指向签名而不是加密,并且只有授权服务器应该拥有签名密钥。
  • 我强烈建议您使用现有组件,而不是尝试自己在这里推出一些东西。例如。如果您在基于 .NET 的堆栈中,Identity Server 可能是一个选项。
  • 不幸的是,我无法继续使用标准方法。无论如何,如果您的身份验证服务器签署令牌,那么后端将如何验证签名?
  • 使用非对称算法进行签名时,私钥用于签名,公钥用于验证。不需要共享私钥,只有认证服务器知道私钥。
  • 那么后端服务器如何在不解密整个令牌的情况下知道用户权限是什么?

标签: jwt encryption-asymmetric


【解决方案1】:

我想用非对称加密来保护 JWT,但我不确定我的想法是否正确。

一般来说,数据加密是个好主意。尤其是在传输敏感数据时。

让我描述一下流程 […] 在这种情况下,授权服务器和 API 服务器需要存储用于解密的私钥。这个解决方案是否足够安全?可以在两台服务器中存储相同的私钥吗?你知道流量是否正确吗?或者也许数据流应该不同?

如果我正确理解您的流程,令牌在 AS(授权服务器)端加密并在 API 服务器端解密。因此,您希望阻止客户端读取其内容。

这个流程绝对没问题。 AS 和 API 服务器都将拥有共享密钥,以便它们能够加密或解密令牌。

我建议您阅读有关 JWE(加密 JWT)和相关RFC7516 的更多信息。本规范描述了加密令牌的标准方法。 根据您使用的编程语言,您可能会找到支持 JWE 的库。 https://jwt.io/ 列出了许多库,其中一些库支持的不仅仅是签名令牌 (JWS)。例如com.nimbusds/nimbus-jose-jwt (Java) 或 web-token/jwt-framework (PHP)。

可能的流程如下。 请注意,这无疑会增加您的 AS 和 API 服务器代码的复杂性。因此,在实施之前,您应该确保有必要加密您的令牌!(例如,您传输敏感数据)

  • AS 使用其私钥(例如算法 RSxxx、PSxxx 或 ESxxx)对令牌进行签名 => JWS
  • JWS 根据 RFC7516 使用非对称加密算法(例如 AxxxKW 或 AxxxGCMKW)和共享密钥 => 嵌套令牌(JWE 中的 JWS)进行加密
  • 嵌套令牌被发送到客户端
  • 客户端无法读取内容,但令牌可以照常发送到 API 服务器
  • API服务器用共享密钥解密JWE得到JWS
  • API 服务器使用 AS 公钥验证 JWS

【讨论】:

    猜你喜欢
    • 2020-08-25
    • 2015-12-30
    • 2011-04-05
    • 2019-07-29
    • 1970-01-01
    • 2010-10-30
    • 2017-02-22
    • 2011-03-01
    • 2013-04-22
    相关资源
    最近更新 更多