开篇
密码学是“黄金法则”的基础技术支撑,失去了密码学的保护,任何认证、授权和审计机制都会显得苍白无力。
在实际的工作生活中我们经常遇到这样的场景:多个用户共用一个Wi-Fi来上网、共用一个服务器来跑任务;多个进程共用一个数据库来完成数据存储。这些场景中,多方交互都通过一个共同的通道来进行,那我们该如何保障其中的内容安全呢?
这就需要用到各种加解密技术了。今天我们就来聊聊一些经典的加解密算法:对称加密算法、非对称加密算法和散列算法。
对称加密算法
所谓对称加密,代表加密和解密使用的是同一个密钥。
如果我想发给你一段消息,又不想被其他人知道,那么我作为发送方,会使用加密算法和密钥,生成消息对应的密文;而你作为接收方,想要阅读消息,就需要使用解密算法和一个同样的密钥,来获得明文。
常见的经典对称加解密算法有DES、IDEA、AES、RC4、国密SM1和国密SM4,下面我们分别来看一下。
DES
DES(数据加密标准,Data Encryption Standard)应该是最早期的现代密码学算法之一,它由美国政府提出,密钥长度为56位。目前,暴力破解56位密钥的时间已经能控制在24小时之内了。
DES是一个已经过时的密码学算法,目前已经不推荐使用了。关于DES还有一点很有意思,它包含一个关键模块:S盒,其设计的原理一直没有公开。很多人认为这个S盒中存在后门,只要美国政府需要,就能够解密任何DES密文。
IDEA
IDEA(国际数据加密算法,International Data Encryption Algorithm)由瑞士研究人员设计,密钥长度为128位。对比于其他的密码学算法,IDEA的优势在于没有专利的限制,相比于DES和AES的使用受到美国政府的控制,IDEA的设计人员并没有对其设置太多的限制,这让IDEA在全世界范围内得到了广泛的使用。
AES
在DES被破解后,美国政府退出了AES(高级加密标准,Advanced Encryption Standard)算法,提供了128位、192位和256位三种密钥长度。通常情况下,我们会使用128位的密钥,在兼顾性能的前提下,获得足够的加密强度。
AES是国际上最认可的密码学算法,在算力没有突破性进展的前提下,AES在可预期的未来都是安全的。
RC4
RC4加密算法是在1987年设计的密钥长度可变的流加密算法簇。之所以称其为簇,是由于其核心部分的S-box长度可为任意,但一般为256字节。该算法的速度可以达到DES加密的10倍左右,且具有很高级别的非线性。RC4起初是用于保护商业机密的。但是在1994年9月,它的算法被发布在互联网上,也就不再有什么商业机密了。
RC4不是对明文进行分组处理,而是字节流的方式依次加密明文中的每一个字节,解密的时候也是依次对密文中的每一个字节进行解密。由于RC4算法加密是采用的xor,所以,一旦子密钥序列出现了重复,密文就有可能被破解。RC4作为一种老旧的验证和加密算法易于受到黑客攻击,现在逐渐不推荐使用了。
该算法简单的特点使得可以使用硬件来实现RC4,在很多旧的无线网卡中就是使用硬件来实现WEP加密的。运算效率高使得用软件实现RC4也很便捷、不会占用过多CPU。而非线性度良好,则是RC4广泛使用的重要原因。所谓非线性度好,就是指通过密码产生密钥流容易,而通过密钥流逆推出密码则很难。
RC4已经成为一些常用的协议和标准的一部分,如1997年的WEP和2003/2004年无线卡的WPA; 和1995年的SSL,以及后来1999年的TLS。
让它如此广泛分布和使用的主要因素是它不可思议的简单和速度,不管是软件还是硬件,实现起来都十分容易。
国密SM1和SM4
密码学作为安全的基础学科,如果全部依靠国外的技术,对于国家安全可能产生不利影响。因此,中国政府提出了一系列加密算法。其中,国密算法SM1和SM4都属于对称加密的范畴。
SM1算法不公开,属于国家机密,只能通过相关安全产品进行使用。而SM4属于国家标准,算法公开,可自行实现使用。
国密算法的有点就是受到国家的支持和认可。
下表对比了各加解密算法的特性:
对称加密算法的应用
在加密通信中(如HTTPS、VPN、SSH等),通信双方会协商出一个加密算法和密钥,对传输的数据进行加密,从而防止被第三方窃取。
在数据库加密这种存储加密技术中,通信双方也是将存储空间中的数据进行加密,这样即使硬盘被窃取,也不会导致信息丢失。
在公司内部,为了避免用户的Cookie和隐私信息发生泄露,也需要对它们进行加密存储。
对于大部分公司来说,选取AES128进行加解密就能获得较高的安全性和性能。如果是金融或者政府行业,在涉及国家层面的对抗上,有一定的合规需求,则需要应用国密算法。
非对称加密算法
非对称加密代表加密和解密使用不同的密钥。具体的加解密过程就是,发送方使用公钥对信息进行加密,接收方收到密文后,使用私钥进行解密。
当使用对称加密算法的时候,你不仅要跟每一个通信方协定一个密钥,还要担心协商过程中密钥泄露的可能性。比如,我当面告诉了你一个密码,怎么保证不被偷听呢?而在非对称加密算法中,公钥是公开信息,不需要保密,我们可以简单地将一个公钥分发给全部的通信方。也就是说,我现在就可以告诉你一个公钥密码,即使这意味着所有阅读这篇文章的人都知道了这个密码,那也没关系。因此,非对称密钥其实主要解决了密钥分发的难题。
除了加密功能之外,大部分的非对称算法还提供签名的功能。我们可以将数据摘要使用私钥加密,一旦接收方通过我们提供的公钥解密成功,就能够证明发送方拥有对应的私钥,也就能证实发送方的身份,而私钥加密后的内容就是我们说的数字签名。
所有的非对称加密算法都是基于各种数学难题来设计的,这些数学难题的特点是:正向计算很容易,反向推导则无解。
经典的非对称加密算法包括:RSA、ECC和国密SM2,接下来我们一个一个来看。
RSA
RSA使用的数学难题是:两个大质数(又称素数,指一个大于1的自然数,除了1和它自身外,不能被其他自然数整除)p、q相乘的结果n很容易计算,但是根据n去做因数分解得到p、q则需要很大的计算量。
RSA允许你选择密钥的长度,为提高保密强度,RSA密钥至少为500位长,一般推荐使用1024位。这就使加密的计算量很大。为减少计算量,在传送信息时,常采用传统加密方法与公开密钥加密方法相结合的方式,即数据采用AES或IDEA对话密钥加密,然后使用RSA密钥加密对话密钥和信息摘要。对方收到信息后,用不同的密钥解密并可核对信息摘要 。
RSA是被研究得最广泛的公钥算法,从提出到现在已近三十年,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一。
ECC
ECC(椭圆加密算法,Elliptic Curve Cryptography) 是基于椭圆曲线的一个数学难题设计的。
目前学术界普遍认为,椭圆曲线的难度高于大质数难题,160 位密钥的 ECC 加密强度,相当于 1088 位密钥的 RSA。因此,ECC 是目前国际上加密强度最高的非对称加密算法。
而且在私钥的加密解密速度上,ECC算法比RSA速度也更快。
国密 SM2
国密算法 SM2 也是基于椭圆曲线问题设计的,属于国家标准,算法公开,加密强度和国际标准的 ECC 相当。而国密的优势在于国家的支持和认可。
非对称加密算法的应用
对比于对称加密算法,非对称加密算法最大的优势就是解决密钥分发的问题。因此,现在大部分的认证和签名场景,其实使用的都是非对称加密算法。比如,在 SSH 登录、Git 上传等场景中,我们都可以将自己的公钥上传到服务端,然后由客户端保存私钥。
如果你遇到需要使用非对称加密的场景(比如多对一认证),我推荐你使用 ECC 算法。
散列算法
散列算法应该是最常见到的密码学算法了。大量的应用都在使用 MD5 或者 SHA 算法计算一个唯一的 id。比如 Git 中的提交记录、文件的完整性校验、各种编程语言中字典或者 Map 的实现等等。很多场景下,我们使用散列算法并不是为了满足什么加密需求,而是利用它可以对任意长度的输入,计算出一个定长的 id。
散列算法除了提供唯一的 id,其更大的利用价值还在于它的不可逆性。当用户注册,提交账号密码时,作为一个安全的应用,是绝对不能够存储明文密码的。因此,我们对用户的密码通过散列算法进行计算,存储最终的散列值。
除了刚才说的不可逆性,在密码学上,我们对散列算法的要求还有:鲁棒性(同样的消息生成同样的摘要)、唯一性(不存在两个不同的消息,能生成同样的摘要)。
经典的散列算法包括 MD5、SHA、国密 SM3。下面我们逐一来看。
MD5
MD5 可以用来生成一个 128 位的消息摘要,它是目前应用比较普遍的散列算法。虽然,因为算法的缺陷,它的唯一性已经被破解了,但是大部分场景下,这并不会构成安全问题。但是,如果你的应用场景没有消息摘要长度限制(32 个字符),我还是不推荐你继续使用 MD5 的。
SHA
SHA (安全散列算法,Secure Hash Algorithm)是美国开发的政府标准散列算法,分为 SHA-1 和 SHA-2 两个版本,SHA-2 细分的版本我们就不介绍了。和 MD5 相同,虽然 SHA 的唯一性也被破解了,但是这也不会构成大的安全问题。目前,SHA-256 普遍被认为是相对安全的散列算法,也是我最推荐你使用的散列算法。
国密 SM3
国密算法 SM3 是一种散列算法。其属于国家标准,算法公开,加密强度和国际标准的 SHA-256 相当。和国密 SM2 一样,它的优势也在于国家的支持和认可。
我们在使用散列算法的时候,有一点需要注意一下,一定要注意加“盐”。所谓“盐”,就是一串随机的字符,是可以公开的。将用户的密码和“盐”进行拼接后,再进行散列计算,这样,即使两个用户设置了相同的密码,也会拥有不同的散列值。同时,黑客往往会提前计算一个彩虹表来提升暴力破解散列值的效率,而我们能够通过加“盐”进行对抗。“盐”值越长,安全性就越高。
总结
密码学是一门深奥的学科,而作为密码学的使用者,我们只需要正确地理解各类算法的特性和功能,就可以满足日常的应用需求了。
总的来说,在使用的时候,要记住下面这些内容:对称加密具备较高的安全性和性能,要优先考虑。在一对多的场景中(如多人登录服务器),存在密钥分发难题的时候,我们要使用非对称加密;不需要可逆计算的时候(如存储密码),我们就使用散列算法。
在具体算法的选取上,只需要记住:对称加密用 AES、非对称加密用 ECC、散列算法用 SHA256 加盐。这些算法就能够满足大部分的使用场景了,并且在未来很长一段时间内,都可以保持一个较高的安全强度。