如何保证钱包私钥安全
本文主要从技术实现角度讲解数字货币钱包该怎样去保护用户私钥。
0x01 理解数字货币钱包
对于数字货币钱包来说,它并不是装钱的,而是装密钥的工具,准确来说,就是装私钥的工具。有了私钥就可以拥有根据其对应公钥计算出的地址上的数字货币的支配权。
作为钱包开发者,如何存储和使用用户私钥便是钱包安全的关键所在。
0x02 私钥的加密存储
下面是使用imToken钱包App创建钱包的截图。从截图上可以清楚的看到我们在钱包的时候需要输入密码来保护私钥。那这个私钥究竟是如何被保护的呢?私钥的生成和输入的密码有没有关系呢?
这里一般有两种误解:
- 根据输入的密码生成私钥
- 使用输入的密码对私钥直接进行加密,然后将加密的内容存到自己手机上。
如果钱包应用开发者真的这么做的话,估计大家每天都是排着队丢币了 :)。
你想啊,如果是第一种情况,那如果两个人用同样的密码不就可以互相看到对方钱包了么。
如果是第二种情况,在你输入密码进入钱包应用后,私钥就要被加载并驻留在内存里。你在网上搜一下“从内存提取密码工具”,保证可以搜到一大把。另外一个风险是,用户输入的密码都不是太长并且很多时候有规律可循,这样当加密后的私钥数据泄漏后,黑客通过暴力破解结合彩虹表等工具将私钥破解的几率还是比较高的。
事实上,私钥的生成永远和你输入的密码没有半毛钱关系,要么是随机生成,要么是根据助记符(一串随机生成的英文或其它语言词组)生成,保证每个人的私钥都是唯一的。
私钥的加密过程一般来说是下面这样的:
第一步:钱包应用会生成一个32字节随机数,我们称之为主密钥。
第二步:使用用户输入的密码对主密钥加密,生成主密钥密文。
第三步:使用主密钥对钱包私钥进行加密,生成私钥密文。
第四步:清除主密钥和私钥,保留主密钥密文和私钥密文。
你可以会有疑问,这样黑客拿到密文后先暴力破解主密钥,再破解私钥不也很容易么?其实在具体实现的时候,每个密文在生成的时候不只是用输入的密码,还有相应的密文生成参数,想通过密文和密码直接解密得到明文没那么容易的。
0x03 私钥的使用
从上一部分的解释我们知道,钱包应用里保存的是主密钥密文和私钥密文。
当我们登录钱包后,钱包应用会通过我们输入的密码对主密钥密文解密,将解密后的主密钥驻留内存。
当我们进行转账等需要私钥签名的操作时,通过主密钥解密私钥密文得到私钥,使用后立即将私钥从内存清除。
当我们需要修改密码时,实际上只是修改了主密钥密文,并不会触碰私钥相关部分。
这样,基本上将私钥明文暴露的几率降到最低,最大限度的保证私钥的安全。
还有疑问?欢迎加入我的知识星球,尽我所能为你答疑解惑。