私鑰丟失也能找回?Vitalik Buterin 等提出了一種祕密多重簽名恢復方案。它能夠幫助忘記錢包密碼或私鑰的用戶找回私鑰,但也存在着安全隱患。

原文標題:《私鑰丟失也能找回?五分鐘瞭解 V 神的祕密多重簽名恢復方案》
撰文:Vitalik Buterin 等
編譯:灑脫喜

昨日,知名黃金愛好者兼加密貨幣懷疑者 Peter Schiff 在 Twitter 上聲稱自己的錢包丟失了密碼,因此無法訪問自己的比特幣。
Schiff 接着補充說:

「所以現在我的比特幣在本質上毫無價值,它也沒有市場價值。我知道擁有比特幣是個壞主意,但我從來沒有意識到它是如此糟糕!」

私鑰也能找回?瞭解 Vitalik Buterin 提出的祕密多重簽名恢復方案

Schiff 在推特上公佈自己的損失後,加密貨幣社區很快展開了討論,例如 Morgan Creek Digital 聯合創始人兼合夥人 Anthony Pompliano 就提問他是否自己忘記了密碼,而 Schiff 對此的回答卻是:「是我的錢包忘記了密碼。」

看不下去的 Pompliano 只好耐心解釋道:

「軟件只是執行人類發出的命令,它不能『忘記』任何事情,給我發郵件吧,我會盡力幫你找回丟失的比特幣。」

不過根據 Schiff 的回答,他的比特幣基本已無望找回了,他提到說:

「是 Eric Voorhees (注:ShapeShift 首席執行官)幫我準備的錢包,即便是他也覺得我無能爲力。如果你有任何想法,歡迎嘗試。」

看到這裏,讀者可能覺得這是一個非常悲傷的故事,一位加密貨幣懷疑者好不容易嘗試了比特幣,結果卻因爲自己忘記了密碼而丟失了它們。而倘若他在多處備份好私鑰,那麼即使他忘記了錢包密碼,也可以通過私鑰訪問自己的錢包。

當然,也有人會認爲這是一個深刻的教訓,它提醒我們要開發相關的技術,爲類似的人羣提供安全保障。

比如以太坊聯合創始人 vitalik 就評論稱:

私鑰也能找回?瞭解 Vitalik Buterin 提出的祕密多重簽名恢復方案

「對於人們用『加密貨幣就是加密貨幣,你的工作就是要非常小心地在三個地方寫下備份種子』來回答這個問題,我感到失望。我們可以,也應該創造更好的錢包技術,使得安全變得更容易實現。
例如,這裏有一個社交恢復提案:https://t.co/tuSbHhXKgd?amp=1

那 V 神所說的社交恢復提案具體是指什麼呢?

下面我們就來簡單瞭解一下吧。

EIP 2429:祕密多重簽名恢復

作者:Ricardo Guilherme Schmidt (ricardo3@status.im)、Miguel Mota (@Miguel Mota)、Vitalik Buterin (@vbuterin)、naxe (@ngmachado)
狀態:草案
類別:ERC
創建日期:2019-12-07
要求:EIP (137, 191, 831, 1271, 1344, 2470)

摘要

一般來說,加密貨幣的一個糟糕體驗是私鑰丟失或暴露,這可能導致不可逆轉的情況。

社交恢復被視爲賬戶合約去中心化恢復的一種選擇,然而社交恢復的使用,帶來了人的因素,而人的因素通常是安全系統脆弱性的主要原因。

社交恢復的主要風險是:

  1. 合謀:如果一些用戶知道他們是某個恢復的一部分,他們可能會對恢復攻擊的執行感興趣;
  2. 目標攻擊:外部代理可能瞭解恢復的所有者,並瞄準執行恢復攻擊所需最薄弱的點;
  3. 一般暴露:攻擊者如果設法感染大型用戶基礎環境依賴項,並獲得對多個身份的訪問權限,也可能通過恢復對未受影響的用戶產生副作用;
  4. 模擬攻擊:針對性攻擊可以瞭解用戶的情況,並將該用戶模擬到其社交對等方以執行恢復攻擊。這變得更加令人關注,因爲 AI 研究能夠「深度僞造」其他人的聲音和麪部動作。

儘管還沒有完美的解決方案來解決所有這些問題,但我們的目標是實現「信任最小化」控制者合約,併爲用戶可能使用的不同錢包啓用互操作性。

據悉,該標準提出了一種定義存儲在 Melkle 樹中的地址列表方法,這些地址連同它們的權重和用戶的個人祕密,將組成一個祕密集,而該祕密集可以在不直接危及用戶的情況下公開,因爲它仍然需要對地址列表中的總閾值進行人工驗證。

該祕密集可以保存,例如存儲在 web2 雲存儲當中,而不會嚴重影響安全性,這對於一些不信任自己,但也不希望信任某些特定實體的用戶而言是非常有用的。

用戶祕密永遠不會在鏈中顯示,顯示的只是一個 nonce 哈希,每次恢復時它都會增加。恢復設置獲取此哈希祕密 nonce 的哈希值的哈希值(hash of a hash),這種雙哈希方法被用於數學證明請求恢復的人知道該祕密,而不會泄露它。

根據提案,用戶可通過提供祕密(user_secret_data)以及加權地址列表(address_list)來配置恢復。

user_secret_data 可以是用戶可猜測的半私有信息。而 user_secret_type 是可選的隨機大整數,並將其與 address_list 一起導出爲 private_hash 。

地址列表的總權重必須大於閾值,而閾值是一個常數:THRESHOLD = 100 * 10^18。

而標準定義了生成可預測用戶祕密的幾種方法。

私鑰也能找回?瞭解 Vitalik Buterin 提出的祕密多重簽名恢復方案

當生物識別(biometrics,例如指紋、面部和瞳孔)技術可用時,應該使用它們,這是最簡單的方法。
私鑰也能找回?瞭解 Vitalik Buterin 提出的祕密多重簽名恢復方案

而當沒有生物識別技術時,一組通常只有用戶知道的諸多問題的標準表單,可被用於生成用戶的祕密數據。所有可選的默認字段有:Full Name (全名)、Birth Date (生日)、Mother Name (母親名字)、Mother Birthdate (母親生日)、Nationality (國籍)、First Love's Name (初戀者姓名)、First Pet's Name (第一隻寵物名)、Childhood Nickname (童年暱稱)。

私鑰也能找回?瞭解 Vitalik Buterin 提出的祕密多重簽名恢復方案

而密碼派生方法,則類似於詳細表單方法,但它只要求用戶輸入一些內容:Full Name (全名)和 Password (密碼)。

地址列表

用戶將定義監護人賬戶列表,該列表通過用戶的聯繫人列表進行填充。導入選項和輸入一個地址應該是很方便的,如圖所示:

私鑰也能找回?瞭解 Vitalik Buterin 提出的祕密多重簽名恢復方案

選擇好監護人後,系統將提示用戶定義每個監護人的權重:

私鑰也能找回?瞭解 Vitalik Buterin 提出的祕密多重簽名恢復方案

這些地址存儲在一個標準的 merkle 樹當中,但是每個子葉必須與 hash_to_peer 進行哈希運算。

merkle_root 被哈希爲一個標準 merkle 樹,它由 keccak256(bytes32(hash_to_peer), uint256(weight), boolean(is_ens), bytes32(ethereum_address)) 格式的 address_list 子葉組成。

方案支持了 ENS 域名,當監護人擁有一個 ENS 域名時,應該使用 ENS 域名。根據 EIP-137,如果使用了 ENS 域名,則 is_ens 必須爲「true」。

列表中的地址可以是賬戶合約,如果是賬戶合約,則可以直接調用審批功能,也可以提供 EIP-1271 簽名。而如果是外部擁有帳戶,則應用 ecrecover 邏輯,但它們也可以直接調用 approve 函數。

weight 設置此地址值相對於 THRESHOLD 常量的批准程度。

私鑰也能找回?瞭解 Vitalik Buterin 提出的祕密多重簽名恢復方案

用戶祕密數據哈希

私鑰也能找回?瞭解 Vitalik Buterin 提出的祕密多重簽名恢復方案

  1. 對於多個用戶而言,recovery_contract 可能是相同的,這是用戶正在使用的共享祕密多重簽名合約地址;
    2.user_secret_data 是用戶數據的純格式字節數據,它從不暴露,也不會被保存。當 private_hash 是未知時,應向用戶進行請求;
    3.private_hash 是 keccak256(user_secret_data),它從不暴露,可以用祕密集導出。這可以在所有恢復中重複使用;
    4.merkle_root 是通過對普通 merkle 樹進行哈希運算得到的,它在執行時會被揭露;
    5.weight_multipler 定義要達到 THRESHOLD 需要乘以多少個單獨權重;
    6.hash_to_execute 是 keccak256(private_hash, address(recovery_contract), recovery_contract.nonce(user_address)),它僅在執行時公開,每次恢復都是唯一的,也被稱爲「顯示哈希」。Nonce 和恢復合約地址被用於允許重用 private_hash;
    7.hash_to_peer 是 keccak256 (hash_to_execute),它在恢復授權請求時會公開,其被用於通過揭露 public_hash 種子來證明用戶知道 hash_to_execute 和 merkle_root,這也被稱爲「部分泄漏哈希」;
    8.public_hash 是 keccak256 (hash_to_peer,merkle_root,weight_multiplier),它自配置後就是公開的,只能使用一次,這也用於防止執行的重放。執行成功後,必須使用 setup(bytes32,uint256) 進行重配置;

恢復祕密集 URL

私鑰也能找回?瞭解 Vitalik Buterin 提出的祕密多重簽名恢復方案

恢復所需的所有信息都將存儲在 url 類型標準中:

recovery = erc831_part account_contract [ "@" chain_id ] "/" recovery_contract "/" private_hash | secret_type "/" address_list / weight_multipler [ "?" parameters ] [ "#" notes ]
erc831_part = "ethereum:recovery-"
account_contract = ADDRESS
chain_id = 1*DIGIT
recovery_contract = ADDRESS
private_hash = "0x" 64*HEXDIG
secret_type = UINT
address_list = ethereum_address *( ";" ethereum_address )
weight_multipler = UINT
ethereum_address = ADDRESS / ENS_NAME "*" weight
weight = UINT
ADDRESS = "0x" 40*HEXDIG
parameters = parameter *( "&" parameter )
parameter = key "=" value
key = STRING
value = STRING
notes = STRING

1.account_contract 是指要進行恢復的賬戶合約,可以使用任何賬戶合約,因爲恢復合約可以執行到任何接口或地址(如常規多重簽名);
2.chain_id 爲所有地址定義了以太坊鏈,如果不存在,則預設爲 1 (主網);
3.recovery_contract 執行恢復合約的邏輯,必須支持此文檔中指定的 ABI;
4.secret_type 選擇生成 user_secret_data 時使用的標準,在未給定 private_hash 時是必需的;
5.private_hash 是 user_secret_data 的哈希,如果不存在,恢復將要求使用 secret_type 所選的標準來獲取 user_secret_data;
6.weight_multipler 是每個 weight 將乘以的值,以達到 THRESHOLD 常數;
7.address_list 是具有個人權重的地址列表,最好是另一個帳戶合約,表明它們可用於恢復請求,但任何地址都可以幫助恢復。可以使用 ENS 域名,並在恢復過程中進行解析。總權重應高於 THRESHOLD 常數;
8.weight 默認爲 Math.ceil(THRESHOLD / address_list.length),由用戶設置自定義;
9.parameters 可能需要特定的 secret_type;
10. 如果需要的話,notes 可用於密碼提示;

恢復程序

當需要恢復時,用戶需要將其 Recovery Secret Set URL (恢復密鑰集 URL)加載到支持此標準的電子錢包中。根據配置的不同,當 private_hash (私有哈希)不可用時,必須從對用戶構成挑戰的 user_secret_data 處生成。

加載有效的密鑰集時,它將提示哪些用戶請求幫助。一些錢包或許能自動發送請求,而另一些錢包則允許用戶共享這個 Help Recover Request URL (幫助恢復請求 URL)。

該 EIP 鼓勵儘可能使用預簽名的消息 EIP-191,這一點很重要,因爲 gas 成本是一個常見的障礙。如果監護人選擇的地址是帳戶合約,則必須是 EIP-1271 才能使用預簽名信息。建議的正常順序如下:

私鑰也能找回?瞭解 Vitalik Buterin 提出的祕密多重簽名恢復方案

在特殊情況下,如果賬戶合約無法簽署信息,或者用戶的錢包無法按照這個 EIP 上指定的格式簽署信息,則也可以通過使用 msg.sender 的方法執行常規操作。

在這種情況下,監護人將不得不支付一小部分 gas 費用。

私鑰也能找回?瞭解 Vitalik Buterin 提出的祕密多重簽名恢復方案

理論基礎

user_secret_data 從不公開,在用 keccak256 算法進行哈希運算一次後,它就成爲從不公開的 private_hash。理論上,應該使用生物特徵技術,因爲用戶不太可能丟失他們的生物特徵。而生物特徵通常是不安全的,因爲它們並不是真正的祕密,任何高分辨率相機實際上都可以讀取大多數生物特徵,而且這些信息通常也爲政府所知。

當生物特徵不可用時,用戶數據表單仍然提供相當好的安全性,因爲合約中存儲的哈希是離源數據非常遠的加鹽(salted )哈希,即使只有名字被用作 user_secret_data,也是很難發現的。這些數據越不可預測,就越能抵禦目標攻擊,而目標攻擊仍需要發現用戶列表並接收足夠的授權。

在成功執行之後,需要重新配置以實現安全性保障。在經歷一次恢復後,恢復合約必須禁用自身,並等待新的配置。

可能存在的攻擊

需要注意的是,支持此 EIP 的錢包,應考慮用戶可能被請求幫助恢復其他賬戶,而請求可能來自任何知道 secret_set 的人,包括合法擁有者或以某種方式獲取 secret_set 的攻擊者。

因此:

  1. 錢包必須詢問用戶請求的合法性,詢問請求是否是通過個人驗證後進行的;
  2. 用戶必須知道,他們對自己的鏈上操作負有責任(在某些國家是道德的、合法的),並且必須驗證恢復請求的合法性;
  3. 視頻通話可能是通過 AI 僞造的,但攻擊者需要圖像和語音樣本,例如互聯網上的公共演講內容;
  4. 爲名人進行恢復的用戶,永遠不要信任視頻通話,應該去嘗試直接聯繫周圍的人,以檢查請求的合法性;

簡評:這種方案正是針對 Peter Schiff 這樣容易忘記錢包密碼或私鑰的羣體而設計的,但其也存在着安全隱患,而它對加密貨幣的社會可擴展性而言是非常重要的,因爲多數人在最初接觸加密貨幣時會和 Peter Schiff 類似。本文省略了很多技術細節內容,有興趣的讀者可以看原提案內容:https://gitlab.com/status-im/docs/EIPs/blob/secret-multisig-recovery/EIPS/eip-2429.md

來源鏈接:www.8btc.com