钱包 Recovery 机制介绍(上):Recover EOA
来源:    发布时间: 2023-11-02 21:49   95 次浏览   大小:  16px  14px  12px
Recovery 要复原、找回的是什么?恢复忘记的密码、找回遗失的证件,而在钱包的例子中要找回的是钱包的控制权,拿回控制权才能继续使用钱包、执行各种交易。

作者:Nic Lin @imToken Labs

校对:imToken Labs

封面来源:rawpixel.com @freepik

适合读者:一般区块链钱包使用者

先备知识:知道 EOA(External Owned Account)及合约帐户的不同

以下将视「帐户」或「钱包」两个词为同义并将交互使用。

什么是 Recovery?

Recovery 要复原、找回的是什么?恢复忘记的密码、找回遗失的证件,而在钱包的例子中要找回的是钱包的控制权,拿回控制权才能继续使用钱包、执行各种交易。以下会将钱包分为 EOA 钱包以及合约钱包(合约钱包一般用 Contract Wallet 或 Smart Contract Wallet 代称)两种:EOA 的控制权便是那把私钥,有了私钥才有控制权,没有私钥就没有控制权;合约钱包则可以有更弹性、更细致的控制权。

本文将会介绍 EOA 的 Recovery 机制,包含不同机制的优缺点。下一篇文会介绍合约钱包的 Recovery 机制。

Recover 与 Restore

实际上找回私钥的方式在本质上可能会不太一样,例如从保险箱里取出手写的私钥(Recover)或是从多个私钥分片重新组合成完整私钥(Restore)。但在这篇文章里都会将 Recover 与 Restore 这两种方式视为同一种,它们都「Recover」、找回了钱包的控制权。

EOA 的 Recovery 机制

在 EOA 中,唯一的控制权就是那一把私钥,所以 EOA 的 Recovery 机制便是要找回那一把私钥。而要能找回私钥,使用者必须得在事前「备份」好私钥,才能在私钥遗失的时候「找回」私钥。这里会把 Recovery 机制分为「备份『完整』私钥」以及「备份『部分』私钥」两种。

注:助记词可以推导出私钥,所以其实备份助记词和备份私钥是一样的,而以下都将会以备份私钥为例。

备份完整私钥

使用者可以透过任何他偏好的方式进行备份,例如记在脑中、手写下在纸上、在铁板上、记录在冷钱包里、写下来放在保险箱、加密放在云端硬碟等等。如果使用者担心只使用一种保管方式不够保险,他也可以同时采用多种保管方式,例如同时保管在保险箱及云端硬碟等。不过要注意的是,备份完整私钥的缺点是攻击者只要攻破任一种保管方式,他都能直接拿到私钥。使用者采用多个方式保管,但其实安全性是取决于多个保管方式中安全性最弱的那一个。


(左图)使用者可以选择同时用不同保管方式保管私钥;(右图)同时保管私钥在多个地方则要担心任一个保管方式被黑就会直接被拿走完整私钥

如果使用者不放心使用单一保管方式但又担心同时采用多个保管方式可能会更容易被黑的话,可以透过将私钥进行分片并保管在不同地方的方式。

备份部分私钥

将私钥进行分片

使用者可以透过 Shamir Secret SharingSSS)的技术将私钥进行分片(每一个分片称为一个 Share),看要分成 2 份 Share、5 份 Share 还是 100 份都可以。在决定要分成几份 Share 的同时还要决定其中的几份组合在一起可以还原出私钥,称为门槛值。例如 5 份 Share 中任取 3 份可以还原,那门槛值就是 3。以下会分别用 t 与 n 来代表「门槛值」与「总共分成几份」,并用 t-of-n 来描述一个分片的设定,例如 3-of-5 指的是将私钥拆成 5 份,其中任 3 份组合在一起都可以成功还原。

注:这个网站可以让你动手玩玩看 SSS。详细介绍可以看文末的附录部分。

透过分片技术,使用者就可以将私钥分片并用不同保管方式来保管,而且攻击者攻破任一个保管方式也只能拿到一份 Share 而不是完整的私钥。仅看使用者的偏好,越高的门槛值表示攻击者越难拿到足够的 Share,但也表示使用者真的要还原的时候会更麻烦。


攻击者拿到单个 Share 是还原不出私钥的

Social Recovery

如果使用者是请自己社交圈内的亲朋好友来帮忙保管的话,也可以称为 Social Recovery。不过因为这些亲朋好友几乎都会是一般使用者,所以其保管 Share 的能力未必会好到哪去,因此目前 Social Recovery 应用很少,也有许多需要解决的使用体验上的问题。 Social Recovery 的使用体验和其可靠程度息息相关,因为对这些身为一般使用者的亲朋好友来说,使用体验越差就代表 Share 越可能遗失,也就代表这个 Recovery 机制越不可靠。

注:Social Recovery 不一定要做成一个 App 的形式,可以是使用者单纯将 Share 交给亲朋好友,并请他们用自己的保管方式保管好 Share。如此就不需要处理使用体验的问题,只要亲朋好友可以在需要时将 Share (用任何方式)归还即可。不过相对地没有一个统一的保管方案的选项,亲朋好友可能就会以各式各样自己习惯的方式来保管,那保管的品质可能就会参差不齐。


如果保管者经验不够或 Recovery 机制设计太差导致保管者遗失 Share,那就有可能没办法还原回私钥

为 Share 指定权重

可以透过让不同 Share 有不同权重的方式来弹性调整信任设计,例如让较可信的参与者的 Share 有更高权重,较不可信的参与者的 Share 权重则较低。可以透过把私钥分成更多份然后让使用者依照信任程度分发 Share 数量,也可以透过数学来更优雅地做到这件事。

透过为 Share 指定权重,使用者可以更弹性地分配 Share 给不同信任程度的保管者

总结

  • Recovery 机制要找回的是钱包的控制权。如果是 EOA 钱包那就是找回私钥,如果是合约钱包那就是找回合约的控制权,而合约钱包可以做到更弹性、更细致的控制权设计
  • EOA 的 Recovery 可以分为「备份『完整』私钥」与「备份『部分』私钥」两种。备份可以有各式各样的方式,例如记忆、手写、冷钱包、保险箱或云端硬碟等等。但备份完整私钥的缺点是只要保管备份的工具被黑客攻击成功,他就能拿到完整的私钥,也就是 EOA 的控制权
  • 更保险的方法是将私钥透过 SSS 技术进行分片,并把分片(也就是「部分」私钥)分别用不同方式保管,如此即便黑客黑了一个保管工具,他也只能取得一个分片。仅看使用者的偏好,将门槛值设定越高,黑客就必须要黑入越多保管工具来取得足够分片才能还原出完整私钥,但也表示使用者在需要还原时要凑齐越多分片
  • 使用者可以将分片交给亲朋好友来保管,称为 Social Recovery。但通常亲朋好友的保管能力不会好到哪去,所以如何让 Social Recovery 变得更好用影响了这个 Recovery 机制的安全性,因为越不好用代表保管者越容易遗失 Share,使用者能在需要时成功进行还原的机率也就越低
  • 使用者还可以透过为不同 Share 指定不同权重的方式来细化管理的颗粒度:将权重高的 Share 交给信任度高的保管者例如家人好友,将权重低的 Share 交给信任度低的保管者例如同学同事

 

附录

使用 SSS 工具拆分与组合 Share

这个网站为例,左边的框框(Split)是填入要拆分的 Secret(私钥,或任何资讯、秘密),右边的框框(Combine)则是要还原时填入 Share(每行一个 Share)。

左边是拆分 Secret,右边是组合还原出 Secret

1. 拆分

在进行拆分时要先选择要拆成几份(n)与门槛值(t),接着填入 Secret:

以随机产生的一把私钥(ec093f32a65212745d61fda2da2a782fbe585977f3e02792a3529557ea45ef5e)为例,并将其设置为 2-of-2,也就是总共会有两个 Share,也需要两个 Share 才能还原出私钥

可以看到输入后下面的 Parts 部分马上就会输出两个 Share:

  • 801f45b8ebf15d7265a5437170e0ebd7e845a1834ebc55b08f2b87fe7790df3b2cdbf8f9545ecd6ebc898dde9c9eb7a1d4b5e825c4f5c69ea8e7a62fe092e167567dfc49dfe776e852b5d4f1c1fb21a201d73bf986ee6ebd880eacc044c0341ec696fe8130ad15858e7e3a5c9b09d2c403acde86580cb2617de981277e547455f18ab18bd930346d77f528489ba23f029c35d2a59cc400549fd2af810f1c3b571b2deedd86f3095c2309bc20e9577e002972c0b57db1bf0767fa9e95c12064d86c483324d3c1666a85b1a59f987391ed309ae3e731eae3a3ba56df1def6931406cf2be896147ea84377bf0502b09b77aa03e18fcdb18eca5e823fe89fb5a30620df
  • 802f5b601632ab34cb4a86e2e1c1c67fc15b43068cb97b610f96dfed3f21afb79876303378ac5b1cb8d2da7cf8fcbf43a96bc19b89eb8d2c901f4c4e1125c2ceacea39527e1eedc1756ba9e383e7934403ae6632ddcd1cbad1dc98508980682c5d2decd2614bfb0b0d3db578f7d2758807487cdca1d8b4c2ea12d24eed78e8abe334b9f67640626b351a44a0f35465e5234ba0db2da805592ac54bb20a09b22e2daa191ad95606e99362bc91c98ee880499584faef236b6eca14f87b87b0c3511331bce9a2e2c844def3411ef45729fbbbe412ae69f41d876fddaaca1ab3b840cdc56913171fc1b86bd635c04222bb449a5df55872a0123bc4c7e8623275ba9400c

将这把私钥拆成两个 Share

2. 还原

接着尝试还原。可以先试试看只输入一个 Share 到右边 Combine 的栏位里,会发现产出的是乱码(还原成其他值导致解码成无意义的东西):

只提供一个 Share,Result 部分显示为乱码

再提供另一个 Share 后(要记得换行),就可以还原出原本的私钥,且 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 的加密密码放在密码管理器