JWT 如何确保其价值?
How does JWT secure it's values?
我了解 JWT 是安全的。但就是想知道一些我看不懂的概念。
假设身份验证服务器"A" 将签名令牌发送到应用程序服务器。如果我没记错的话签名是由服务器 "A" 上的私钥完成的。现在应用服务器可以解密令牌并使用 Public 密钥验证信息。我还读到 JWT 是独立的,它包含数据和签名。
我看到的一些例子在验证时没有使用任何安全密钥。如果我没记错的话,RS256 不需要任何特定的密钥,我假设它将使用 public 证书来解密。
我的疑问是,如果 JWT 是自包含的,为什么不能在两者之间更改数据。
例如假设服务器 "A" 发送以下信息
header.user1email.signature
如果黑客将数据替换为
header.user2email.signature
用自己的私钥,怎么会是有效数据?如何确定它来自服务器 "A"?
我知道我缺少一些基础知识,请帮忙?
JWT
令牌由三个对象构造,并通过以下方式通过基于 SHA256 哈希的消息身份验证代码 (A.K.A HMACSHA256):
HEADER
- 包含令牌的算法和类型(通常为 JWT
)
{
"alg": "HS256",
"typ": "JWT"
}
PAYLOAD
- 实际传递的数据,即stateless/self-containing部分
{
"name": "John Doe"
}
最后,你的 SECRET
变成这样的东西(从 jwt.io 中提取)
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJuYW1lIjoiSm9obiBEb2UifQ.
xuEv8qrfXu424LZk8bVgr9MQJUIrp1rHcPyZw_KSsds
很酷的是,现在您的应用程序不需要在每次需要信息时都与其后端数据库进行交互,而是可以将信息从 JWT
令牌中提取出来。一旦秘密或有效载荷以任何方式被篡改,签名就会失效。
这是因为令牌 通常 以需要您拥有私钥 (SECRET
) 才能实际解码的方式进行签名和加密它。
编辑:通过 SO 搜索后,我发现了 Misch 提供的一个可爱的 example。我鼓励您阅读它!
在您的情况下,服务器 A 使用自己的私钥对消息进行签名,并生成签名。
假设服务器 B 接收到整个 jwt,它将从服务器 A 获取 public 密钥,并使用此 public 密钥检查是否此 jwt 的消息部分与签名部分匹配。
如果 jwt 的消息部分被黑客更改,它将与签名不匹配。或者即使黑客用自己的私钥生成了新的签名,A的public密钥也不会验证这个message-signature对
我了解 JWT 是安全的。但就是想知道一些我看不懂的概念。
假设身份验证服务器"A" 将签名令牌发送到应用程序服务器。如果我没记错的话签名是由服务器 "A" 上的私钥完成的。现在应用服务器可以解密令牌并使用 Public 密钥验证信息。我还读到 JWT 是独立的,它包含数据和签名。
我看到的一些例子在验证时没有使用任何安全密钥。如果我没记错的话,RS256 不需要任何特定的密钥,我假设它将使用 public 证书来解密。
我的疑问是,如果 JWT 是自包含的,为什么不能在两者之间更改数据。
例如假设服务器 "A" 发送以下信息
header.user1email.signature
如果黑客将数据替换为
header.user2email.signature
用自己的私钥,怎么会是有效数据?如何确定它来自服务器 "A"?
我知道我缺少一些基础知识,请帮忙?
JWT
令牌由三个对象构造,并通过以下方式通过基于 SHA256 哈希的消息身份验证代码 (A.K.A HMACSHA256):
HEADER
- 包含令牌的算法和类型(通常为 JWT
)
{
"alg": "HS256",
"typ": "JWT"
}
PAYLOAD
- 实际传递的数据,即stateless/self-containing部分
{
"name": "John Doe"
}
最后,你的 SECRET
变成这样的东西(从 jwt.io 中提取)
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJuYW1lIjoiSm9obiBEb2UifQ.
xuEv8qrfXu424LZk8bVgr9MQJUIrp1rHcPyZw_KSsds
很酷的是,现在您的应用程序不需要在每次需要信息时都与其后端数据库进行交互,而是可以将信息从 JWT
令牌中提取出来。一旦秘密或有效载荷以任何方式被篡改,签名就会失效。
这是因为令牌 通常 以需要您拥有私钥 (SECRET
) 才能实际解码的方式进行签名和加密它。
编辑:通过 SO 搜索后,我发现了 Misch 提供的一个可爱的 example。我鼓励您阅读它!
在您的情况下,服务器 A 使用自己的私钥对消息进行签名,并生成签名。
假设服务器 B 接收到整个 jwt,它将从服务器 A 获取 public 密钥,并使用此 public 密钥检查是否此 jwt 的消息部分与签名部分匹配。
如果 jwt 的消息部分被黑客更改,它将与签名不匹配。或者即使黑客用自己的私钥生成了新的签名,A的public密钥也不会验证这个message-signature对