使用 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对话
REST API 的安全认证,从 OAuth 2.0 到 JWT 令牌
如何解码我在 Swift 中收到 REST API 的 JWT 令牌?