base64 - 为什么 JWT 签名对于特定负载来说不是唯一的

标签 base64 digital-signature jwt hmac

我的应用程序正在使用 JWT,应该可以防止重放攻击。我正在对此进行测试并遇到以下情况。

当我拥有有效的 JWT 并更改 token /签名的最后一个字符时,JWT 仍然有效。例如。以下 token 均已正确验证: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJTb21lIFRlc3QiLCJjbGFpbSI6IlNvbWUgQ2xhaW0ifQ.UkFYSK7hSSeiqUOSMdbXgbOErMFnuK0Emk1722ny-r4 eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJTb21lIFRlc3QiLCJjbGFpbSI6IlNvbWUgQ2xhaW0ifQ.UkFYSK7hSSeiqUOSMdbXgbOErMFnuK0Emk1722ny-r5 eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJTb21lIFRlc3QiLCJjbGFpbSI6IlNvbWUgQ2xhaW0ifQ.UkFYSK7hSSeiqUOSMdbXgbOErMFnuK0Emk1722ny-r6 eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJTb21lIFRlc3QiLCJjbGFpbSI6IlNvbWUgQ2xhaW0ifQ.UkFYSK7hSSeiqUOSMdbXgbOErMFnuK0Emk1722ny-r7

我已经在http://jwt.io/上检查过这个并且也可以在我的 .Net 应用程序中复制。

有人可以解释为什么签名对于给定的有效负载来说不是唯一的吗?我知道可能会发生冲突,但我无法解释它们是连续的序列。

最佳答案

在这种特殊情况下您要更改签名的 base64 url​​ 编码,而不是签名本身

第四个 Base64 值编码相同的二进制值。尝试转换为十六进制 http://kjur.github.io/jsjws/tool_b64udec.html

您将看到的值为

52415848aee14927a2a9439231d6d781b384acc167b8ad049a4d7bdb69f2fabe

如果将后缀更改为 -r1-r8,则二进制值会发生变化,签名验证将失败

Can two different BASE 64 encoded strings result into same string if decoded?

关于base64 - 为什么 JWT 签名对于特定负载来说不是唯一的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38508522/

相关文章:

使用 base64encoding 时出现 Python unpickling 错误

php - 如何添加 HTML 5 音频播放器?

python - 为什么需要 'b' 来使用 Base64 编码字符串?

java - Java中从XMLSignature获取证书

php - 使用 ECDSA P-256 SHA-256 使用 PHP 创建 JWT

asp.net-core - 填充 AspNetUserLogins 和 AspNetUserTokens

javascript - Node.js:将 Android-Base64 编码图像保存为文件

c - 验证 Authenticode 签名是否来 self 们公司,用于自动更新程序

oauth-2.0 - 实现永不过期的 OAuth 刷新 token

java - [JWT][JJWT] 函数compact() 非常慢