Skip to content

Latest commit

 

History

History
3 lines (2 loc) · 7.36 KB

wm-wallet.md

File metadata and controls

3 lines (2 loc) · 7.36 KB

开发一个安全且不记私钥的非中心化数字货币钱包 - LearnDapp系列

bannerwmwallet.png

前言

数字货币钱包是很多币圈用户接触到的第一个Dapp,然而不少人在创建钱包的过程中都有些困扰(比如不可截图的助记词备份),尽管这些设计都是出于安全考虑,无可厚非,但繁琐的操作就是现状。当然,中心化的钱包和不同应用在使用体验上无二,可是换取这些便利的代价是将私钥交给平台管理,显然没人能完全放心。为什么数字货币钱包不能既好用又安全?Keyless钱包其实就是一个很好的方向。

什么是Keyless

顾名思义Keyless是指“无钥匙”进入系统,在数字货币钱包中这个key指的是私钥或助记词,相对于账户密码而言,区别在于是否能凭借普通的记忆力记住而无需额外的存储。数字货币钱包的核心是安全管理资产,合理的keyless设计方案能够保证只有用户自己能得到钱包私钥或助记词。

曾经有一种叫脑包的数字货币钱包,其实也能算是Keyless的方案,但是由于存在安全隐患,项目维护者最终选择关闭项目。只是单纯用密码来生成私钥是不靠谱的,这个稍后我们会说到。

目前也有一些团队做出了他们的Keyless钱包,但在使用场景上多少有些限制:

1.没有全端支持,有些特别的依赖,比如icloud或者指纹等

2.服务器关停后虽有方案找回,但依托第三方流程较长,也不方便及时验证

这个也就是为什么想到要用不一样的方案,开发一个Keyless数字货币钱包的原因。在此之前,我们先来看看一些可以用于设计Keyless钱包的技术。

多重签名/秘密共享/门限签名/TEE

多重签名具体来说,就是假设N个人分别持有N个私钥,只要其中M个人同意签名就可以动用某个“联合地址”的资金,比如2-of-2或2-of-3等。2-of-3多重签名的用法:自己生成两个私钥,一个保存为备份,另一个存放在钱包内;剩下的一个私钥由钱包服务端生成和保存。支付时需要用户和钱包服务端共同签名交易。如果用户或者钱包服务端丢失了私钥,则动用备份的私钥转移资金,而钱包服务端无法擅自动用用户的资金。

至于其他概念感兴趣的可以自行搜索,不少大佬都在做这方面的研究,相关的文章不少。

wm钱包实现

wm钱包使用来分层确定钱包,一个seed产生可多个钱包,而这个seed的管理方式类似2-of-2多重签名,但设计方式不同。多重签名是一个方案,但多个公链有不同的实现。出于适配更多数字货币的考虑,wm钱包的技术实现更加简单直接。以下是wm钱包的简单实现。

初始流程:

1.输入邮箱后,请求钱包服务器,发送验证码

2.验证通过后,生成sid+s1,通过邮箱自动备份并通过接口返回

3.本地要求输入pwd,结合sid生成s2

4.s2结合s1生成钱包,本地存储sid+钱包地址,并显示钱包列表

转账流程:

1.根据sid请求钱包服务器获得对应s1(限制频率,尤其对于未命中sid的请求)

2.输入pwd,结合sid生成s2

3.s1结合s2生成钱包私钥,然后在本地进行转账操作

重建流程:

1.从备份邮件找到sid

2.点击重建,输入pwd+sid即可进入,之后sid会被暂存,此后无需再输入

若无法连接服务器的紧急恢复:

从备份邮件中找到sid+s1,结合输入的pwd,即可离线生成并导出钱包的HD助记词和私钥

服务器管理的一半私钥会通过邮件发放,也支持随时备份取回,而任何人知道服务器这边的一半私钥没有你手上的另一半私钥,都无法操作你的钱包。

同样做到Keyless,wm钱包的优势是:

1.全端支持,纯前端实现,只需保证浏览器环境安全就如同保证本地钱包客户端安全

2.可以请求wm钱包服务器上进行挂失,收到请求后将对当前sid的钱包进行冻结,这样即使设备丢失并且意外泄漏了密码也能防止被盗币

具体的技术实现比如钱包的查询、交易、browserify等等细节都会整理在项目的readme中,最好的方式还是直接看代码,这里就不做展开了。仓库地址:https://github.com/learndapp/wm-wallet

安全考虑

懂技术的你可能会质疑以下问题:

是否能在本地环境暴力破解出私钥,从而可能产生暴露的风险?

其实相比较单纯的脑包,wm钱包也加上的密码加密,另外,最终的完整私钥是不做本地存储的,这样也就避免了本地加密数据被盗走后进行暴力猜解密码的可能,这也是为何需要把私钥“一分为二”的原因。

是否存在wm钱包维护者猜解出用户助记词和私钥的可能?

wm服务器端能够知道的数据就是极端情况下图谋不轨者能获得的数据,除了密码外的一切,此时问题就回退到脑包的安全性上,可以通过撞库来生成钱包。只是相对于脑包还加入了邮箱这个因子,就如同增加了指纹这个因子一样,降低了通过撞库来破解的可能性。这种泄漏的情况万一发生,和你在使用其他钱包时的安全性一样,也存在泄漏的可能,并且很可能其他钱包直接暴露了助记词。

另外,wm钱包维护者猜解出用户私钥的作恶成本极高,原因是即使遍历单个账户也有一定计算量,就需要不少时间。并且因为是分层确定钱包的设计,用户可以创建非常多的钱包,而因为wm钱包维护者和钱包使用者物理上隔离,很难知道哪个钱包有余额。即使万一真的尝试出了助记词,也需要监听多个币种的多个钱包的余额,这个成本极大,并且会随着用户量的增加而变得更加不可能。

至于导入的钱包则是完全没有这个问题,因为用户自己管理私钥,也不会有任何和服务端的交互。总之和使用其他普通应用时一样,密码可以设置的复杂些,在有必要时wm钱包也会考虑加上pin码、验证码、ga二次验证等等用于提升安全性的措施。当然,因为代码是开源的,这些额外的措施完全可以交给社区去完成。

后话

看完以上内容,你会了解到合理的Keyless钱包方案一定不是中心化的,keyless钱包是一个兼顾安全和易用性的方案。wm钱包目前是开源的,多币种普适的Keyless钱包方案,任何拿到代码的人都可以自己搭建一个属于自己的Keyless钱包。因时间和个人开发能力有限,技术上的考虑还有所欠缺,期待今后大家能一起加入完善,提出更好的建议或直接参与开发,我们一起完成一个了不起的keyless数字货币钱包。

访问 [https://w3c.market](https://w3c.market) 可以进入wm钱包体验,前往 [https://github.com/learndapp/wm-wallet](https://github.com/learndapp/wm-wallet) 可以查看源码。