为什么JWT签名对​​于特定有效负载不是唯一的

时间:2016-07-21 15:36:52

标签: base64 digital-signature jwt hmac

我的应用程序正在使用JWT,应该可以防止重放攻击。我正在测试这个以下内容。

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

我已经在http://jwt.io/上查看了此内容,并且也可以在我的.Net应用程序中重现。

有人可以解释签名对于给定的有效负载而言不是唯一的吗?我知道碰撞可能会发生,但我无法解释它们是连续的序列。

2 个答案:

答案 0 :(得分:3)

在这种特殊情况中,您正在更改签名的base64网址编码,而不是签名本身

第四个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?

答案 1 :(得分:-1)

当您更改签名(最后一部分)时,您仍然可以解码JWT以查看标头和有效负载。但是,如果您尝试使用更改的签名验证JWT,则该验证将失败。