我知道JWT是安全的。但只是想知道一些我无法理解的概念。
假设认证服务器“A”将签名的令牌发送到应用服务器。如果我没错,则通过服务器“A”上的私钥完成签名。现在,App服务器可以使用公钥解密令牌并验证信息。我还读过JWT是自包含的,它同时包含数据和签名。
我看到的一些示例在验证时不使用任何安全密钥。如果我没有错,RS256不需要任何特定密钥,我认为它将使用公共证书进行解密。
我的查询是,如果JWT是自包含的,为什么数据之间无法改变。
例如假设服务器“A”发送以下信息
header.user1email.signature
如果黑客将数据替换为
header.user2email.signature
使用他自己的私钥,怎么可能是有效的数据?怎么可以肯定它来自服务器“A”?
我理解这里缺少一些基础知识,请帮忙吗?
答案 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
)以便实际解码它。
答案 1 :(得分:0)
在您的情况下,服务器A使用自己的私钥对消息签名,并生成签名。
假设服务器B收到了整个jwt,它将从服务器 A 获取公用密钥,并使用该公用密钥来检查此jwt的消息部分是否与签名部分匹配。
如果jwt的消息部分被黑客更改,则它与签名不匹配。甚至黑客用自己的私钥生成了一个新的签名,来自A的公钥也不会验证该消息签名对。