带RS256的JWT是否安全?

时间:2016-02-02 10:13:59

标签: security jwt azure-ad-b2c

我知道JWT是安全的。但只是想知道一些我无法理解的概念。

假设认证服务器“A”将签名的令牌发送到应用服务器。如果我没错,则通过服务器“A”上的私钥完成签名。现在,App服务器可以使用公钥解密令牌并验证信息。我还读过JWT是自包含的,它同时包含数据和签名。

我看到的一些示例在验证时不使用任何安全密钥。如果我没有错,RS256不需要任何特定密钥,我认为它将使用公共证书进行解密。

我的查询是,如果JWT是自包含的,为什么数据之间无法改变。

例如假设服务器“A”发送以下信息

header.user1email.signature

如果黑客将数据替换为

header.user2email.signature

使用他自己的私钥,怎么可能是有效的数据?怎么可以肯定它来自服务器“A”?

我理解这里缺少一些基础知识,请帮忙吗?

2 个答案:

答案 0 :(得分:2)

JWT令牌由三个对象构成,并通过以下方式传递SHA256基于哈希的消息身份验证代码(A.K.A HMACSHA256):

HEADER - 包含令牌的算法和类型(通常为JWT

{
    "alg": "HS256",
    "typ": "JWT" 
}

PAYLOAD - 传递的实际数据是无状态/自包含部分

{
  "name": "John Doe"
}

最后,你的SECRET成了这样的东西(从jwt.io拉出来)

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJuYW1lIjoiSm9obiBEb2UifQ.
xuEv8qrfXu424LZk8bVgr9MQJUIrp1rHcPyZw_KSsds

很酷的是,现在,您的应用程序无需在每次需要信息时都与其后端数据库进行交互,而是可以将其从JWT令牌中拉出来。一旦秘密或有效负载被篡改,签名就会失效。

这是因为令牌正常的签名和加密方式要求您拥有私钥(SECRET)以便实际解码它。

编辑:经过SO的侦察后,我遇到了Misch提供的一个可爱的example。我鼓励你阅读它!

答案 1 :(得分:0)

在您的情况下,服务器A使用自己的私钥对消息签名,并生成签名。

假设服务器B收到了整个jwt,它将从服务器 A 获取公用密钥,并使用该公用密钥来检查此jwt的消息部分是否与签名部分匹配。

如果jwt的消息部分被黑客更改,则它与签名不匹配。甚至黑客用自己的私钥生成了一个新的签名,来自A的公钥也不会验证该消息签名对。