原標題:V神提出新型密鑰分享方案,可用於腦錢包和社交恢復設計應用
注:原文作者是以太坊聯合創始人Vitalik Buterin,在這篇文章中,他描述了一種新型的M-of-N密鑰分享方案,並提出了腦錢包和社交恢復設計的兩種應用案例。
假設你希望生成一個秘密s,而s可通過將N個密鑰分享中的M個放在一起來恢復,其中所有N個密鑰分享是預先知道的。那麼這種方案有兩個用例:
一種腦錢包,其中N個密鑰分享是N個安全問題的答案,並且你希望僅通過M個安全問題的答案就可以恢復資金(單獨的安全問題會很糟糕,但如果你將20個安全問題組合起來,你可以獲得相當多的熵);一種社交恢復設計,其中你希望使用閾值解密而不是智能合約錢包,因為你正在嘗試恢復訪問私人數據,而不是加密貨幣,並且你希望你的恢復合作夥伴能夠使用他們已經擁有的密鑰(以減少有丟失這些密鑰的風險);
普通的M-of-N 密鑰分享方案不適用於這些用例中的任何一個,因為它只允許預先選擇M 個密鑰分享,剩餘的(NM) 個密鑰分享必須使用一種確定性算法從原始的M個中產生,並且看起來像隨機數據(在腦錢包的情況下,它們不適合作為安全問題的答案,在社交恢復的情況下,需要用戶使用特殊軟件來存儲它們,而不是從現有的HD錢包中衍生出來)。
所以這就是我們要去改進的,我們制定了一個N-of-(2N-M) 閾值方案,從原N個密鑰分享生成( NM) 個附加密鑰分享。然後我們在區塊鏈上發布所有NM 個附加密鑰分享。如果需要,在社會恢復案例中,人們可以簡單地給每個參與者一份所有附加密鑰分享的副本。這會導致附加密鑰分享變成有效的公共信息:它們丟失的風險可以忽略不計,但任何攻擊者都會擁有它們。而結果是,在未發布的N個密鑰分享中,只要有M個密鑰分享與NM 個附加密鑰分享結合併揭示數據,我們就有了一個M-of-N方案,這正是我們想要的。
2021年7月18日更新:社交恢復用例的替代機制
在社交恢復用例中,我們希望設置過程盡可能簡單,因為用戶是懶惰傾向的,如果設置困難,他們將不可避免地選擇不安全的小型恢復夥伴集。這意味著以去中心化方式生成密鑰分享所需的分佈式密鑰生成(DKG) 可能是一個壞主意,因為它需要2 輪通信(這意味著額外的區塊鏈交易或每個人同時在線並擁有同步通信通道)。
相反,我們可以利用賬戶持有人自己擁有他們的私鑰這一事實。他們可以簡單地向每個恢復夥伴詢問他們的公鑰(例如,通過pk = G * hash(ecdsa_sign(msk, nonce)),其中msk 是恢復夥伴的主要密鑰),然後在鏈上發布一筆包含nonce 的交易,並為每個i 加密(share_i, pk_i) (注:其中share_i 是第i 個密鑰分享,pk_i 是第i 個參與者的公鑰)。
如果我們避免重複使用nonce隨機數,從而不重用密鑰(例如,設置nonce = hash(secret, maddr_1 ... maddr_n),其中secret是放入恢復的值,maddr_i是第i個恢復夥伴的地址,應該就足夠了),我們可以使用基礎的Diffie-Hellman加密算法進行加密,這意味著僅具有32 * (n+1) 個字節calldata數據的單筆交易,就足以保存恢復信息。
對此方案,ethresear.ch 論壇成員kelvin評論稱:
“這很有趣!我猜在社交恢復設計中,N個參與者會給他們的私鑰附加一些公共鹽(salt,指通過在密碼任意固定位置插入特定的字符串),然後將其哈希生成N個預先知道的密鑰分享?
否則他們將不願意洩露自己的密鑰分享,以讓N−M個附加密鑰分享被計算,並且他們還必須透露M 個密鑰才能恢復秘密。
此外,你認為人們會用這種方式來分發哪些類型的私人數據呢? ”
而Vitalik則回復稱:
“1、實際上,他們會使用hash(ecdsa_sign(key, salt))作為哈希函數來生成子密鑰,因為ecdsa_sign方法在web3 API 中公開並且具有標準化的確定性輸出。但這是一個實現細節, 效果是一樣的。
2、我只是在考慮'以太坊電子郵件'以及像Status這樣的去中心化消息傳遞應用的加密密鑰。另一個用例當然是其他區塊鏈的私鑰。 ”。