如果你能解码智威汤逊他们如何安全?
我喜欢智威汤逊,和他合作非常有趣。 我的问题是,如果我得到一个智威汤逊,我可以解码有效载荷,这是如何安全? 难道我不能将标记从标题中取出,解码并更改有效载荷中的用户信息,并使用相同的正确密码进行发送?
我知道他们一定是,我真的很想了解这些技术。 我错过了什么? 谢谢!
智威汤逊可以是签名,encryption或两者兼而有之。 如果一个令牌被签名但没有encryption,每个人都可以读取令牌的内容,但是当你不知道私钥时,你不能改变它。 否则,接收者会注意到签名不再匹配。
回答你的评论:我不确定我是否理解你的评论是正确的。 只要确定:你知道并理解数字签名? 我将简单地解释一个变体(HMAC,它是对称的,但还有很多其他变体)。
让我们假设爱丽丝想要发送一个智威汤逊给鲍勃。 他们都知道一些共同的秘密。 马洛里不知道这个秘密,但是想干预和改变智威汤逊。 为了防止这种情况,Alice计算散列(有效载荷+秘密)并将其附加为签名。 当收到消息时,Bob也可以计算Hash(payload + secret)来检查签名是否匹配。 然而,如果Mallory改变内容中的某些东西,她不能计算匹配签名(这将是哈希(newContent + secret))。 她不知道这个秘密,也无法find答案。 这意味着,如果她改变了一些东西,签名就不会再匹配了,Bob就不会再接受JWT了。
假设我向另一个人发送消息{"id":1}
并用Hash(content + secret)
签名。 (这里只是串联)。 我使用SHA256散列函数,我得到的签名是: 330e7b0775561c6e95797d4dd306a150046e239986f0a1373230fda0235bda8c
。 现在轮到你了:扮演马洛里的angular色,并尝试签署消息{"id":2}
。 你不能因为你不知道我使用了哪个秘密。 如果我想接收者知道这个秘密,他可以计算任何消息的签名并检查它是否正确。
你可以去jwt.io
,粘贴你的令牌并阅读内容。 最初,这对很多人来说都是一个问题。
简单的答案是JWT不关心encryption。 它关心validation。 也就是说,它总能得到“有这个令牌的内容被操纵”的答案吗? 这意味着用户对JWT令牌的操作是徒劳的,因为服务器将知道并忽略该令牌。 服务器在向客户端发送令牌时,根据有效负载添加签名。 稍后validation有效载荷和匹配签名。
合乎逻辑的问题是不关心encryption内容的动机是什么?
-
最简单的原因是因为它认为这是大多数情况下解决的问题。 如果处理像Web浏览器这样的客户端,您可以将JWT令牌存储在
secure + httpsOnly
的cookie中(secure + httpsOnly
+不可用Javascript +不能被HTTP读取),并通过encryption频道(HTTPS)。 一旦你知道你有一个服务器和客户端之间的安全通道,你可以安全地交换JWT或任何你想要的。 -
这使事情变得简单。 一个简单的实现使得采用更容易,但是它也可以让每个层都做到最好(让HTTPS处理encryption)。
-
JWT并不意味着存储敏感数据。 一旦服务器收到JWT令牌并对其进行validation,就可以自由地在自己的数据库中查找该用户的其他信息(如权限,邮寄地址等)。 这使得JWT体积小巧,避免了无意的信息泄漏,因为每个人都知道JWT中不会保留敏感数据。
这与cookies本身的工作方式并无太大区别。 Cookie通常包含未encryption的有效载荷。 如果您使用的是HTTPS,那么一切都很好。 如果你不是,那么build议自己encryption敏感的cookie。 不这样做意味着中间人攻击是可能的 – 代理服务器或ISP读取cookie,然后在假装成为你的时候重播它们。 出于类似的原因,JWT应该总是通过像HTTPS这样的安全层进行交换。
JSON Web令牌(JWT)中的内容本质上并不安全,但有一个用于validation令牌真实性的内置function。 一个JWT是三个由时段分隔的哈希。 三是签名。 在公钥/私钥系统中,签发者使用私钥对签名签名进行签名,私钥只能通过相应的公钥进行validation。
了解发行者和validation者之间的区别很重要。 令牌的接收者负责validation它。
在Web应用程序中安全使用JWT有两个关键步骤:1)通过encryption通道发送它们; 2)在收到它之后立即validation签名。 公钥密码学的不对称性使JWT签名validation成为可能。 公钥validationJWT是由其匹配的私钥签名的。 没有其他密钥组合可以做这个validation,从而防止模仿企图。 遵循这两个步骤,我们可以用math确定性来保证智威汤逊的真实性。
更多阅读: 公钥是如何validation签名的?
只有服务器上的JWT的privateKey才能解密encryption的JWT。 那些知道privateKey的人将能够解密encryption的JWT。
将privateKey隐藏在服务器的安全位置,不要告诉任何人privateKey。