JWT 数字签名是如何保护的?

How JWT digital signature is secured?

我想使用令牌授权系统保护托管的 Rest 服务。所以,我决定采用 JWT 流程。在阅读了以下文档之后,我对数字签名的工作原理感到困惑。据我所知,我们需要使用 SignatureAlgorithm 来加密私钥。为了验证它,我们只需要在我们的最终用户应用程序上输入 public 键。我会将 public 密钥保存在 android 本地数据库中。

现在,我们来谈谈逆向工程。如果有人能够访问客户端数据库并找出 public 键是什么。现在他们只需要弄清楚服务器使用什么样的算法进行数字签名就可以了,只需解密 header 部分即可。

我是不是漏掉了什么?如果否,那么 JWT 如何安全使用?

Android 的理念是所有应用程序都应该 运行 相互独立,这意味着一个 android 应用程序不能进入另一个应用程序的进程。当然,如果设备已获得 root 权限,则情况并非如此,在这种情况下,令牌的真实性。

此外,您不需要解密 JWT,因为负载仅采用 base64 编码。知道如何进行 base64 解码的任何人都能够看到您发送的 header 和有效载荷。这就是为什么您不在有效载荷中放入任何个人信息(电子邮件地址、密码、信用卡号)的原因。如果您确实想在有效负载中包含个人信息,请查看 JWE;它加密有效负载以提供安全性。回到正题:如果body被篡改,签名就会失败。关于非对称加密数学如何更适合 SE 数学站点的更多问题。

编辑:查看 jwt.io 以获得 JWT 的良好概述

I got confused how digital signature works.

确实。

AFAIK we need to encrypt the private key using SignatureAlgorithm.

没有。您需要加密数据,并用私钥加密。通常你加密的是数据的一个HMAC,用来保存space.

and to verify it we only need public key on our end user application.

正确。但是您正在验证的是该数据是使用该私钥签名的。

Now, Let's talk about reverse engineering. If someone is able to access the client database and figure it out what is the public key. Now they just need to figure out what kind of algorithm server are using for digital signature and it's very simple to do it by just decrypting the header section.

不,因为您没有加密 header 部分。您加密了一个 HMAC。