前言
在电子商务没有出现之前,我们基本上通过面对面的钱权交易,不存在加密解密问题。随着电子商务的兴起,我们现在很多的交易都是在互联网上完成的,银行转账,网上购物等等。早期的各种传输软件都没有考虑到安全的问题,都是以明文进行传输,信息被别人窃取,篡改等等。因此有很多群体靠网络发家!!犯罪!!但是网络交易确实给我们的生活带来了极大的方便。怎么解决这个问题呢?美国NIST,为了保证计算机的安全,对数据传输提出了几个要求:
数据安全性:就是数据内容加密,确保信息不被别人获取,个人存储的信息不能被别人收集到。
数据完整性:包括数据完整性和系统完整性,数据完整性确保数据和程序只能以特定权限的进行授权和改变,只能授权之后才能改变或者被改变,确保系统以一种正常的方式执行预定的功能,不会因别人的介入改变方向。
身份认证:有效确认发件人身份。
下面针对这三点一一说明,其都是怎么实现的。这篇文章不涉及到具体算法,只是概念性地介绍一下各类算法以及优缺点。另外说明一点就是TCP/IP网络模型是互联网通信的基础,然而在设计当初并没有考虑到数据在互联网上传输时的机密性,完整性和身份验证,而这三大机制可以有效地保证数据安全。
为保证数据在网络传递中的安全性和完整性,从技术上主要考虑一下情况:
1)如果需要使用一种方法验证数据在传输过程中是否被修改,可以使用哈希值。
2)如果需要证明实体知道机密但不来回发送机密,或者想使用简单的哈希值以防止在传输过程中被截获,可以使用加密的哈希值。
3)如果要隐藏通过不安全的媒介发送的数据或者永久保留数据,可以使用加密。
4)如果要验证声称是公钥所有者的人员的身份,可以使用证书。
5)如果双方事先共享密钥,可以使用对称加密以提高速度。
6)如果想通过不安全的媒介安全的交换数据,可以使用非对称加密 。
7)如果要进行身份验证和实现不可否认性,可以使用数字签名。
8)如果为了防范穷举搜素而进行的攻击,可以使用加密技术产生的随机数。
数据安全性
数据的加密算法一般分为两种,对称加密和非对称加密。所谓对称加密(也叫密钥加密)就是指加密和解密使用的是相同的密钥。而非对称加密(也叫公钥加密)就是指加密和解密使用了不同的密钥。
什么是加密解密?
我们将文字转换成不能直接阅读的形式(即密文)的过程称为加密。数据加密的基本过程就是对原来为明文的文件或数据按某种算法进行处理,使其成为不可读的一段代码,通常称为“密文“,使其只能在输入相应的密钥之后才能显示出本来内容,通过这样的途径来达到保护数据不被非法人窃取、阅读的目的。
1)对称加密介绍
所谓对称,就是采用这种加密方法的双方使用同样的密钥进行加密和解密,密钥是控制加密及解密过程的指令。而算法是一组规则规定如何进行加密和解密。由于其速度快,对称性加密通常在消息发送方需要加密大量数据时使用,对称性加密也称为单密钥加密。
下图简要说明对称加密过程
对称加密又分为两种:流式加密和分组加密
流式加密现在常用的就是RC4,不过 RC4 已经不再安全,微软也建议网站尽量不要使用RC4流式加密。一种新的替代RC4的流式加密算法叫ChaCha20,它是google推出的速度更快,更安全的加密算法。目前已经被android和chrome采用,也编译进了google的开源openssl分支—boring ssl,并且nginx 1.7.4 也支持编译 boringssl。
分组加密以前常用的模式是AES-CBC,但是CBC已经被证明容易遭受BEAST和LUCKY13攻击。目前建议使用的分组加密模式是AES-GCM,不过它的缺点是计算量大,性能和电量消耗都比较高,不适用于移动电话和平板电脑。(注意:加密模式跟加密算法是两回事,一般加密算法是使用某种加密模式进行加密运算的)
对称加密优缺点
优点是算法公开谁都可以使用,相对非对称家里来说计算量小、加密速度快、加密效率高。缺点就是在数据传送前,发送方和接收方必须商定好秘钥,然后使双方都能保存好秘钥。其次如果一方的秘钥被泄露,那么加密信息也就不安全了(但是站在互联网思维考虑两个互不认识的人需要安全通信怎么确定双方的密钥)。另外使用字典攻击可以对对称加密进行破解,也就是说双方的密钥需要经常进行更换才能使数据更加安全。而且每对用户每次使用对称加密算法时,都需要使用其他人不知道的唯一秘钥才能保证数据安全但是这会使得收,发双方所拥有的钥匙数量巨大,密钥管理成为双方的负担。
对称加密算法有:
DES:标准加密算法(data encryption standard),又被称为美国数据加密标准,是1972年美国IBM公司研制的对称密码体制加密算法。明文按64位进行分组,密钥长64位。
3DES:3倍的标准加密算法,安全性168位。
AES:高级加密算法(advance encryption standard),是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,安全性AES192,AES256,AES512。采用对称分组密码体制,密钥长度的最少支持为128、192、256,分组长度128位,算法应易于各种硬件和软件实现。
IDEA:国际数据加密算法,安全128位。
RC4:RC4加密算法是大名鼎鼎的RSA三人组中的头号人物Ronald Rivest在1987年设计的密钥长度可变的流加密算法簇。
RC5:RC5分组密码算法是1994由麻萨诸塞技术研究所的Ronald L. Rivest教授发明的,并由RSA实验室分析。它是参数可变的分组密码算法,三个可变的参数是:分组大小、密钥大小和加密轮数。在此算法中使用了三种运算:异或、加和循环。
PS:对称加密在某种程度上可以保证数据的机密性,但是数据在发送途中如果被中间人更改那么接收者也无法知晓。为了解决这种情况又引入了一种机制保证数据不能被更改就算是被更改之后但是接受者是可以识别到的,数据完整性保证。
2)非对称加密介绍
1976年,两位美国计算机学家Whitfield Diffie 和 Martin Hellman,提出了一种崭新构思,可以在不直接传递密钥的情况下,完成解密。这被称为“Diffie-Hellman密钥交换算法”。这个算法启发了其他科学家。人们认识到,加密和解密可以使用不同的规则,只要这两种规则之间存在某种对应关系即可,这样就避免了直接传递密钥。
这种新的加密模式被称为”非对称加密算法”,非对称加密算法又称公钥加密技术。其中使用的密钥被分解为一对:加密和解密所使用的不是同一个密钥,通常有两个密钥,称为“公钥“和“私钥“。且公钥是从私钥中提取出来的,而它们两个必需配对使用,如果用公钥对数据进行加密,只有用对应的私钥才能解密;如果用私钥对数据进行加密,那么只有用对应的公钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。这里的“公钥“是指可以对外公布的,“私钥“则不能,只能由持有人一个人知道。“公钥“是可以公开的,也就不怕别人知道,收件人解密时只要用自己的私钥即可以,这样就很好地避免了密钥的传输安全性问题;此外有公钥和私钥可以进行身份认证和数据加密。
公钥加密认证模式
假设两个用户要加密交换数据,双方需要先交换公钥,使用时一方用对方的公钥加密,另一方即可用自己的私钥解密。如果企业中有n个用户,企业需要生成n对密钥,并分发n个公钥。
假设A用B的公钥加密消息,用A的私钥签名,B接到消息后,首先用A的公钥验证签名,确认后用自己的私钥解密消息。由于公钥是可以公开的,用户只要保管好自己的私钥即可,因此加密密钥的分发将变得十分简单。同时,由于每个用户的私钥是唯一的,其他用户除了可以通过信息发送者的公钥来验证信息的来源是否真实,还可以通过数字签名确保发送者无法否认曾发送过该信息。非对称加密的缺点是加解密速度要远远慢于对称加密,在某些极端情况下,甚至能比对称加密慢上1000倍。
公钥私钥的原则
1.一个公钥对应一个私钥。
2.密钥对中,让大家都知道的是公钥,不告诉大家,只有自己知道的,是私钥。
3.如果用其中一个密钥加密数据,则只有对应的那个密钥才可以解密。
4.如果用其中一个密钥可以进行解密数据,则该数据必然是对应的那个密钥进行的加密。
非对称加密有:
RSA:RSA(Ron Rivest,Adi Shamir,Len Adleman三位天才的名字)算法实现简单,诞生于 1977 年,历史悠久,经过了长时间的破解测试,安全性高。缺点就是需要比较大的素数(目前常用的是 2048 位)来保证安全强度,很消耗 CPU 运算资源。但RSA是目前唯一一个既能用于数据加密又能用于数字签名的算法。
DSA:DSA是SChnorr和ELGAmal签名算法的变种,被美NIST作为DSS是一种公开密钥算法,它不能用作加密,只能用作数字签名。DSA使用公开公钥,为接受者验证数据的完整性和数据发送者的身份。它也用作于由第三方去确定签名和所签收数据的真实性。信息交流中,接受方希望收到的信息未被篡改,还希望收到的信息确实是自己认定的发送方所发,那么接受方和发送方就可以约定,共同使用DSA来实现。DSA是基于整数有限域离散对数难题的,其安全性与RSA相比差不多。但它比RSA要快很多。
ECC:同RSA一样,ECC(Elliptic Curves Cryptography,椭圆曲线密码编码学)也属于公开密钥算法。ECC与RSA相比,有以下的优点:
1)相同密钥长度下,安全性能更高,如256位ECC已经与2048位RSA、DSA有相同的安全强度。
2)计算量小,处理速度快,在私钥的处理速度上(解密和签名),ECC远 比RSA、DSA快得多。
3)存储空间占用小 ECC的密钥尺寸和系统参数与RSA、DSA相比要小得多, 所以占用的存储空间小得多。
4)带宽要求低使得ECC具有广泛得应用前景。
非对称加密缺点:
非对称加密相比对称加密更加安全,但也存在两个明显缺点:
1) CPU 计算资源消耗非常大,一次完全TLS(HTTPS用的协议)握手,密钥交换时的非对称解密计算量占整个握手过程的90%以上。而对称加密的计算量只相当于非对称加密的0.1%,如果应用层数据也使用非对称加解密,性能开销太大,无法承受。
2) 非对称加密算法对加密内容的长度有限制,不能超过公钥长度。比如现在常用的公钥长度是2048位,意味着待加密内容不能超过256个字节。
基于以上两点,所以公钥加密目前只能用来作密钥交换或者内容签名,不适合用来做应用层传输内容的加解密。
非对称加密主要用于密钥交换(也叫密钥协商),能够很好地解决这个问题。浏览器和服务器每次新建会话时都使用非对称密钥交换算法协商出对称密钥,使用这些对称密钥完成应用数据的加解密和验证,整个会话过程中的密钥只在内存中生成和保存,而且每个会话的对称密钥都不相同(除非会话复用),中间者无法窃取。
密钥交换算法
在密钥交换算法出现以前,对称加密一个很大的问题就是不知道如何安全生成和保管密钥。非对称密钥交换过程主要就是为了解决这个问题,使得对称密钥的生成和使用更加安全。密钥交换算法本身非常复杂,密钥交换过程涉及到随机数生成,模指数运算,空白补齐,加密,签名等操作。
密钥交换的作用就是双方可以在不共享任何秘密的前提下协商出一个共享秘密,然后使用这个密钥来进行数据加密。这一点对于互联网传输安全来说至关重要,比如非对称密钥交换算法是整个HTTPS得以安全的基石,充分理解非对称密钥交换算法是理解HTTPS 协议和功能的关键。
常见的密钥交换算法有ECDHE,DH,DHE 等算法。它们的特性如下:
DH:DH诞生时间比较早(1977年),但是1999 年才公开。它只是生成可用作对称密钥的秘密数值。在Diffie Hellman密钥交换过程中,发送方和接收方分别生成一个秘密的随机数,并根据随机数推导出公开值,然后,双方再交换公开值。Diffie Hellman算法的基础是具备生成共享密钥的能力。只要交换了公开值,双方就能使用自己的私有数和对方的公开值来生成对称密钥,称为共享密钥,对双方来说,该对称密钥是相同的,可以用于使用对称加密算法加密数据。缺点是比较消耗CPU性能。
ECDHE:使用椭圆曲线(ECC)的 DH 算法,全称椭圆曲线diffie–hellman交易所。优点是能用较小的素数(256 位)实现 RSA 相同的安全等级。缺点是算法实现复杂,用于密钥交换的历史不长,没有经过长时间的安全攻击测试。
ECDH:不支持PFS(完全向前保密),安全性低,同时无法实现false start。
DHE:不支持ECC。非常消耗CPU资源。
PS:PFS(perfect forward secrecy),中文可叫做完全前向保密。要求一个密钥只能访问由它所保护的数据;用来产生密钥的元素一次一换,不能再产生其他的密钥;一个密钥被破解,并不影响其他密钥的安全性。
建议优先支持RSA和ECDHE_RSA密钥交换算法。原因是:
1.ECDHE支持ECC加速,计算速度更快。支持PFS,更加安全。支持false start,用户访问速度更快。
2.目前还有至少20%以上的客户端不支持 ECDHE,推荐使用 RSA 而不是 DH 或者 DHE,因为DH系列算法非常消耗CPU(相当于要做两次 RSA 计算)。
现在大型HTTPS网站都是使用ECDHE_RSA(速度快,安全性相对于RSA也不低),如百度:
需要注意通常所说的ECDHE 密钥交换默认都是指ECDHE_RSA,使用ECDHE生成DH算法所需的公私钥,然后使用RSA算法进行签名,最后再计算得出对称密钥。
数据完整性
对于数据完整性保证,比较简单,就是使用单项散列算法。单项散列算法又称hash函数;Hash函数(也称杂凑函数或杂凑算法)就是把任意长的输入消息串变化成固定长的输出串的一种函数(hash算法也常用于缓存技术)。这个输出串称为该消息的杂凑值。一般用于产生消息摘要也就是特征码;通过单项散列算法对数据提取特征码,然后把源数据和特征码一同发个收件人、收件人收到数据后使用同样的单项散列算法对数据提取特征码并比对收到的特征码;如果一样则认为数据没有被串改。
由于单项散列算法是公开的如果在互联网上发送数据由于中间人攻击修改了数据然后使用同样的算法重新生成特征码并发给用户一样保证不了数据的完整性。
单项加密原则
1.输入一样:特征码的输出必然一样
2.雪崩效应:数据输入的微小改变将会引起特征码的巨大改变
3.定长输出:无论原始数据是多大特征码大小都是相同的
4.不可逆:无法根据特征码还原原来的数据
单项加密算法有:
MD5(Message Digest Algorithm 5):是RSA数据安全公司开发的一种单向散列算法,MD5消息摘要算法是单向散列函数,MD5不基于任何假设和密码体制,它采用了直接构造的办法,速度很快,非常实用。MD5算法的典型应用是对一段信息产生信息摘要,以防止被篡改。MD5将整个文件当作一个大文本信息,通过其不可逆的字符串变换算法,产生了这个唯一的MD5信息摘要。如果在以后传播这个文件的过程中,无论文件的内容发生了任何形式的改变,只要你对这个文件重新计算MD5时就会发现信息摘要不相同,由此可以确定你得到的只是一个不正确的文件。如果再有一个第三方的认证机构,用MD5还可以防止文件作者的“抵赖“,这就是所谓的数字签名应用。
SHA(Secure Hash Algorithm)这是一种较新的散列算法,可以对任意长度的数据运算生成一个160位的数值。
MAC(Message Authentication Code):消息认证代码,是一种使用密钥的单向函数,可以用它们在系统上或用户之间认证文件或消息,常见的是HMAC(用于消息认证的密钥散列算法)。
CRC(Cyclic Redundancy Check):循环冗余校验码,CRC校验由于实现简单,检错能力强,被广泛使用在各种数据校验应用中。占用系统资源少,用软硬件均能实现,是进行数据传输差错检测地一种很好的手段(CRC 并不是严格意义上的散列算法,但它的作用与散列算法大致相同,所以归于此类)。应用最多的是在TCP/IP报文末尾中接收方用来验证该消息的完整性。