作者:Nic Lin @imToken Labs
校对:imToken Labs
封面来源:rawpixel.com @freepik
适合读者:一般区块链钱包使用者
先备知识:知道 EOA(External Owned Account)及合约帐户的不同
以下将视「帐户」或「钱包」两个词为同义并将交互使用。
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,但也表示使用者真的要还原的时候会更麻烦。
攻击者拿到单个 Share 是还原不出私钥的
如果使用者是请自己社交圈内的亲朋好友来帮忙保管的话,也可以称为 Social Recovery。不过因为这些亲朋好友几乎都会是一般使用者,所以其保管 Share 的能力未必会好到哪去,因此目前 Social Recovery 应用很少,也有许多需要解决的使用体验上的问题。 Social Recovery 的使用体验和其可靠程度息息相关,因为对这些身为一般使用者的亲朋好友来说,使用体验越差就代表 Share 越可能遗失,也就代表这个 Recovery 机制越不可靠。
注:Social Recovery 不一定要做成一个 App 的形式,可以是使用者单纯将 Share 交给亲朋好友,并请他们用自己的保管方式保管好 Share。如此就不需要处理使用体验的问题,只要亲朋好友可以在需要时将 Share (用任何方式)归还即可。不过相对地没有一个统一的保管方案的选项,亲朋好友可能就会以各式各样自己习惯的方式来保管,那保管的品质可能就会参差不齐。
如果保管者经验不够或 Recovery 机制设计太差导致保管者遗失 Share,那就有可能没办法还原回私钥
可以透过让不同 Share 有不同权重的方式来弹性调整信任设计,例如让较可信的参与者的 Share 有更高权重,较不可信的参与者的 Share 权重则较低。可以透过把私钥分成更多份然后让使用者依照信任程度分发 Share 数量,也可以透过数学来更优雅地做到这件事。
透过为 Share 指定权重,使用者可以更弹性地分配 Share 给不同信任程度的保管者
以这个网站为例,左边的框框(Split)是填入要拆分的 Secret(私钥,或任何资讯、秘密),右边的框框(Combine)则是要还原时填入 Share(每行一个 Share)。
左边是拆分 Secret,右边是组合还原出 Secret
在进行拆分时要先选择要拆成几份(n)与门槛值(t),接着填入 Secret:
以随机产生的一把私钥(ec093f32a65212745d61fda2da2a782fbe585977f3e02792a3529557ea45ef5e)为例,并将其设置为 2-of-2,也就是总共会有两个 Share,也需要两个 Share 才能还原出私钥
可以看到输入后下面的 Parts 部分马上就会输出两个 Share:
将这把私钥拆成两个 Share
接着尝试还原。可以先试试看只输入一个 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 产生随机的乱数值作为私钥)
什么是 Recovery?
Recover 与 Restore
EOA 的 Recovery 机制
备份完整私钥
备份部分私钥
将私钥进行分片
Social Recovery
为 Share 指定权重
总结
附录
使用 SSS 工具拆分与组合 Share
1. 拆分
2. 还原
其他工具