1.6 数字签名
在现实世界中,在文件上手书签名已经长期被用作原作者的证明,或者用来表示同意文件所列的条款。签名所代表的不可辩驳的事实有以下几点。
• 签名是不可伪造的,签名是签名者慎重签在文件上的证明。
• 签名是可信的,签名使文件的接收者相信文件已由签名者慎重签名。
• 签名是不可再用的,签名是文件的一部分,不择手段的人不能把签名移到不同的文件上。
• 签名文件是不可改变的,文件签名后内容就不能发生改变。
• 签名是不可否认的,签名和文件是一个物理事件,签名者以后不能宣布自己没签名。
实际上,上面所述事实没有一个完全是真的,因为难以检测签名是否被伪造或被复制。文件在签名后可以篡改,甚至有时候签名者在不知情的情况下,被欺骗完成了对文件的签名,但是考虑到这些欺骗的困难程度和被检测发现后造假者所需承担的责任,我们仍愿接受这些威胁,相信签名是原作者的证明。
要想在计算机上签名,有很多问题需要解决。首先,数字信息容易复制,在计算机中把一个文件的有效签名信息移动到另一个文件中非常容易,传统方式的签名毫无意义。其次,签名后仍然容易修改文件,并且可以不留下任何修改的痕迹。
因此,我们需要一种方法可以将签名者的身份信息绑定到代表文档的整个二进制数据上,并且该操作不可撤销,这种方法就是数字签名。
数字签名(Digital Signature,又称公钥数字签名)的功能和我们在纸质文件上的签名类似,但是使用了公钥加密领域的技术,是一种用于鉴别数字信息真伪的方法。一套数字签名通常会定义两种互补的运算,一种用于签名,另一种用于验证。通常来说,私钥用来签名,签名后的消息表示签名者对该消息的内容负责,公钥用来验证签名的正确性。数字签名使用了消息摘要和非对称加密技术,可以保证接收者能够核实发送者对消息的签名,发送者事后不能抵赖对消息的签名,接收者不能篡改消息内容或伪造对消息的签名。
假设Alice向Bob发送一条消息,Alice首先对消息生成一个消息摘要,生成消息摘要后对该消息用私钥进行签名并将签名信息附带在消息的最后,然后将消息和签名发送给Bob。Bob收到消息后用同样的算法生成消息摘要,然后拿Alice的公钥验证这个消息摘要,验证通过则表明消息确实是Alice发来的。Alice的公钥可以放在网站上让大家获得,或者发邮件告知大家。通过数字签名可以确保三点:①确认信息是由签名者发送的;②确认信息从签发到接收没有被修改过,包括传输中的中间人修改;③确认信息在传输过程中没有发生丢失。
数字签名的全过程分为两部分,即签名与验证,验证的过程与签名的过程类似。以下列举了数字签名的步骤。
• 发送者要发送消息,运用散列函数(MD5、SHA1等)生成消息摘要。
• 发送者用自己的私钥对消息摘要进行加密,形成数字签名。
• 发送者将数字签名附带在消息最后发送给接收者。
• 接收者用发送方的公钥对签名信息进行解密,得到消息摘要。
• 接收者以相同的散列函数对接收到的消息进行散列,也得到一个消息摘要。
• 接收者比较两个消息摘要,如果完全一致,说明数据没有被篡改,签名真实有效,否则拒绝该签名。
传统数字签名技术实现了基本的认证功能。然而,在一些区块链的应用场景中,存在身份匿名、内容隐藏等特殊的隐私保护需求。这时就需要通过群签名、环签名或盲签名等特殊的数字签名技术实现。例如,在区块链这样的弱中心化或多中心化场景中,为了实现完全化的匿名,签名者希望只需要自证其在一定的合法用户范围内,而不希望存在监管角色能够反推出签名者的身份,这时就需要采用群签名技术。
1)多重签名
多重签名(Multi Signature)是数字签名的一个重要应用方式,通常用于多个参与者对某消息、文件和资产同时拥有签名权或支付权的场景。例如,有一份文件需要多个部门联合签字后方可生效。根据签名顺序的不同,多重签名分为两类,即有序多重签名和广播多重签名。对于有序多重签名来说,签名者多次签名是有一定的串行顺序的,而广播多重签名没有限制。若数字资产需要经过多重签名确认后才能转移,则会极大地提高资产的安全性。恶意攻击者需要获得至少一个私钥才能盗用这些资产,降低了用户无意间泄露私钥所带来的风险和损失,因此多重签名在比特币脚本和以太坊智能合约中都有广泛的应用。
2)群签名
1991年Chaum和Heyst首次提出群签名(Group Signature)的概念,即某个群组内一个成员可以代表群组进行匿名签名,签名可以证明来自于该群组,却无法确定来自于群组中的哪一个成员。群签名方案的关键是群管理员,群管理员负责添加群成员,并且在发生争议时揭示签名者身份。在一些群签名的设计方案中,添加群成员和撤销签名匿名性的责任被分开,分别赋予群管理员和撤销管理员,但不管怎么说,所有方案都应该满足基本的安全性要求。
3)环签名
环签名(Ring Signature)是由Ron Rivest、Adi Shamir和Yael Tauman三位密码学家在2001年首次提出的。在环签名中,签名者首先会选定一个临时的签名者集合,集合中包括签名者自身。然后签名者利用自己的私钥和集合中其他人的公钥就可以独立地产生签名,无须其他设置。签名者集合中的其他成员,可能并不知道自己已经被包含在最终的签名者集合中。环签名的安全属性之一是,确定使用哪个成员的密钥来生成签名在计算上不可行。环签名类似于群签名,但在两个关键方面有所不同:第一,无法撤销单个签名的匿名性;第二,任何用户组都可以用作一个群。
4)盲签名
盲签名(Blind Signature)是在1982年由David Chaum提出的,是指签名者在无法看到原始内容的前提下对消息进行签名。一方面,盲签名可以实现对所签内容的保护,防止签名者看到原始的内容。另一方面,盲签名可以防止追踪,签名者无法将内容和签名结果进行对应。
5)门限签名
在1979年Shamir提出秘密分享技术后,Desmedt等人在1994年正式提出了门限密码学的概念。在现有的门限签名方案中,与单一公钥所对应的私钥被分享到多个成员,只有指定数目的成员共同协作,才能完成密码操作(如解密、签名)。正因为门限签名方案的这种结构,门限密码学被提出后受到广泛的关注,被用于密钥的托管、恢复、权力的分配等,也被赋予了更多的特性,如动态门限、子分片可公开验证等。
近年来,门限密码学在区块链系统中逐渐被应用,分为门限加密和门限签名。门限密码学一般用于随机预言机、防止审查、共识网络中防拜占庭和分布式伪随机数生成器(Coin Tossing)。门限密码学优越的资产协同防盗特性慢慢被新兴数字资产托管机构重视。本书主要讨论公钥密码学中的门限签名机制及原理。
与公钥密码学中的签名机制类似,门限签名机制也分为两部分,分别是门限密钥生成和门限密钥签名。
在进行门限密钥生成时,需要依赖分布式密钥产生(Distributed Key Generation,DKG)协议,该协议将多个参与者联合起来,生成符合一定要求的总密钥对和密钥对份额。每一个参与者对应一个密钥对份额,单个参与者只能知道部分密钥,无法获知总私钥。
在进行门限密钥签名时,参与某次签名的参与者将自己的私钥作为隐私输入,需要签名的信息作为公共输入,以此来进行一次多方参与的联合签名运算,最后得到签名。在这个过程中,安全多方计算的隐私性保证了参与者并不能获得其他参与者的私钥信息,但都可以得到签名。这个签名与单个参与者用私钥签出的签名一模一样,在进行签名验证时,可以直接进行验证而无须与其他参与者进行交互,签名的验证者甚至都无法感知到验证的签名是通过门限签名的方式生成的。
通常我们在区块链中看到的都是(t,n)门限签名方案,该方案是指由n个成员组成一个签名群体,该群体有一对公钥和私钥,群体内大于或等于t个合法并且诚实的成员组合可以代表群体用群私钥进行签名。任何人均可利用该群体的公钥进行签名验证。这里t是门限值,只有大于或等于t个的合法成员才能代表群体进行签名,群体中任何t-1个或更少的成员不能代表该群体进行签名,同时任何成员不能假冒其他成员进行签名。采用门限签名方式可以实现权力分配,避免滥用职权。
到目前为止,读者可能觉得门限签名和之前提到的多重签名非常相似,都是对于一个操作只需要部分参与者批准即可执行的,但实际上二者有着本质上的不同。
对于多重签名来说,多个参与者使用不同的私钥多次签名,每个签名之间互相独立,最终的验证是通过脚本或合约判断每个签名是否可以通过验证的,需要进行多次验证。而在门限签名中,每个私钥只是总私钥的一部分,多个私钥的多次签名在链下完成,最终生成一个总的签名,在验证时只需要在链上验证一次即可。但是无论是多重签名还是门限签名都可以帮助使用者分散风险,分配权力,使用时应依据具体的应用场景而定。