JWT 数字签名如何保护?

Posted

技术标签:

【中文标题】JWT 数字签名如何保护?【英文标题】:How JWT digital signature is secured? 【发布时间】:2017-02-05 17:29:34 【问题描述】:

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

现在,让我们谈谈逆向工程。如果有人能够访问客户端数据库并找出公钥是什么。现在他们只需要弄清楚数字签名使用哪种算法服务器,只需解密标题部分就可以很简单。

我在这里遗漏了什么吗?如果否,那么 JWT 如何安全使用?

【问题讨论】:

【参考方案1】:

我对数字签名的工作原理感到困惑。

确实。

AFAIK 我们需要使用 SignatureAlgorithm 加密私钥。

没有。您需要加密数据,并使用私钥对其进行加密。通常你加密的是数据的 HMAC,以节省空间。

为了验证它,我们只需要最终用户应用程序上的公钥。

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

现在,让我们谈谈逆向工程。如果有人能够访问客户端数据库并找出公钥是什么。现在他们只需要弄清楚数字签名使用什么样的算法服务器,只需解密标题部分就可以做到这一点。

不,因为您没有加密标题部分。您加密了 HMAC。

【讨论】:

知道了。但是在验证签名数据时,我们需要提供公钥。正确的?关注了这个:https://github.com/jwtk/jjwt 用于逆向工程。假设xxxx.yyy.zzz 是我的JWT 字符串,由. 分隔。如果我在字符串的第一部分应用 base 64 解码器,那么它将给我一个使用过的algorithm。现在,如果我知道公钥,我不能找出我的secret key吗? @AmitPal 当然不是。否则整个公钥/私钥系统将毫无意义。【参考方案2】:

Android 的构建理念是所有应用都应相互独立运行,这意味着一个 Android 应用无法进入另一个应用的进程。当然,如果设备已植根,则这不是真的,在这种情况下令牌的真实性。

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

编辑:查看jwt.io 以获得对 JWT 的全面了解

【讨论】:

这不取决于我。 JWT 对标头和有效负载部分使用 base64 加密,在拥有 JWT 的 security 部分之前,没有人可以篡改它。我的问题是如何使JWT 中的security 部分安全,因为签名的编码和解码取决于私钥和公钥。 任何人都可以解码、读取用修改过的 base64 编码数据替换有效负载或标头,但是当您验证它时会失败。查看jwt.io/introduction 以获取有关 JWT 的提示以及根据 RFC 标准签署它的人。 是的!我们在同一页面上,但要在客户端解密,我们需要公钥(生成签名时使用的一对私钥)。为此,我们需要将此公钥存储在客户端的某个位置。现在,我反编译了应用程序并弄清楚什么是公钥。有人破解安全不容易吗? 这就是为什么它被称为公钥。任何拥有公钥的人都可以解密由私钥签名的任何内容(pub 和 priv 密钥在数学上是相关联的)。我的意思是Android隔离了所有应用程序,这意味着没有应用程序(除了您的应用程序)将能够看到公钥(只要您正确存储它),除非您的手机被盗并且您的应用程序被反编译或手机已扎根。 那么你是说 JWT 不安全?因为我反编译了应用程序,现在我也有了公钥和算法

以上是关于JWT 数字签名如何保护?的主要内容,如果未能解决你的问题,请参考以下文章

JWT 令牌是如何认证的?

如何签署 JWT?

Jwt介绍

Jwt介绍

如何加密 JWT 安全令牌?

不允许使用 JWT 令牌保护 GraphQL 端点