工程领域从来没有黑科技;密码学不仅是工程。
密码学和安全领域所涉及的知识体系十分繁杂,本文简述密码学领域中跟区块链相关的一些基础知识,包括Hash算法与数字摘要、加密算法、数字签名、数字证书、PKI体系、Merkle树、布隆过滤器、同态加密等。
Hash算法能将任意长度的二进制明文串映射为较短的(通常是固定长度的)二进制串(Hash值),并且不同的明文很难映射为相同的Hash值。
Hash值在应用中又常被称为指纹或摘要。Hash算法那的核心思想也经常被应用到基于内容的编址或命名算法中。
Hash算法将能实现如下功能:
冲突避免又是又被称为**“抗碰撞性”**,分为“弱抗碰撞性”和“强抗碰撞性”。如果给定明文的前提下,无法找到与之碰撞的其他明文,则算法具有“弱抗碰撞性”;如果无法找到任意两个发生Hash碰撞的明文,则称算法具有“强抗碰撞性”。
常见的Hash算法包括MD5和SHA系列算法。
MD4输出是128位,已被证明不够安全。MD5是对MD4的改进版本,也已被证明不具备“强抗碰撞性”。
SHA是一个Hash函数组。目前指明的SHA-1算法,输出为160位的Hash值,模仿了MD4算法那,采用了类似原理,也已被证明不具备“强抗碰撞性”。
SHA-2包括SHA-224、SHA-256、SHA-384和SHA-512算法等,跟SHA-1算法原理类似。
SHA-3相关算法也已被提出用来改进SHA-2算法。
目前,MD5和SHA-1已经被破解,一般推荐至少使用SHA-256或更安全的算法。
Hash算法一般都是计算敏感型的。可以通过硬件加速来提升Hash计算的吞吐量。
也有一些Hash算法不是计算敏感型的。例如scrpy算法。计算过程需要大量的内存资源,节点不能简单地增加更多CPU来获得Hash性能的提升。这样的Hash算法那经常用在避免算力攻击的场景。
数字摘要是对数字内容进行Hash运算,获取唯一的摘要值来指代原始完整的数字内容。数字摘要是Hash算法最重要的一个用途。利用Hash函数的抗碰撞性特点,数字摘要可以解决确保内容未被篡改过的问题。
有人专门是搜集常见口令,计算对应的Hash值,制作成字典。这样通过Hash值可以快速反查到原始口令。这一类型以空间换时间的攻击方法包括字典攻击和彩虹表攻击(只保存一条Hash链的首位值,相对字典攻击可以节省存储空间)等。
为了防范这一类攻击,一般采用加盐的方法。保存的不是口令明文的Hash值,而是口令明文再加上一段随机字符串(即“盐”)之后的Hash值。Hash结果和“盐”分别存放在不同的地方,这样只要不是两者同时泄漏,攻击者就很难破解了。
加解密算法是密码学的核心技术,从设计理念上可以分为两大基本类型。
现代加解密系统的典型组件一般包括:**加解密算法、加密密钥、解密密钥。**加解密的基本过程如图所示。
加密过程中,通过加密算法和加密密钥,对明文进行加密,获得密文。
解密过程中,通过解密算法和解密密钥,对密文进行解密,获得明文。
根据加解密过程中所使用的密钥是否相同,算法可分为对称加密和非对称加密。两种模式适用于不同的需求,恰好形成互补。某些时候可以组合使用,形成混合加密机制。
对称加密算法,加密和解密过程的密钥都是相同的。该类算法的优点是加解密效率(速度快,空间占用小)和加密强度都很高。缺点是参与方都需要提前持有密钥,一旦有人泄露则安全性被破坏;另外如何在不安全的通道中提前分发密钥也是个问题。需借助Diffie-Hellman协议或非对称加密方式来实现。
对称密码从实现原理上可以分为两种:分组密码和序列密码。牵着将明文切分为定长数据块作为基本加密单位,应用最为广泛。后者则每次只对一个字节或字符进行加密处理,且密码不断变化,只用在一些特定领域,如数字媒介的加密等。
分组对称加密代表算法包括DES、3DES、AES、IDEA等:
序列密码,又称流密码。要实现绝对安全的完善保密性,可以通过“一次性密码本”的对称加密处理。即通信双方每次使用跟明文等长的随机密钥串对明文进行加密处理。序列密码采用了类似的思想,每次通过伪随机数生成器来生成伪随机密钥串。代表算法包括RC4等。
对称加密算法那适用于大量数据的加解密过程;不能用于签名场景;并且往往需要提前分发好密钥。
非对称加密算法中,加密密钥和解密密钥是不同的,分别称为公钥和私钥。私钥一般需要通过随机数算法生成,公钥可以根据私钥生成,公钥一般是公开的,他人可获取的;私钥一般是个人持有,他人不能获取。
优点是公私钥分开,不安全通道也可使用。缺点是处理速度(特别是生成密钥和解密过程)往往比较慢,一般比对称加密算法慢2~3个数量级;同时加密强度也往往不如对称加密算法。
主要有基于大数质因子分解、离散对数、椭圆曲线等经典数学难题进行保护。代表算法那包括:RSA、EIGamal、椭圆曲线(ECC)、SM2等系列算法。
非对称加密算法一般适用于签名场景或密钥协商,但不适于大量数据的加解密。
在非对称加密中,由于公钥是公开可以获取的,因此任何人都可以给定明文,获取对应的密文,这就带来选择明文攻击的风险。
对同样的明文使用同样密钥进行多次加密,得到的结果完全不同,这就避免了选择明文攻击的破坏。
一种是对明文先进行变形,添加随机的字符串或标记,再对添加后结果进行处理。另外一种是先用随机生成的临时密钥对明文进行对称加密,然后再对对称密钥进行加密,即混合利用多种加密机制。
混合加密机制同时结合了对称加密和非对称加密的优点。先用计算复杂度高的非对称加密协商出一个临时的对称加密密钥(也称会话密钥),然后双方再通过对称加密算法对传递的大量数据进行快速的加解密处理。
典型的应用案例是现在大家常用的HTTPS协议。HTTPS协议在传统的HTTP层和TCP层之间通过引入TLS/SSL加密层来实现可靠的传输。
TLS协议是IETF基于SSL协议提出的安全标准。除了Web服务外,TLS协议也被广泛应用于Email、实用消息、音视频通话等领域。
采用HTTPS建立安全连接(TLS握手协商过程)的基本步骤如下:
该过程的主要功能是在防止中间人窃听和篡改的前提下完成会话密钥的协商。为了保障前向安全性,TLS对每个会话连接都可以生成不同的密钥,避免某次会话密钥泄露之后影响了其他会话连接的安全性。TLS协议过程支持加密算法方案较多,要合理地选择安全强度高的算法,如DHE-RSA、ECDHE-RSA和ECDHE-ECDSA。
DH协议的设计基于离散对数问题(DLP)。离散对数问题是指对于一个很大的素数p,已知g为p的模循环群的原根,给定任意x,求解X = g^x mod p是可以很快获取的。但在已知p、g和X的前提下,逆向求解x目前没有多想时间实现的算法。该问题同时也是ECC类加密算法的基础。
DH算法的基本交换过程如下:
在mod p的前提下,Y ^ x = (g ^ y) ^ x = g ^ (xy) = (g ^ x) ^ y = X ^ y。而信道监听者在已知p、g、X、Y的前提下,无法求得Z。
消息认证码和数字签名技术通过对消息的摘要进行加密,可用于消息防篡改和身份证明问题。
消息认证码全称是“基于Hash的消息认证码”(Hash-based Message Authentication Code,HMAC)。消息验证码基于对称加密,可以用于对消息完整性(integrity)进行保护。
基本过程为:对某个消息利用提前共享的对称密钥和Hash算法进行加密处理,得到HMAC值。该HMAC值持有方可以证明自己拥有共享的对称密钥,并且也可以利用HMAC确保消息内容未被篡改。
典型的HMAC(K,H,Message)算法包括三个因素:K为提前共享的对称密钥,H为提前商定的Hash算法(一般为公认的经典算法如SHA-256),Message为要处理的消息内容。如果不知道K或H的任何一个,则无法根据Message得到正确的HMAC值。
消息认证码一般用于证明身份的场景。 如Alice、Bob提前共享和HMCA的密钥和Hash算法,Alice需要知晓对方是否为Bob,可发送随机消息给Bob。Bob收到消息后进行计算,把消息HMAC值返回给Alice,Alice通过检验收到HMAC值的正确性可以知晓对方是否是Bob。注意这里并没有考虑中间人攻击的情况,假定信道是安全的。
消息认证码使用过程中主要问题是需要共享密钥。当密钥可能被多方拥有的场景下,无法证明消息来自某个确切的身份。反之,如果采用非对称加密方式,则可以追溯到来源身份,即数字签名。
数字签名基于非对称加密,既可以用于证实某数字内容的完整性,又同时可以确认来源(或不可抵赖,Non-Repudiation)。
一个典型的场景是,Alice通过信道发给Bob一个文件(一份信息),Bob如何获知所收到的文件即为Alice发出的原始版本?Alice可以先对文件内容进行摘要,然后用自己的私钥对摘要进行加密(签名),之后同时将文件和签名都发给Bob。Bob收到文件和签名后,用Alice的公钥来解密签名,得到数字摘要,与收到文件进行摘要后的结果进行比对。如果一致,说明该文件确实是Alice发过来的(别人无法拥有Alice的私钥),并且文件内容没有被修改过(摘要结果一致)。
知名的数字签名算法包括**DSA(Digital Signature Algorithm)和安全强度更高的ECSDA(Elliptic Curve Digital Signature Algorithm)**等。
针对一些特定的安全需求,产生了一些特殊数字签名技术,包括盲签名、多重签名、群签名、环签名等。
盲签名(blind signature):签名者需要在无法看到原始内容的前提下对信息进行签名。
盲签名可以实现对所签名内容的保护,防止签名者看到原始内容;另一方面,盲签名还可以实现防止追踪(unlinkability),签名者无法将签名内容和签名结果进行对应。
典型的实现包括RSA盲签名算法等。
多重签名(multiple signature)即n个签名者中,收集到至少m个(n>=m>=1)的签名,即认为合法。 其中,n是提供的公钥个数,m是需要匹配公钥的最少的签名个数。
多重签名可以有效地被应用在多人投票共同决策的场景中。例如双方进行协商,第三方作为审核方。三方中任何两方达成一致即可完成协商。
比特币交易中就支持多重签名,可以实现多个人共同管理某个账户的比特币交易。
群签名(group signature)即某个群组内一个成员可以代表群组进行匿名签名。签名可以验证来自于该群组,却无法准确追踪到签名的是哪个成员。
群签名需要存在一个群管理员来添加新的群成员,因此存在群管理员可能追踪到签名成员身份的风险。
环签名(ring signature)属于一种简化的群签名。
签名者首先选定一个临时的签名者集合,集合中包括签名者自身。然后签名者利用自己的私钥和签名集合中其他人的公钥就可以独立地产生签名,而无需他人的帮助。签名者集合中的其他成员可能并不知道自己被包含在最终的签名中。
环签名在保护匿名性方面有很多的用途。
数字签名算法自身的安全性由数学问题进行保障,但在使用上,系统的安全性也十分关键。目前常见的数字签名算法往往需要选取合适的随机数作为配置参数,配置参数不合理的使用或泄露都会造成安全漏洞,需要进行安全保护。
【笔记】密码学与安全技术概要总结(二)