Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何保护JWT数字签名?_Java_Android_Cryptography_Jwt_Digital Signature - Fatal编程技术网

Java 如何保护JWT数字签名?

Java 如何保护JWT数字签名?,java,android,cryptography,jwt,digital-signature,Java,Android,Cryptography,Jwt,Digital Signature,我想使用令牌授权系统保护托管的Rest服务。所以,我决定采用JWT流程。在阅读了以下文档之后,我对数字签名的工作原理感到困惑。好的,我们需要使用SignatureAlgorithm加密私钥。为了验证它,我们只需要在最终用户应用程序上使用公钥。我将把公钥保存在android本地数据库中 现在,让我们谈谈逆向工程。如果有人能够访问客户机数据库并找出它的公钥是什么。现在他们只需要弄清楚服务器使用什么样的算法来进行数字签名,只需解密头部分就可以了 我是不是遗漏了什么?如果没有,那么JWT的使用安全性如何

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

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


我是不是遗漏了什么?如果没有,那么JWT的使用安全性如何?

安卓的理念是所有应用程序都应该彼此独立运行,这意味着一个安卓应用程序无法进入另一个安卓应用程序的运行过程。当然,如果设备是根设备,则不存在这种情况,在这种情况下,令牌的真实性就不存在了

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

编辑:查看以获得JWTs的良好概述

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

的确如此

好的,我们需要使用SignatureAlgorithm加密私钥

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

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

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

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


没有,因为您没有加密标题部分。你加密了一个HMAC。

这不取决于我
JWT
使用
base64
对标头和有效负载部分进行加密,在获得JWT的
security
部分之前,任何人都不能篡改它。我的问题是如何确保
JWT
中的
security
部分的安全性,因为签名的编码和解码依赖于私钥和公钥。任何人都可以解码、读取有效负载或报头,并用修改后的base64编码数据替换,但在验证它时会失败。查看关于JWT的提示以及根据RFC标准由谁签署。是的!我们在同一页上,但要在客户端解密,我们需要公钥(生成签名时使用的一对私钥)。为此,我们需要将此公钥存储在客户端的某个位置。现在,我反编译了这个应用程序,找出了什么是公钥。有人不容易破坏安全性吗?这就是为什么它被称为公钥。任何拥有公钥的人都可以对私钥签名的任何内容进行解密(pub和priv key在数学上是链接的)。我想说的是,Android隔离了所有应用程序,这意味着没有任何应用程序(除了你的应用程序)能够看到公钥(只要你正确存储它),除非你的手机被盗,你的应用程序被反编译,或者手机是根目录。那么你是说JWT是不安全的?因为我反编译了应用程序,现在我有了公钥和算法。但在验证签名数据时,我们需要提供公钥。对吗?接着是这个:
https://github.com/jwtk/jjwt
用于逆向工程。假设
xxxx.yyy.zzz
是我的
JWT
字符串,由
分隔。如果我在字符串的第一部分应用Base64解码器,那么它将为我提供一个使用过的
算法
。现在,如果我知道公钥,我就不能算出我的
密钥吗?@AmitPal当然不能。否则,整个公钥/私钥系统将毫无意义。