为什么 JWT 签名对于特定有效负载不是唯一的
Why is a JWT signature not unique for a specific payload
我的应用程序正在使用 JWT,应该可以防止重放攻击。我在下面测试这个 运行。
当我有一个有效的 JWT 并更改 token/signature 的最后一个字符时,JWT 仍然有效。例如。以下令牌全部正确验证:
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?
当您更改签名(最后一部分)时,您仍然可以解码 JWT 以查看 header 和有效负载。但是,如果您尝试使用更改后的签名验证 JWT,验证将失败。
我的应用程序正在使用 JWT,应该可以防止重放攻击。我在下面测试这个 运行。
当我有一个有效的 JWT 并更改 token/signature 的最后一个字符时,JWT 仍然有效。例如。以下令牌全部正确验证:
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?
当您更改签名(最后一部分)时,您仍然可以解码 JWT 以查看 header 和有效负载。但是,如果您尝试使用更改后的签名验证 JWT,验证将失败。