Recovery 要復原、找回的是什麼?恢復忘記的密碼、找回遺失的證件,而在錢包的例子中要找回的是錢包的控制權,拿回控制權才能繼續使用錢包、執行各種交易。以下會將錢包分為 EOA 錢包以及合約錢包(合約錢包一般用 Contract Wallet 或 Smart Contract Wallet 代稱)兩種:EOA 的控制權便是那把私鑰,有了私鑰才有控制權,沒有私鑰就沒有控制權;合約錢包則可以有更彈性、更細緻的控制權。
本文將會介紹 EOA 的 Recovery 機制,包含不同機制的優缺點。下一篇文會介紹合約錢包的 Recovery 機制。
實際上找回私鑰的方式在本質上可能會不太一樣,例如從保險箱裡取出手寫的私鑰(Recover)或是從多個私鑰分片重新組合成完整私鑰(Restore)。但在這篇文章裡都會將 Recover 與 Restore 這兩種方式視為同一種,它們都「Recover」、找回了錢包的控制權。
在 EOA 中,唯一的控制權就是那一把私鑰,所以 EOA 的 Recovery 機制便是要找回那一把私鑰。而要能找回私鑰,使用者必須得在事前「備份」好私鑰,才能在私鑰遺失的時候「找回」私鑰。這裡會把 Recovery 機制分為「備份『完整』私鑰」以及「備份『部分』私鑰」兩種。
註:助記詞可以推導出私鑰,所以其實備份助記詞和備份私鑰是一樣的,而以下都將會以備份私鑰為例。
使用者可以透過任何他偏好的方式進行備份,例如記在腦中、手寫下在紙上、在鐵板上、記錄在冷錢包裡、寫下來放在保險箱、加密放在雲端硬碟等等。如果使用者擔心只使用一種保管方式不夠保險,他也可以同時採用多種保管方式,例如同時保管在保險箱及雲端硬碟等。不過要注意的是,備份完整私鑰的缺點是攻擊者只要攻破任一種保管方式,他都能直接拿到私鑰。使用者採用多個方式保管,但其實安全性是取決於多個保管方式中安全性最弱的那一個。
如果使用者不放心使用單一保管方式但又擔心同時採用多個保管方式可能會更容易被駭的話,可以透過將私鑰進行分片並保管在不同地方的方式。
使用者可以透過 Shamir Secret Sharing(SSS)的技術將私鑰進行分片(每一個分片稱為一個 Share),看要分成 2 份 Share、5 份 Share 還是 100 份都可以。在決定要分成幾份 Share 的同時還要決定其中的幾份組合在一起可以還原出私鑰,稱為門檻值。例如 5 份 Share 中任取 3 份可以還原,那門檻值就是 3。以下會分別用 t 與 n 來代表「門檻值」與「總共分成幾份」,並用 t-of-n 來描述一個分片的設定,例如 3-of-5 指的是將私鑰拆成 5 份,其中任 3 份組合在一起都可以成功還原。
註:這個網站可以讓你動手玩玩看 SSS。詳細介紹可以看文末的附錄部分。
透過分片技術,使用者就可以將私鑰分片並用不同保管方式來保管,而且攻擊者攻破任一個保管方式也只能拿到一份 Share 而不是完整的私鑰。端看使用者的偏好,越高的門檻值表示攻擊者越難拿到足夠的 Share,但也表示使用者真的要還原的時候會更麻煩。
如果使用者是請自己社交圈內的親朋好友來幫忙保管的話,也可以稱為 Social Recovery。不過因為這些親朋好友幾乎都會是一般使用者,所以其保管 Share 的能力未必會好到哪去,因此目前 Social Recovery 應用很少,也有許多需要解決的使用體驗上的問題。Social Recovery 的使用體驗和其可靠程度息息相關,因為對這些身為一般使用者的親朋好友來說,使用體驗越差就代表 Share 越可能遺失,也就代表這個 Recovery 機制越不可靠。
註:Social Recovery 不一定要做成一個 App 的形式,可以是使用者單純將 Share 交給親朋好友,並請他們用自己的保管方式保管好 Share。如此就不需要處理使用體驗的問題,只要親朋好友可以在需要時將 Share (用任何方式)歸還即可。不過相對地沒有一個統一的保管方案的選項,親朋好友可能就會以各式各樣自己習慣的方式來保管,那保管的品質可能就會參差不齊。
可以透過讓不同 Share 有不同權重的方式來彈性調整信任設計,例如讓較可信的參與者的 Share 有更高權重,較不可信的參與者的 Share 權重則較低。可以透過把私鑰分成更多份然後讓使用者依照信任程度分發 Share 數量,也可以透過數學來更優雅地做到這件事。
Recovery 機制要找回的是錢包的控制權。如果是 EOA 錢包那就是找回私鑰,如果是合約錢包那就是找回合約的控制權,而合約錢包可以做到更彈性、更細緻的控制權設計
EOA 的 Recovery 可以分為「備份『完整』私鑰」與「備份『部分』私鑰」兩種。備份可以有各式各樣的方式,例如記憶、手寫、冷錢包、保險箱或雲端硬碟等等。但備份完整私鑰的缺點是只要保管備份的工具被駭客駭入,他就能拿到完整的私鑰,也就是 EOA 的控制權
更保險的方法是將私鑰透過 SSS 技術進行分片,並把分片(也就是「部分」私鑰)分別用不同方式保管,如此即便駭客駭入一個保管工具,他也只能取得一個分片。端看使用者的偏好,將門檻值設定越高,駭客就必須要駭入越多保管工具來取得足夠分片才能還原出完整私鑰,但也表示使用者在需要還原時要湊齊越多分片
使用者可以將分片交給親朋好友來保管,稱為 Social Recovery。但通常親朋好友的保管能力不會好到哪去,所以如何讓 Social Recovery 變得更好用影響了這個 Recovery 機制的安全性,因為越不好用代表保管者越容易遺失 Share,使用者能在需要時成功進行還原的機率也就越低
使用者還可以透過為不同 Share 指定不同權重的方式來細化管理的顆粒度:將權重高的 Share 交給信任度高的保管者例如家人好友,將權重低的 Share 交給信任度低的保管者例如同學同事
以這個網站為例,左邊的框框(Split)是填入要拆分的 Secret(私鑰,或任何資訊、秘密),右邊的框框(Combine)則是要還原時填入 Share(每行一個 Share)。
在進行拆分時要先選擇要拆成幾份(n)與門檻值(t),接著填入 Secret:
可以看到輸入後下面的 Parts 部分馬上就會輸出兩個 Share:
801f45b8ebf15d7265a5437170e0ebd7e845a1834ebc55b08f2b87fe7790df3b2cdbf8f9545ecd6ebc898dde9c9eb7a1d4b5e825c4f5c69ea8e7a62fe092e167567dfc49dfe776e852b5d4f1c1fb21a201d73bf986ee6ebd880eacc044c0341ec696fe8130ad15858e7e3a5c9b09d2c403acde86580cb2617de981277e547455f18ab18bd930346d77f528489ba23f029c35d2a59cc400549fd2af810f1c3b571b2deedd86f3095c2309bc20e9577e002972c0b57db1bf0767fa9e95c12064d86c483324d3c1666a85b1a59f987391ed309ae3e731eae3a3ba56df1def6931406cf2be896147ea84377bf0502b09b77aa03e18fcdb18eca5e823fe89fb5a30620df
802f5b601632ab34cb4a86e2e1c1c67fc15b43068cb97b610f96dfed3f21afb79876303378ac5b1cb8d2da7cf8fcbf43a96bc19b89eb8d2c901f4c4e1125c2ceacea39527e1eedc1756ba9e383e7934403ae6632ddcd1cbad1dc98508980682c5d2decd2614bfb0b0d3db578f7d2758807487cdca1d8b4c2ea12d24eed78e8abe334b9f67640626b351a44a0f35465e5234ba0db2da805592ac54bb20a09b22e2daa191ad95606e99362bc91c98ee880499584faef236b6eca14f87b87b0c3511331bce9a2e2c844def3411ef45729fbbbe412ae69f41d876fddaaca1ab3b840cdc56913171fc1b86bd635c04222bb449a5df55872a0123bc4c7e8623275ba9400c
接著嘗試還原。可以先試試看只輸入一個 Share 到右邊 Combine 的欄位裡,會發現產出的是亂碼(還原成其他值導致解碼成無意義的東西):
再提供另一個 Share 後(要記得換行),就可以還原出原本的私鑰,且 Share 的順序不影響:
使用者可以按照自己的偏好選擇不同的 n 與 t 組合,例如 2-of-3 或 3-of-5。
這個網站是開源且可以以離線方式運作,但如果還是不相信的話,可以改用 Trezor 的開源代碼庫:
指令:$ shamir create 2of3 --master-secret=`openssl rand -hex 32`
(透過 openssl
產生隨機的亂數值作為私鑰)
保存的東西:
私鑰對應的地址
Share 們
注意事項:
建議用固定版號,這樣上面改版後,比較不會因為升級而有變化
可以用 AES 把 Share 給加密起來,並保存在不同地方(例如不同雲端),然後 Share 的加密密碼放在密碼管理器