Ethers.js

如何防止跨鏈簽名消息重放?

  • December 20, 2021

我正在建構一個通過瀏覽器進行乙太坊身份驗證的系統,該系統還檢查使用者是否擁有特定的令牌。

為此,我從後端發送一個隨機數,供使用者使用他們的私鑰和 Metamask 進行簽名。然後我在後端驗證該簽名以檢查該地址是否正確,以及使用者是否擁有該地址上的所述令牌。

現在假設我要驗證的令牌在鏈 A 和鏈 B 上。由於只是通過 Metamask 選擇鏈,如果簽名消息在兩條鏈上都有效,我如何確認使用者在特定鏈上?

從我檢查的內容來看,交易似乎在不同的鏈上具有不同的簽名,但消息卻沒有。

交易在不同的鏈上具有不同的簽名,因為chainId目標鏈的簽名包含在消息中。您總是只為一條鏈簽署交易。

消息簽名使用與事務簽名相同的機制,但消息簽名不包含這種額外資訊。它只包括你給它的東西。

因此,您可以在chainId要簽名的消息中明確包含。並確保在接收端chainId 是正確的。這樣它就不能在錯誤的鏈中使用。

您可能還需要考慮包括networkId,儘管在大多數情況下這與chainId.

引用自:https://ethereum.stackexchange.com/questions/116970