我的应用程序正在使用JWT,应该可以防止重放攻击。我正在测试这个以下内容。
当我有一个有效的JWT并更改令牌/签名的最后一个字符时,JWT仍然有效。例如。以下令牌都可以正确验证:
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJTb21lIFRlc3QiLCJjbGFpbSI6IlNvbWUgQ2xhaW0ifQ.UkFYSK7hSSeiqUOSMdbXgbOErMFnuK0Emk1722ny-r4
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJTb21lIFRlc3QiLCJjbGFpbSI6IlNvbWUgQ2xhaW0ifQ.UkFYSK7hSSeiqUOSMdbXgbOErMFnuK0Emk1722ny-r5
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJTb21lIFRlc3QiLCJjbGFpbSI6IlNvbWUgQ2xhaW0ifQ.UkFYSK7hSSeiqUOSMdbXgbOErMFnuK0Emk1722ny-r6
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJTb21lIFRlc3QiLCJjbGFpbSI6IlNvbWUgQ2xhaW0ifQ.UkFYSK7hSSeiqUOSMdbXgbOErMFnuK0Emk1722ny-r7
我已经在http://jwt.io/上查看了此内容,并且也可以在我的.Net应用程序中重现。
有人可以解释签名对于给定的有效负载而言不是唯一的吗?我知道碰撞可能会发生,但我无法解释它们是连续的序列。
答案 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,则该验证将失败。