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 数字签名如何保护?的主要内容,如果未能解决你的问题,请参考以下文章