背景介绍

ZeroWallet利用零知识证明(Zero Knowledge Proof)的方式来强化私钥保护,希冀提供脑钱包的便利性与多签钱包的安全特性。本钱包专案是一位在UIUC暑假实习的高中生Aman Ladia在Andrew Miller教授的指导下完成的作品,以下是展示与源码:

Demo:https://app.zerowallet.me/(video) Source code:https://github.com/amsee01/ZeroWallet

操作方式

如果进入到该钱包的demo 页面,会如下图所示:

登入画面

使用者透过输入

使用者帐号 自订的密码一(Password 1) 自订的密码二(Password 2)

结果:产生用于以太坊钱包的一组私钥及一个share (如图)

ps. 这个demo 只是PoC,证明私钥产生与还原的可行性,并不是真正的钱包应用,但概念上有许多有趣的部分

输入使用者帐号,以及两组密码,产生私钥与备份用的share

私钥产生方法

为了较好理解本文介绍的ZeroWallet,我们先从几种私钥产生的方式与演进,了解其优缺点及背后设计的动机。至于为什么私钥的产生与保管如此重要,本文暂不赘述,可以简单理解为在密码货币(Cryptocurrency) 的世界,私钥代表唯一能够动用钱包资产的钥匙(授权),同时亦扮演着身份(认证)。

第一种:透过随机数(Entropy) 产生

这类私钥的产生方法,通常牵涉到产生乱数,而透过该乱数混乱的程度产生一把具有固定长度的私钥,如下图。而私钥产生后,由于它代表你个人资产的授权与认证关系,故私钥一但掉了,也意味着,你的资产将再也回不来。

不同于传统的网页登入密码,你需要记住的是一串64 个字元的十六进位数字,除非你有过人的记忆力,否则通常最好的保存方式是抄在纸上护贝起来,并藏在安全的地方。

第二种:透过助记词(Mnemonic Phrase) 产生

与第一种方式不同于,乱数会转成人类易读的助记词(红色部分),例如12 个单字,好处在于若是要抄写十六进位的字元时,容易搞混,而单字也比较不会抄错。如此一来,只要知道助记词如何转换到私钥的计算过程,就可恢复私钥,同时让抄写或输入的部分减少人工的错误。这也是目前手机钱包或硬体钱包中,常见的做法。

第三种:透过秘密分享(Secret Sharing) 技术产生

这边要提到一种古老的秘密分享技术,Shamir's Secret Sharing(SSS),该种技术可将一个秘密(Secret),根据他的设定拆分成t-of-n的规则,即当你有n个share时,只要拿到任意t份(门槛),就可还原既有的秘密,下图是一个2-of-3的例子,每个蓝色框框里的数值称作share,拿到任意两份就可回推黑色的秘密(私钥)。

与上述两种方法相比,这样设计的好处是一但助记词或私钥遗失,不会立即遭受损失。因为三份share 的其中一份,可以放在保管箱或其他安全地方,用于备份,并且另外两份share 也可放在异地,使有心的窃盗人士要一次性盗走的困难度增加。

但更重要的是,这类需要多个share 来还原秘密的方式,在policy 的设计上也较有弹性。例如share 1 & 2 分别给A & B 两人,每次交易时,A 必须拿出share,并由B 检查交易内容正确无误,才拿出B 的share 来完成交易,相较之前的方式多了再次确认与检查的特性。(类似银行层层签核的流程)

第四种:透过预先计算的Share 还原产生

了解第三种私钥的产生方式后,我们能否透过预先计算的Share 来还原私钥而不是先有私钥,才来计算如何拆分share,这是本专案作者的切入点。

稍微调整计算的步骤后,如下图所示。先前,我们提到,如果share 保管在异地,那么要同时偷走可用share 的难度就会变高。因此,作者将其中一个share 托管给服务商,并且需要同时拿到使用者的密码与服务器的秘密才能够还原share 2。至于share 1 则由使用者自己保管,share 3 做为备份,当使用者自己不慎遗失share 1 或是服务商不慎弄丢使用者的share 2 时,可用于复原私钥。

除此之外,对使用者来讲,需要记住的是使用者帐号与两组一开始设定的密码,而不是冗长的私钥,亦不是12 单字的助记词,比较符合传统的使用体验。

研究挑战

有了SSS 的概念与初步背景介绍后,接下来的挑战是,如何设计share 2 的产生方式

服务器端会针对不同使用者存一个Secret。 如何让服务器端无法知晓share 2 如何产生

这边会利用到OPAQUE的算法,OPAQUE本身是一种PAKE (Password Authenticated Key Exchange)协定的演算法,用于以密码验证的金钥交换协议。

工作原理

首先,要理解工作原理之前,需了解不经意伪随机协议(Oblivious Pseudo-Random Function, OPRF)。OPRF 在此主要是生成一个随机乱数,而OPRF 函数的输入来自两个不同方,属多方计算(MPC) 的一种应用,两方的人彼此不知道输入的值是什么,但仅有一方能知道结果。

这对于s​​hare 2 的产生有很大的帮助,原因是:

使用者并不想同时储存share 1 与share 2,想委任第三方托管。 使用者又不想托管方知道share 2 的产生方式。 如果没有使用者的参与,仅有托管方的部分讯息是无法计算share 2。 托管方即使掉了参与用的讯息,或是讯息被中间人调包,只会造成使用者生不出share 2 或是产生错误的值,使用者仍保有备份的share 3 可用于还原,但托管方无法学习任何有用的结果,亦即此处零知识证明的用途。

下图是share 2 产生的过程,左边是使用者,右边是服务器,红色代表秘密,仅能握有秘密的一方才能知道,即便是中间人都不该拿走秘密值。

Step 1. User -> Server

使用者端会产生一组随机数r,并且设定一组使用者密码,仅有使用者才知道这两个秘密。

(注:使用者每次向server请求协议的执行,r每次不一样) 利用杂凑函数计算密码的杂凑。 将密码的杂凑值作为椭圆曲线上的x座标,找到对应椭圆曲线上的y座标,即将杂凑值化成一个座标点(x, y),并以该点P作为生成元(generator)。

(注:将杂凑值化为点座标要有点技巧,不是每个x座标在椭圆曲线上都有对应的y值) 计算α,基于离散对数(Discrete Logarithm) 问题的假设,若不晓得r,要从α 与P 还原r 是非常困难的,接着将α 送给server 端。

Step 2. Server -> User

Server 端针对每一使用者,挑选一个秘密值Ks,并保存在其资料库。 假设Server 端某种方式知道使用者的ID,便可从其资料库取出Ks。 Server 端接着利用使用者传过来的α 与自己才知道的Ks 计算β,并传给使用者。 由于要解开β 的Ks 也是离散对数问题,使用者并不晓得Ks 是什么,传输过程中他人也无法知晓。

Step 3. User -> Server

待使用者收到来自Server 端计算的β 值后。 使用者会计算r 在椭圆曲线上的反元素m。 并利用m计算rw。

(注:推导过程如图,可注意到过程中r和r的反元素会消掉,因此即使每回合使用者选择不同的r,都不会影响最后share 2的生成) 最后,使用者利用自己设定的密码(pw) 与rw,计算杂凑值作为share 2 的结果。

产生其他share

Share 1:使用者一开始会设定两组密码,其中一组密码(pw1) 的杂凑值即为share 1。 Share 2:使用者利用另外一组密码(pw2) 与每次挑选的随机数r,与Server 交互后所得的结果。 Share 3:在已知Share 1 与Share 2 的情况下,利用SSS 还原secret,并计算share 3,又或是利用内差取另外一个值。

(注:在2-of-3 的情况下,也许先有share 才还原secret 也许可行(线性),但在3-of-5 (二次式)或更高次时,不一定能够直接由share推回secret)

Share 的储存

为了分开share 的存放,Share 1 则由使用者自己保存,Share 2 只在每次交互时才产生,Share 3 则可离线备份或藏在安全的地方,如此,即完成ZeroWallet 产生私钥与互动的过程。

小结

整个wallet 的运作与流程如上,是个非常有创意的方法,透过传统密码的记忆来产生私钥,让使用者毋须记忆冗长的私钥,并透过多方计算的方式,让私钥必须借助多个share的组装才能进行还原,并且有recover 的概念,让离线备份的share,在Server 无法使用的情况下,可用于还原。

这是个有趣的作品,但值得注意的是,使用者在拿到足够share 之时,即可组出私钥,甚至当下可记住私钥。换言之,在使用的过程中,仍有私钥被组出的可能性,即使他的安全性相对只存私钥的作法更佳。

私钥的保管与防护,在区块链上一直都是重要的研究挑战,不论是在安全性或在使用体验上,都与传统的密码登入有所不同,更重要的是,私钥代表着资产,不像传统上忘记密码就请求重送般简单。

门槛式签名

Threshold Signature

安全的多方计算(Secure Multi-Party Computation, sMPC)以及门槛式密码学(Threshold Cryptography)都是密码学上已有但古老的技术,透过门槛式签名的方法(Threshold Signature Scheme, TSS),让我们可在不还原私钥的任何情况下,每次产生一组针对同一地址的合法签名(Signature),进而保护私钥安全,由于私钥并不会存放在任何资料库,并且多个share分散在不同Server,而增加攻击困难度。除非多个资料库同时被骇,且攻击者取得足够的share,以及知道组装的手法,才有可能被还原回来。细节就暂不叙述。门槛式签名的方法与研究,是目前本团队(AMIS)已有且用于钱包服务上的技术。