security - JWT 如何确保其值(value)观?

标签 security jwt azure-ad-b2c

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

假设身份验证服务器“A”将签名的 token 发送到应用程序服务器。如果我没记错的话签名是由服务器“A”上的私钥完成的。现在应用程序服务器可以解密 token 并使用公钥验证信息。我还读到 JWT 是独立的,它同时保存数据和签名。

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

我的疑问是,如果 JWT 是自包含的,为什么不能在两者之间更改数据。

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

header.user1email.signature

如果黑客将数据替换为

header.user2email.signature

用的是自己的私钥,怎么可能是有效数据呢?如何确定它来自服务器“A”?

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

最佳答案

JWT token 由三个对象构造,并通过基于 SHA256 哈希的消息身份验证代码(又名 HMACSHA256 )按以下方式传递:

HEADER - 包含 token 的算法和类型(通常为 JWT)

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

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

{
  "name": "John Doe"
}

最后,你的 secret 变成了这样的东西(从 jwt.io 中提取)

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJuYW1lIjoiSm9obiBEb2UifQ.
xuEv8qrfXu424LZk8bVgr9MQJUIrp1rHcPyZw_KSsds

最酷的是,现在,您的应用程序不需要每次需要信息时都与其后端数据库进行交互,而是可以从 JWT token 中提取信息。一旦 secret 或有效负载以任何方式被篡改,签名就会失效。

这是因为 token 通常经过签名和加密,需要您拥有私钥 (SECRET) 才能实际对其进行解码。

编辑:经过SO侦察后,我发现了一个可爱的example由米施提供。我鼓励您阅读它!

关于security - JWT 如何确保其值(value)观?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35150542/

相关文章:

node.js - jhipster/spring boot - 尝试代理请求时发生错误

php - Laravel:如何保护资源不被其他用户访问?

php - 了解 JWT 和 HTTP 授权 header ? (客户端 : Angular, 服务器:php)

authentication - 在 JWT 中更新/更改角色声明(或任何其他声明)

azure-ad-b2c - 混合身份验证方案 - Azure AD B2C 和 Azure AD

angular - 我们可以在 angular 7 的 index.html 中添加 <div id ="api"></div> 吗?

ISP 的 Javascript 注入(inject)

linux - 未设置已创建文件的 SMACK 标签

c# - 在服务总线后面验证过期的 JWT token

azure - B2C 注册页面中的自定义属性