如何保护JWT数字签名?

时间:2016-09-27 22:54:24

标签: java android cryptography jwt digital-signature

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

现在,我们来谈谈逆向工程。如果有人能够访问客户端数据库并找出它是什么是公钥。现在,他们只需要弄清楚用于数字签名的算法服务器是什么类型,只需解密标题部分即可。

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

2 个答案:

答案 0 :(得分:3)

  

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

确实

  

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

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

  

并验证它我们在最终用户应用程序上只需要公钥。

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

  

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

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

答案 1 :(得分:-1)

Android建立在所有应用程序应该彼此独立运行的想法之上,这意味着一个Android应用程序无法进入另一个应用程序的进程。当然,如果设备是有根的,那么这是不正确的,在这种情况下,令牌的真实性。

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

编辑:查看jwt.io以获得对JWT的详细概述