安全性是实现区块链系统功能的基础,也是目前阻碍区块链应用推广的因素之一。密码学是信息安全的基石,以很小的代价给信息提供一种强有力的安全保护,广泛应用于政治、经济、军事、外交和情报等重要领域。随着近年来计算机网络和通信技术迅猛发展,密码学得到了前所未有的重视并迅速普及,同时应用领域也广为拓展。本文主要讲解密码学在区块链中的应用。
哈希算法
哈希算法(Hash Algorithms)也称为散列算法、杂凑算法或数字指纹,是可以将任意长度的消息压缩为一个固定长度的消息的算法。哈希算法是区块链技术体系的重要组成部分,也是现代密码学领域的重要分支,在身份认证、数字签名等诸多领域有着广泛的应用。深刻理解哈希算法原理,对于区块链系统的设计与实现有着至关重要的作用。
定义
哈希算法可以在极短的时间内,将任意长度的二进制字符串映射为固定长度的二进制字符串,输出值称为哈希值(Hash Value)或者数字摘要(Digital Digest)。一般而言,哈希函数的数学表达形式如下:
式中,为固定长度的输出值;为任意长度的输入值。任意输入值(Message)的二进制编码经过哈希函数计算后,可以得出n比特的一个0、1字符串的哈希值,在不同算法中n的取值可能不同,例如128、160、192、256、384或512等。哈希算法在区块链技术中得到了广泛的应用,各个区块之间通过哈希指针连接形成区块链,每个区块的完整性检验将以哈希运算的方式进行。
密码学哈希算法的主要特性就是单向性,即在算法上,只能从输入值计算得到输出值,而从输出值计算得到输入值是不可行的。因为哈希算法的输出值是固定长度的,所以哈希算法存在一个碰撞的问题,即哈希算法的输出值的长度为n比特,那么,任取2n+1个不同的输入值,就一定存在两个不同的输入值会得到相同的输出值。因此,在一定数量的输入值情况下,输出值越长的哈希算法,其碰撞的概率会越小。
常用的哈希算法
常用的哈希算法包括MD系列算法和SHA系列算法,其中MD系列算法有MD2、MD4、MD5、RIPEMD算法等,SHA系列算法有SHA0、SHA1、SHA2、SHA3算法等。在哈希算法中,MD5算法和SHA1算法是应用最广泛的,两者的原理相差不大,但MD5算法加密后的输出值的长度为128比特,SHA1算法加密后的输出值的长度为160比特。在2004年的国际密码学大会上,王小云教授介绍了对一系列哈希算法寻找实际碰撞的方法,并当场破解了包括MD4、MD5、HAVAL128算法在内的多种哈希算法。2005年,王小云教授进一步优化了方案,对SHA0、SHA1算法也成功地给出了碰撞攻击。这些攻击技术对当时哈希算法的安全性造成了很大威胁,但同时也促进了新的哈希算法的设计与研究。
1.MD系列算法
MD系列算法是一个应用非常广泛的算法集,最出名的MD5算法由RSA公司的罗纳德·林·李维斯特(Ronald L.Rivest)在1992年提出,目前被广泛应用于数据完整性校验、消息摘要、消息认证等。MD2算法的运算速度较慢但相对安全,MD4算法的运算速度很快,但安全性下降,MD5算法比MD4算法更安全、运算速度更快。虽然这些算法的安全性逐渐提高,但均被王小云教授证明是不够安全的。MD5算法被破解后,Ronald L.Rivest在2008年提出了更完善的MD6算法,但MD6算法并未得到广泛使用。
MD5算法的设计采用了密码学领域的Merkle-Damgard构造法,这是一类采用抗碰撞的单向压缩函数来构造哈希函数的通用方法。MD5算法的基本原理是将数据信息压缩成128比特来作为信息摘要,首先将数据填充至512比特的整数倍,并将填充后的数据进行分组,然后将每一分组划分为16个32比特的子分组,该子分组经过特定算法计算后,输出结果是4个32比特的分组数据,最后将这4个32比特的分组数据级联,生成一个128比特的散列值,即最终计算的结果。
2.SHA系列算法
SHA(Secure Hash Algorithm,安全哈希算法)是美国国家标准技术研究所发布的国家标准,规定了SHA1、SHA224、SHA256、SHA384和SHA512单向哈希算法。SHA1、SHA224和SHA256算法适用于长度不超过264比特的消息。SHA384和SHA512算法适用于长度不超过2128比特的消息。SHA系列算法主要适用于数字签名标准(Digital Signature Standard,DSS)里面定义的数字签名算法(Digital Signature Algorithm,DSA)。对于长度小于264比特的消息,SHA1算法会产生一个160比特的消息摘要。然而,SHA1算法已被证明不具备“强抗碰撞性”。2005年,王小云教授破解了SHA1算法,证明了160比特的SHA1算法只需要大约269次计算就可以找到碰撞。
为了提高安全性,美国国家标准与技术研究院(National Institute of Standards and Technology,NIST)陆续发布了SHA256、SHA384、SHA512以及SHA224算法,统称为SHA2算法。这些算法都是按照输出哈希值的长度命名的,例如SHA256算法可将数据转换成长度为256比特的哈希值。虽然这些算法的设计原理与SHA1算法相似,但是至今尚未出现针对SHA2算法的有效攻击。因此,比特币在设计之初即选择采用了当时被公认为最安全和最先进的SHA256算法,除了在生成比特币地址的流程中有一个环节采用了RIPEMD160算法,其他需要做哈希运算的地方均采用了SHA256算法或双重SHA256算法,例如计算区块ID、计算交易ID、创建地址、PoW共识过程等。
SHA256算法
在比特币和以太坊的区块链系统中,SHA256算法是工作量证明算法的基础,具体的工作量证明算法在后面的章节中详细阐述。在比特币系统中,工作量证明算法只计算一次SHA256算法,而在以太坊系统中,工作量证明算法则嵌套计算两次SHA256算法。
常用的哈希算法的过程参数见表3-1。
内部状态值的长度直接影响最终的输出值的长度,随着哈希算法不断演进,内部状态值的长度不断增加,对应的输出值的长度也在不断增加。只有不断增加输出值的长度,才能在算法上增加破解的难度。随着对哈希算法不断深入地研究,慢慢会找到一些更加低廉的破解方案,这也促使我们不断改进哈希算法的内部细节。我们已经发现了降低破解MD5、SHA1算法难度的方案,所以目前MD5算法与SHA1算法的安全性大大降低了,已经不再推荐使用,现在更多的是用在文件的校验方面。目前,SHA256算法还是比较安全的,但是也不排除在不远的将来,我们会发现新的破解方案。
加密和解密算法
哈希算法只是一种单向密码体制,即它是一个从消息到摘要的不可逆映射,只有正向过程,没有逆向过程。在区块链系统中,区块链账户地址的生成、数据传输还会用到支持加密和解密的密码体制。密码体制分为对称密码体制和非对称密码体制。传统的密码学主要研究对称加密,即在加密和解密的过程中使用相同的密钥或规则,其优势在于算法公开、计算量小、加密速度快。然而,对称加密需要发送方和接收方共享同一把密钥,因而难以实现有效的密钥分发和安全存储是其最大的缺点。同时,每一对发送方和接收方都需要使用同一把密钥,这在大规模通信中将会产生大量密钥,从而增加用户在密钥管理方面的负担。
对称密码体制
对称加密是对明文的数据按某种算法处理,让数据转换为不可读的数据(称为“密文”),从而达到数据不被窃取和阅读的目的。解密则相反,是将密文转化为明文的过程。
一个密码系统由密码算法和密钥两个基本组件构成。密钥是隐私数据,由用户自行保管,而算法是公开的,任何人都使用同一种算法。对称加密的原理如图3-1所示。对称加密是一种变换,用户A向用户B发送一份经过加密的消息,传输给用户B,用户B收到消息并逆向解密出原始的信息。
在对称密码算法早期的实际应用中,其密钥分发曾经是一个难题。1976年,惠特菲尔德·迪菲(Whitfield Diffie)和马丁·赫尔曼(Martin Hellman)的论文《密码学的新方向》(New Directions in Cryptography)提出了Diffie-Hellman密钥交换算法,解决了对称密码算法密钥分发的问题。该论文同时指出,加密和解密可以使用不同的密钥和规则,从而第一次使没有共享密钥的双方能够安全地通信。这项划时代的工作奠定了非对称密码体制的基础。密码学的研究热潮使得利用密码学来保护个人隐私和自由的观念深入人心。同时,数字加密货币的初期研究也借势蓬勃发展,诞生了密码学匿名现金系统eCash、分布式电子加密货币B-money、哈希现金HashCash等数字加密货币的雏形,为后期比特币的诞生提供了实践上的指导。
非对称密码体制
非对称密码体制的密钥成对出现,分为公钥和私钥两个部分,公钥PK用于加密或验证签名,私钥SK用于解密或签名,只有解密者知道。两个密钥之间不能从公钥推算出私钥,用公钥加密的数据只能使用对应的私钥解密,用私钥签名的数据只能使用对应的公钥验证。非对称加密的原理如图3-2所示。用户A使用用户B的公钥PK对明文P进行加密得到密文C,用户B用自己的私钥SK对密文C解密得到明文P。非对称密码系统与对称密码系统相比,不仅具有保密功能,同时也能实现密钥分发和身份认证。基于数字签名的身份认证是非对称密码系统的典型应用。在这个过程中,用户A先用自己的私钥SK对消息M进行签名得到S,随后用户B使用用户A的公钥PK对M、S进行验证,来判断S是否为用户A对M的签名。在一个典型的通信系统中,消息M是用户B发给用户A的一个随机数,如果用户A能够用M和自己的私钥SK计算出正确的签名S,并通过用户B的验证,则用户B可以确认用户A的身份,否则用户B将拒绝与用户A进行后续的通信。
非对称密码体制将加密和解密能力分开:多用户加密的结果由一个用户解密,可用于在公共网络中实现保密通信;单用户签名的信息可由多用户验证,可用于实现对用户的身份认证。
ED25519算法
ED25519算法是由科学家、密码学家丹尼尔·朱利叶斯·伯恩斯坦(Daniel Julius Bernstein)在2006年设计的与现有的任何椭圆曲线算法都完全不同的椭圆曲线签名算法,可用于区块链签名。签名过程不依赖随机数生成器,不依赖哈希函数的抗碰撞性,没有时间通道攻击的问题。
ED25519算法属于EDDSA算法家族,使用Curve25519椭圆曲线参数,其签名和验证的性能都极高。在比特币和以太坊系统中,签名算法使用的是ECDSA家族的Secp256k1椭圆曲线参数,表3-2为这两个椭圆曲线算法的特点对比。
从表3-2基本数据的对比中可以看出,使用Secp256k1实现的ECDSA算法和使用Curve25519实现的ED25519算法的差别比较小。不同之处在于,ED25519算法的重点放在了安全性上,其签名的过程不依赖随机函数,具备防哈希碰撞特性,也没有时间通道攻击的危险。
区块链技术经过11年的发展,已经逐渐走出数字货币等传统应用范围,逐渐向数字金融、物联网、智能制造、供应链管理等商业领域扩展。
目前,区块链技术正处于大规模商业应用的前夜,我们非常有必要探讨商用区块链技术的技术进展和发展趋势。