在币圈,私钥就是一切。如果私钥泄漏,就相当于把资产送人了。所以,私钥安全存放的重要性,大家都明白。
私钥的几种形式:
一种是原始的16进制表示的字符串,类似5fac2a...58f304,长度64字符,因为私钥本质上就是一个256位的整数;
另一种是Base58编码后的字符串,类似KwF59qS...EWN4aU,长度约52字符,还原后也是一个256位的整数;
最后一种是为了方便管理多个币种、多个地址的HD钱包,引入的根私钥,一种表示方式为Base58编码,以xpri开头的字符串,类似xprv9s21Zr...DLyZCC,长度约110字符,还原后是一个512位整数,而另一种表示方法就是助记词,用至少12个助记词如tonight salt track ... identify edge cushion来表示。助记词一共有2048个,12个助记词被猜中的概率为两万亿亿亿亿分之一,如果助记词少于12个就不安全了。
因为签名需要私钥,所以钱包必定会在本地以加密的方式保存私钥。
那么问题来了:私钥泄露的风险有哪些?
一是钱包软件本身被恶意修改,类似中了病毒的软件,私钥被发送给破解者;
二是钱包软件安全水平不够,存储私钥的文件加密强度不够,加密文件被手机或电脑的恶意软件盗取后破解;
三是使用者在导入导出私钥或助记词的时候,通常都是复制/粘贴的方式,如果系统中存在恶意软件,可直接通过监控剪贴板获得私钥或助记词。
一句话总结:只要存放私钥的钱包触网,理论上都存在被黑客攻击和被恶意软件盗取的风险。
所以,要保证钱包安全,使用离线钱包是最好的方案。
离线钱包把钱包分为两部分:一个是在线钱包,它只存储公钥,负责联网查询余额、生成待签名的交易。由于不存储私钥,因此,在线钱包被攻击也无法获得私钥。
另一部分是离线钱包,它只存储私钥,负责签名在线钱包生成的交易。使用这种在线/离线分离的钱包时,一个完整的交易操作需要好几步:
通过在线钱包查询余额,并创建一个未签名的交易;
把未签名的交易数据传输给离线钱包;
用户在离线钱包上查看交易信息,确认无误后签名,生成签名后的交易数据;
把签名后的交易数据再发送给在线钱包,由在线钱包联网发出交易。
整个过程由于离线钱包的私钥不触网,可以保证私钥不泄露。
有的同学会质疑,在第二步的时候,离线钱包设备和在线钱包设备不是联网了吗?这样离线钱包不就等于间接联网了?
要彻底解决离线钱包在签名时需要和在线钱包交换数据的问题,最安全的方式是通过扫描二维码:
在线钱包生成未签名交易后,以二维码的方式展示在屏幕上;
离线钱包扫描二维码,用户确认并签名,签名后的交易以二维码的方式展示在屏幕上;
在线钱包扫描二维码,获得签名后的交易数据,联网发送。
由于二维码采用摄像头扫描,只用可见光传递信息,只要不被人偷拍,保密性极好,离线钱包完全做到物理断网,任何黑客都束手无策,因此,这种扫描两次二维码的离线钱包是最安全的。
那么问题来了,哪些钱包支持二维码方式离线签名呢?
在此推荐AirGap这个App钱包,它的离线钱包叫AirGap Vault,找一台不用的旧手机,联网安装后断网,再生成助记词,做好备份,可确保私钥不会被泄漏。在线钱包叫AirGap Wallet,在常用手机上正常安装使用就行。
对于经常操作各种Web3 Dapp的同学来说,如果使用MetaMask这个浏览器插件钱包,可以直接通过连接硬件钱包 - 选择QR-based即可与AirGap Vault配对。配对成功后,每次操作Web3,MetaMask会弹出二维码提示用AirGap Vault签名,签名后,再把AirGap Vault的二维码对准电脑摄像头,让MetaMask读取二维码数据,即可完成签名。由于私钥不保存在MetaMask中,不必担心木马病毒等窃取浏览器信息。
使用离线签名的钱包是不是就足够安全,可以高枕无忧了呢?当然也不是。离线钱包解决的是私钥不触网,不会泄漏的问题,还有很多安全问题并不是离线钱包所能解决的。
举个例子,如果一个恶意网站诱导用户操作MetaMask同意授权某个恶意合约花费你的USDC,这个授权交易一旦被离线钱包签名,那么钱包里的USDC也就被全部划走了。说到底,签名时看清楚交易细节,核对好金额、地址,才能保证资产安全。
只有不断学习,才能更好地在区块链的世界中生存。