使用 REST API 如何进行 JWT 令牌安全管理?

Posted

技术标签:

【中文标题】使用 REST API 如何进行 JWT 令牌安全管理?【英文标题】:How exatly works JWT token security management using REST API? 【发布时间】:2017-05-19 23:08:52 【问题描述】:

我正在研究 RESTfull API 管理,我发现有些难以理解 API KEY 概念究竟是如何处理安全性的。

所以根据我对一些教程的理解,我有以下情况:

想要使用我的 API 的用户必须注册,注册后,他会获得他的个人 API KEY(类似于一个长随机字符串)。

所以这个秘密和它的秘密一起存储在数据库中,所以在用户注册后,我会在数据库表中保存类似的内容(如果我做错了断言,请纠正我,因为我完全不确定):

+--------------------------------------------------------+
|    USER             API_KEY          API_SECRET        |
+--------------------------------------------------------+
| user1    dfdsf3dsfsdg35gsgg4fdgd      SECRET1          |
| user2    vbgggh3bfdgdf2gfdgd5vbb      SECRET2          |
| user3    gfgdfgd57bfgdfg9dgfd2vg      SECRET3          |
+--------------------------------------------------------+
USER 列包含注册用户。 API_KEY 包含获取的 api 密钥,必须插入到此用户开发的应用程序中。 API_SECRET究竟是什么?据我了解,是生成API KEY时自动生成的,还是用户在注册过程中指定的密码?这一点对我来说很模糊。究竟是什么?

现在让我们考虑客户端如何在 API 服务器上执行自动化。

它发送一个 JWT (JSON WEB TOKEN),可能类似于:XXXXX.YYYYY.ZZZZZ

它分为3个不同的部分:

1) YYYY:标题。 BASE64 编码。 CONTIEN 元数据。

类似:


    type : "JWT",
    alg : "HMAC"

它将以 base64 编码,因此生成 XXXXX 部分。

2) YYYY:PAYLOAD:包含声明,如下所示:


    exp : 2828288,              // REGISTERED
    iss: "myApiProvided.com",   // REGISTERED
    name: "Andrea"              // PUBLIC

它将以 base64 编码,因此生成 YYYYY 部分。

3) ZZZZZ: SIGNATURE 创建方式如下:

通过以下连接创建一个字符串:前一个:XXXXX + "." + YYYYY(都是base64编码)。

然后使用 SECRET 生成先前签名的散列。因此,从我基本上以这种方式了解的情况来看,我有一个加密版本的签名。对吗?

在这里,我有第二个疑问:据我了解,此散列必须由发送附加到请求的令牌的客户端生成。那么这个散列是在客户端进行的吗?如果是,则表示客户知道SECRET,但我觉得很奇怪。

具体是如何工作的?

【问题讨论】:

【参考方案1】:

JWT 的数字签名是使用发送者的私钥(SECRET)执行的。验证此签名可确保签名者的身份以及消息未被更改。

拥有有效的 JWT 是 API 中的身份验证证明。 要生成有效令牌,客户端必须拥有 SECRET。

您可以使用共享密钥的对称密钥或非对称密钥。在注册期间,客户端生成一个密钥对,私有的和公共的。公钥被发送到服务器并与客户的帐户相关联。 JWT 使用私钥签名。服务器使用公钥验证签名。

在您描述的情况下,秘密将是用户所需的密码或随机字符串。 客户端和服务器将从秘密中导出对称密钥,即。 e. HMAC,并使用它来签名和验证令牌

要使用非对称密钥,您需要在注册期间要求用户提供之前生成的公钥。这个场景有点复杂,但是避免了发送关于网络的密钥,而且服务器不需要知道秘密

【讨论】:

以上是关于使用 REST API 如何进行 JWT 令牌安全管理?的主要内容,如果未能解决你的问题,请参考以下文章

如何从外部应用程序安全地使用json web令牌,与wordpress rest api对话

JWT 似乎不是 REST API 的安全解决方案

REST API 的安全认证,从 OAuth 2.0 到 JWT 令牌

如何解码我在 Swift 中收到 REST API 的 JWT 令牌?

如何在 vue 中存储、管理 REST API JWT 身份验证令牌?

带有 okta OAUTH 令牌身份验证的 Django Rest API