一种私钥加密存储及恢复的技术方案
加密钱包完全由私钥控制,如果私钥丢失,钱包将无法访问。 这在某种程度上是安全的。 但是,它在实际应用中会造成很多麻烦。 本文解决方案是提供一种方式备份及恢复私钥的方法。
一、背景
私钥非常重要,可以说是区块链世界的钥匙。当下主要用于控制虚拟数字资产,但预期未来可能扩展到各种资产、身份的控制上(比如汽车钥匙、数字身份、证书)。私钥一旦丢失,这些私钥的数字资产及控制权将全部丢失。同时,你还不能要求任何人或组织帮你找回自己的私钥。要想区块链知识与应用持续普及,私钥存储及恢复方案将成为区块链世界的基础配置。
本文的目的在于提供一种基于加密委托技术的区块链密钥保管及恢复方法,以解决现有用户密钥安全性不高或用户丢失后不能恢复的技术问题。此类解决方案应遵循以下三个标准:
外部特性:服务程序不能访问私钥。
可定制:即使在私钥丢失的情况下,用户也应该能够理解和配置恢复选项。
安全:不应该有简单的方法通过恢复选项劫持另一个人的私钥,只有真正拥有帐户的人才能恢复私钥。
二、现有解决方案
目前比较通用的私钥恢复方案有多种:
2.1 助记词
预先备份一份助记词(私钥的另一种形式),备份方式取决于用户自己。通常建议是抄写在纸上放在家里,有些要求严格的可能把这张纸放进保险柜。但这种解决方案还是面临“单点失败”的风险,比如,这张纸可能因为各种原因丢失。
2.2 Secret sharing
要做到去中心化的存储和恢复私钥,Secret sharing是不错的解决方案。
它的原理是把一个秘密分散、加密存储在多个参与者那里,只有当达到一定数量的参与者的时候才能拼出原始秘密,而少量参与者本身无法获得这个秘密。这样既可以减少单一节点失败造成的风险,又能在一定条件下恢复私钥。
技术本身不难,难点是把存储和恢复过程标准化、产品化。存储在谁那里?恢复的时候怎么验证身份?如何保证存储人的动力,如何避免存储人联合起来欺诈私钥所有者。
行业里面有相关工具提供, 比如:Vault12的解决方案是私钥持有人可以邀请亲朋好友作为保管人,每月支付保管费,可以根据保管数据的安全等级来设定恢复难易程度(比如不太关键的可以只要一个保管人确认来恢复,特别关键的可能要3/5来恢复),在恢复前需要朋友通过视频、电话等方式确认身份。整体说来,该方案比较完善、详细,具备灵活性和可操作性,也足够专注在密钥恢复上。
这个解决方案最大的问题是,一定数量的朋友组成员可以一起工作,从所有者那里窃取对帐户的访问权,即使所有者没有要求他们这样做。这就是为什么理想情况下,小组成员不应该知道小组中还有谁。而当用户真正需要找回私钥的时候,交互流程又显得过于复杂,体验大打折扣。
2.3 标准KYC程序
与现代银行对新客户执行KYC程序的方式类似,用户可以向KYC提供商表明自己的身份,以便重新获得资金。但是,用户需要执行一次已经设置好的过程,以便提供者知道地址背后的标识。
KYC验证的不足是,该过程通常由第三方提供商(如IDNOW)处理,这是一项成本高昂且有点违反区块链原则的工作。
三、技术实现方案
3.1 注册准备阶段
用户在本地对用户私钥进行加密,并向管理柜台提出注册申请;
刚开始的时候,用户需要保存用密码(password)加密过的私钥(private key),我们定义为EPK1;同时,还需要保存用安全问题(security answers)加密过的可恢复内容,并用公钥再次加密,我们定义为EPK2。
这些信息都保存到服务提供者数据库中。
因此,可以用以下公式表达它们之间的关系:
这样,在服务提供者的数据库里,保存了以下信息:
编号 | 内容 |
---|---|
1 | User Name |
2 | Hashed User Password |
3 | EPK1 |
4 | EPK2 |
5 | Security Q |
6 | Vender Pubkey |
3.2 用户注册流程
用户注册流程图如下:
主要步骤包括:
(1)将私钥在本地加密后(EPK1)保存;
(2)将用户密码在本地加密后(PassHash)保存;
(3)将用户设置的问题及答案,在本地用私钥加密后(EPK’),再使用平台公钥加密后(EPK2)保存;
(4)保存用户设置的问题(Security Q);
(5)保存平台公钥(PUBkey);
3.3 私钥恢复
如果用户密码(password)没有丢失,登录并获取私钥流程图如下:
主要步骤包括:
-
登录时输入password,得到passhash;
-
跟保存在数据库中的passhash比较,如果相同,返回EPK1;
-
用户在本地使用password从EPK1解密出私钥;
-
用私钥进行本地签名,并发送交易到区块链网络;
3.4 登录并获取私钥
如果用户密码(password)丢失,或者想用新密码重新保存私钥,密码重置过程需重新保存数据库内容,流程图如下:
主要步骤包括:
-
登录时输入新密码newpass,得到passhash;
-
跟保存在数据库中的passhash比较,如果不相同,申请重新保存,此时得到平台私钥(vendor privatekey);
-
从数据库拿出EPK2,使用平台私钥解密,得到EPK’;
-
此时用户需要回答数据库中的问题,回答(可以是生物特征比如指纹、或普通问题的答案)正确,可以从EPK’中恢复私钥;
-
使用newpass和privatekey生成新的EPK1,并更新数据库;
-
这样,用户下次就可以使用新密码进行私钥签名或发送交易了。
编者注:本文主要内容来自墨客区块链CEO陈小虎。
深入浅出区块链 – 打造高质量区块链技术博客,学区块链都来这里。