脑钱包(冷用):保护加密资产的首选方式

脑钱包(冷用):保护加密资产的首选方式

首先,让我解释一下「冷用」的概念。冷用是指将脑钱包与互联网隔离,并保持断网状态下的使用。相比之下,「暖用」就不再需要解释了。在接下来的讨论中,默认情况下我们将使用冷用方式来描述脑钱包,不再特别强调。

我用过 Ledger NANO X (以下简称 X),这是 MetaMask 推荐的硬件钱包,Ledger 是一家法国巴黎的企业,它必须遵守全球最严的个人隐私保护条例(GDPR),它的客户遍布全球200多个国家,硬件钱包设备卖出了600多万份。我认为它是最安全的、认可度最高的硬件钱包,但为了避免打脸,话不说满,截止目前(2023年7月)为止最安全。

但它并不好用,经常连接不上dApp,我就不细说了。即使连接上了,当你要签署一个参数较多的合约调用交易时,你用它一定会崩溃,因为你可能要对上百条参数进行一次按键确认操作(要按上百次),我手都按麻了就为了这憨憨的安全感。这个特性什么时候优化掉了告诉我一声,我那落灰的 X 就可以焕发新生。

脑钱包是什么,字面意思用脑子来做钱包,它是通过大脑记住一段秘密短语来实现的冷钱包。在 X 优化之前,我更倾向于使用脑钱包来保护我的加密资产(不到 10,000 USD 😭)。即便以后 X 变得很好用了,脑钱包仍然可以作为备用钱包,为你在X丢失或无法正常工作时提供支持和应急解决方案。

下面是一个 脑钱包与X的对比

脑钱包Ledger NANO X
秘密短语存储仅在你的脑子里,不要让僵尸吃掉了你的脑子1. X 硬件设备上
2.保险柜的一张便笺纸上
数据交换方式二维码或文件,可以很方便的审查每一次传出的数据蓝牙或USB数据线,数据审查不太方便
设备丢了的麻烦换一个智能手机重装脑钱包App 即可再买一个 X 设备
设备丢了泄密可能性没有在智能手机存储秘密短语,不存在泄密可能在安全芯片存储秘密短语,输错几次PIN码将删除秘密短语
生成助记词的算法公开透明,下文将详细介绍未知 (指我目前不知道,不代表 Ledger 没有公开或已公开)
助记词生成钱包的算法公开透明,下文将详细介绍公开透明

脑钱包中生成助记词的算法

在本节开始之前,先解释几个术语概念。

秘密短语

  • 秘密短语是一段不能告诉别人的秘密,类似于一个密码。
  • 它需要被牢记,每个字符都不能出错,而且不能被别人猜到。
  • 为了保护安全,秘密短语应该满足 Strong 级别的强度并尽可能长。

助记词

  • 助记词是一组便于记忆的单词,它由秘密短语生成或其他随机算法生成。
  • 助记词必须符合 BIP39 规范
  • 通常有12个词或24个词的版本,最后一个词是对前面一组词的校验值。

这里使用 hash-wasmbip39 来计算助记词

import bip39 from "bip39"
import hashWasm from "hash-wasm"
// 秘密短语
const passphrase = "我是秘密短语@你CaibudaoDe23333#2023"
const entropy = passphrase.trim()

// 生成24词助记词
const sha256Checksum = await hashwasm.sha256(entropy);
const Words24 = bip39.entropyToMnemonic(sha256Checksum)
console.log("Words24 => ",Words24)
// Words24 => comic kiss never city merge poverty cabbage mutual thrive silent pulse around buddy cheap resource identify innocent shoe zero easy cram neither execute make

// 生成12词助记词
const md5Checksum = await hashwasm.md5(entropy);
const Words12 = bip39.entropyToMnemonic(md5Checksum)
console.log("Words12 => ",Words12)
// Words12 => swallow craft memory patch rebel inmate divert tip region inner chunk ceiling

助记词生成钱包的算法

在本节开始之前,先解释几个术语概念。

公钥

  • 公钥就像一把锁,可以公开给别人。
  • 它用于加密信息,就像锁住一个箱子一样,只有对应的私钥才能解锁。

私钥

  • 私钥就像一把钥匙,非常重要,需要保密。
  • 它用于解密信息、签署交易和对消息进行签名。

地址

  • 地址类似于银行卡号,通过公钥计算得到。
  • 它是一个用来接收加密货币的标识,就像你的银行卡号用于接收钱款一样。

区块链协议

  • 区块链协议是一种规则和约定,用于管理加密货币交易和账本。
  • 比特币和以太坊是常见的区块链协议,它们允许人们进行安全的交易和记录交易历史。
  • 兼容以太坊的协议有很多区块链(诸如以太坊、Optimistic、Arbitrum)

派生模式:

  • 派生模式是一种钱包地址生成的算法。
  • 比特币有三种派生模式(普通、隔离见证兼容、隔离见证原生),分别代表不同的地址类型,而其他区块链通常只有一种派生模式。

派生路径

  • 派生路径是创建特定钱包地址的路线。
  • 它是一串数字和符号的组合,例如 m/44’/60’/0’/0/0。
  • 派生路径告诉我们如何从主路径出发,通过分支路径到达目标地址。

依赖的JS库如下

import bip39 from "bip39"
import HDKey from "hdkey"
import viem from "viem"
import EthJS from "ethereumjs-util"
// 计算 BIP39 Seed
const seed = bip39.mnemonicToSeedSync('comic kiss never city merge poverty cabbage mutual thrive silent pulse around buddy cheap resource identify innocent shoe zero easy cram neither execute make').toString('hex')

// 计算 hdKey
const hdkey = HDKey.fromMasterSeed(seed);

// 计算以太坊钱包私钥和地址
const path_eth = "m/44'/60'/0'/0/0"
const childkey_eth = hdkey.derive(path_eth);
const privatekey_eth = viem.fromBytes(childkey_eth.privateKey)
const publickey_eth = EthJS.Util.privateToPublic(Buffer.from(privatekey_eth, "hex")).toString("hex");
const address_eth = EthJS.Util.pubToAddress(Buffer.from(publickey_eth, "hex")).toString("hex");
console.log("privatekey_eth => ",privatekey_eth)
// privatekey_eth => 0xc946904bcdfb02e30587cff62fbe04f04eb28a232dba204e2bfa317e3f71c145  

console.log("address_eth => ",address_eth)
// address_eth => 0xef6441fcdb67dad4d6a11df2c2397144b42aa64c

// 其他区块链协议钱包私钥和地址的计算等待补充...

本文未完,后续将继续更新。