Contract-Development

避免對簽署智能合約的重放攻擊

  • November 5, 2018

場景:使用者有一個私鑰並想要簽署一些東西發送給合約例如:使用者將他的**(消息,簽名,公鑰)發送給合約,合約可以使用使用者提供的參數驗證它並記錄它。但是在這種情況下,當合約上的記錄是(消息,簽名,公鑰)時** ,攻擊者可以編寫使用者先前發送的參數來覆蓋目前數據,因為在合約驗證並記錄之前由使用者簽名契約

我的問題是,如果不添加像計數器這樣的其他資料結構(在契約上記錄並成為簽名的一部分,即將數據設為 (msg,sig,pub,counter)),是否有可能避免這種重播攻擊?

簽名只對特定的消息進行簽名,因此攻擊者不能對不同的消息使用相同的簽名。

有一類稱為重放攻擊的攻擊適用於在使用者無意中重新發送相同的消息。這可以在簽署乙太坊交易時討論,或者關於由契約創建的自定義簽署方案,其簽名數據傳遞為data.

對於乙太坊交易,簽名數據中已經包含一個計數器來處理這個問題,稱為nonce.

如果您正在為契約設計自定義簽名方案,您可能需要包含一些數據以防止交易被重播。顯而易見的解決方案是添加一個隨機數並跟踪每個帳戶在合約儲存中的最後一個隨機數。或者,您可以儲存簽名消息的實際雜湊值並拒絕兩次接受相同的消息。但是,這並不是在所有情況下都需要的,因為對於某些合約,該消息僅適用於特定的合約狀態,並且revert在任何情況下都會導致如果應用於舊的合約狀態,在這種情況下交易不能成功重播。

PS。在乙太坊中,通常不需要為 傳遞參數pubkey,因為這可以從簽名中恢復。

使用者對已簽署交易的契約進行交易。只需檢查 msg.sender 即可驗證發送交易的人是否控制著私鑰。

然而,假設由於某種原因使用者必須簽署一條消息並發送它,則可以通過要求消息的發送者是簽名它的人來避免攻擊,也就是說,您檢查 msg.sender 是否等於驗證簽名(ecrecover)。

希望這可以幫助

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