对于拥有加密货币的人来说钱包密匙的安全保存是很重要又很让人头疼的问题,虽然目前大多数钱包都不需要自己保存密匙而是使用12个或24个英文单词替代,但是保存这么多单词也是一个问题,光凭记忆也不可靠,但是记录到纸上或者电子设备上也总是会有丢失的风险。

如何安全保存加密钱包助记词?

我很早就有了解加密货币,但是一直因为对于钱包密匙的安全保存找不到比较好的方式,所以好几次获得一些加密货币也很快就换成法币了,现在看来损失很大,在网络上查询了好多,但是都没有我认为可靠的方式。

网络上别人推荐的方式

  1. 将助记词抄写在一张纸上安全保存(我认为时间长了很容易丢失,而且很容易被别人看到)
  2. 使用纸钱包或硬件钱包(我认为即使号称最安全的硬件钱包,也很容易丢失)

上边这几种方式是网上号称最安全的方式,但是我感觉一点都不安全而且原始,比如抄写在纸上,或者纸钱包,很容易被别人看到,而且如果身边人一个不小心有可能扔到垃圾桶,或者时间长了也可能忘记在哪里放着,有人可能会说多备份几个,那也从根本上解决不了上边的任何一个问题,甚至更危险。

我的方式

程序员都使用 git 来保存代码,其原理与blockchain 很相似,每个设备上都会有一个备份。

所以,我保存助记词的方式:

  1. 选择自己github或gitlab的一个私有仓库
  2. 将助记词拼接为字符串,然后使用openssl命令行工具使用AES-256-CBC对称加密加密该字符串
  3. 使用你要记忆密码的sha256,作为AES的密码,也就是AES(sha256(记忆的密码))
  4. 将加密后的字符串保存到一个隐蔽文件推送到私有仓库
  5. 将该仓库克隆到自己所有的设备上

这种方式的好处:

  • 加密助记词后的字符串保存于github私有仓库中和你在所有设备中(几乎没有丢失的可能)
  • 使用github私有仓库,别人无法访问
  • 即使别人能够看到该字符串,例如github内部人员能够,有如下变量
    • 只要你的文件名没有明确标注该文件是一个钱包密匙,没有人会关注
    • 假设以上前提也满足了,对方也不会猜到我们使用什么加密算法
    • 假设对方也猜到了使用什么加密算法,不会猜到使用了sha256
    • 最终结果就是,几乎不可能被攻破
    • 其实我认为完全可以单独创建一个新的私有仓库,单独保存,即使这样,我不认有有人可以破解256位密码的AES-256-CBC

唯一的弱点:

  • 需要永远记住加密助记词的密码

这是我目前能想到的保存加密钱包密匙最安全的方式,不管是否有可观的数字资产,你都不需要总是提心吊胆会丢失。

操作步骤简略

安装openssl

在linux设备上:

debian/ubuntu

sudo apt install openssl

Macos

brew install openssl

Macos上通常默认已经安装了一个LibreSSL ,所以默认会使用这个版本,但是由于该版本功能不全,可以通过openssl version 查看,如果是的话,需要在当前用户环境变量中覆盖一下,以使用刚才安装的版本:

echo 'export PATH="/usr/local/opt/openssl@1.1/bin:$PATH"' >> .bash_profile
source .bash_profile
openssl version

image.png

加密助记词

首先获取记忆密码的sha256摘要

echo "abc123" | openssl dgst -sha256

image.png

这里的记忆密码是 abc123, 其sha256为: 5ecf8d2cc410094e8b82dd0bc178a57f3aa1e80916689beb00fe56148b1b1256

echo "bleak version runway tell hour unfold donkey defy digital abuse glide please omit much cement sea sweet tenant demise taste emerge inject cause link" | openssl enc -aes-256-cbc -a -pbkdf2 -out result.txt

image.png

这里假设助记词是: bleak version runway tell hour unfold donkey defy digital abuse glide please omit much cement sea sweet tenant demise taste emerge inject cause link

aes-256-cbc加密密码使用上边的sha256字符串。

接下来只需将存放加密字符串的文件result.txt 添加到private 仓库中推送到github。

或者,完全可以创建一个可执行脚本,为了方便,以后只需执行脚本:

tee result.sh <<EOF
P=U2FsdGVkX18Dfc4u3UcyDN36E5fMnJiCRD4OE3R/u5nfVxNDPN2okg4CyLpaXhuD
kGITr3n3P02L340ctPd5R3p5qiT9Hm16NqDYWPab63bvanRClCM1iRsXkBny7J40
Pq3Uo7Lisq3ylSKBFK/3uIQKrBjGUOzYA0qCeFc+Lm7pU+HFxfrmznOM6nUtwJyW
omY3VPU+wQYkx59I/PtUTeFRBTwDfF6lRe0x0ItXFUo=

echo "$P" | openssl enc -aes-256-cbc -d -a -pbkdf2
EOF

不过这样会暴露算法,即使这样我也不认为有人可以破解256位密码的AES-256-CBC

解密

openssl enc -aes-256-cbc -in result.txt -d -a -pbkdf2

image.png

Q.E.D.