-->

如果你能解码JWT他们如何安全吗?如果你能解码JWT他们如何安全吗?(If you can deco

2019-05-10 09:56发布

我爱智威汤逊。 这是很有趣的工作。 我的问题是这样的:如果我得到一个智威汤逊,我可以解码有效载荷,怎么是安全的? 我不能只抓令牌出了头,解码和改变有效载荷的用户信息,并用相同的正确编码的秘密发回?

我知道他们必须是安全的,但我只是真的想了解这些技术。 我在想什么? 谢谢!

Answer 1:

JWTs既可以签名,加密或两者兼而有之。 如果令牌是签名,但没有加密,每个人都可以读取令牌的内容,但是当你不知道的私钥,你不能改变它。 否则,接收器会注意到签名将不再匹配。

回答您的评论:我不知道如果我理解您的评论的正确途径。 只是可以肯定:你知道和了解数字签名? 我就简单介绍一下一个变体(HMAC,这是对称的,但也有许多其他人)。

让我们假设Alice想给一个JWT发送给Bob。 他们都知道的一些共享的秘密。 马洛里不知道的秘密,但要干涉和改变JWT。 为了防止这种情况,爱丽丝计算Hash(payload + secret) ,并追加该作为签名。

当接收到消息时,鲍勃还可以计算Hash(payload + secret)来检查签名是否匹配。 然而,如果马洛里在内容发生变化的东西,她是不是能够计算出匹配的签名(这将是Hash(newContent + secret) )。 她不知道的秘密,也没有发现它的方式。 这意味着如果她改变什么,签名将不匹配了,和Bob根本不会接受的智威汤逊了。

让我们假设,我派其他人员的消息{"id":1}并签署Hash(content + secret) 。 (+只是串联这里)。 我用的是SHA256哈希函数,我得到的签名是: 330e7b0775561c6e95797d4dd306a150046e239986f0a1373230fda0235bda8c 。 现在轮到你了:马洛里发挥的作用,并尝试对消息进行签名{"id":2} 你不能因为你不知道我用它的秘密。 如果我假设收件人知道这个秘密,他能计算任何消息的签名并检查它是否是正确的。



Answer 2:

你可以去jwt.io ,粘贴您的令牌,并读取其中的内容。 这是最初的不和谐的人很多。

简短的回答是,智威汤逊不加密关注自身。 它关心的验证。 也就是说,它总是可以得到答案了“有这个令牌操纵的内容”? 这意味着JWT令牌的用户操作是无效的,因为服务器会知道并忽略令牌。 该服务器将发出一个令牌给客户当基于有效载荷的签名。 后来它验证有效载荷和匹配的签名。

逻辑问题是,什么是不加密的内容涉及自己的动机是什么?

  1. 最简单的原因是因为它假定这是在大多数情况下一个解决的问题。 如果处理像网络浏览器,例如一个客户端,你可以在一个Cookie,是JWT令牌存储secure + httpsOnly (不能用JavaScript和阅读不能被HTTP读取),会谈到服务器的加密通道(HTTPS)。 一旦你知道你的服务器和客户端,你可以安全地交换JWT或任何其他你想之间的安全通道。

  2. 这使得事情简单。 一个简单的实施,使得采用更容易,但它也可以让每一层做自己最擅长的(让HTTPS加密处理)。

  3. 智威汤逊并不意味着存储的敏感数据。 一旦服务器接收到JWT令牌并验证它,它是免费的查找在自己的数据库中的用户ID为该用户的其他信息(如权限,邮政地址等)。 这使JWT体积小,避免了意外的信息泄露,因为大家都知道不保持敏感数据的JWT。

这不是从自己如何Cookie的工作太不一样了。 Cookie通常包含未加密的有效载荷。 如果您正在使用HTTPS,然后一切都很好。 如果你不是那么它的最好加密敏感饼干自己。 不这样做将意味着一个中间人攻击是可能的 - 代理服务器或ISP读取cookie,然后后来重放他们假装是你。 出于类似的原因,智威汤逊应始终像HTTPS安全层交换。



Answer 3:

在一个JSON网络令牌(JWT)的内容没有固有的安全性,但对于验证令牌真实性内置功能。 甲JWT是由句点分隔的三个散列。 第三是签名。 在公共/私人密钥系统,发行人签署与只能通过其对应的公钥来验证私钥令牌签名。

了解发行人与验证之间的区别是很重要的。 令牌的接收方负责验证它。

有在一个Web应用程序安全地使用JWT两个关键步骤:1)并将它们发送加密的信道,和2)立即核实在接收到它的签名。 公共密钥加密的不对称性使得智威汤逊签名验证成为可能。 公钥验证了一个智威汤逊被其匹配的私钥签名。 键的其他组合可以做到这一点的验证,从而防止假冒尝试。 按照这两个步骤,我们可以用数学确定性保证JWT的真实性。

更多阅读: 如何做一个公共密钥验证签名?



Answer 4:

只有智威汤逊的专用密钥,这是你的服务器将解密加密JWT。 这些谁知道专用密钥就能够解密加密JWT。

隐藏在安全的位置的专用密钥在您的服务器和从来没有告诉任何人的专用密钥。



Answer 5:

我会建议使用未在jwt.io呈现给解密特殊算法考虑看看到JWE

参考链接: https://www.npmjs.com/package/node-webtokens

jwt.generate('PBES2-HS512+A256KW', 'A256GCM', payload, pwd, (error, token) => {
  jwt.parse(token).verify(pwd, (error, parsedToken) => {
    // other statements
  });
});

这个答案可能是太晚了,或者你可能已经发现的出路,不过,我觉得这将是你和别人有帮助。

我创建了一个简单的例子: https://github.com/hansiemithun/jwe-example



Answer 6:

JWT里面的数据进行签名和加密,这并不意味着它是安全的。 智威汤逊并不为敏感数据提供担保。

数据使用这是众所周知的双方当事人的私人密钥加密的,即发送器和接收器,入侵者可刹车键并可能改变该内容。

就我所知的JWT不提供担保。

谢谢



文章来源: If you can decode JWT how are they secure?