密码学和HTTPS

HTTPS

HTTP协议是基于tcp、ip协议之上的,但是HTTP协议有天然的缺陷:

信息拦截:通信过程中使用明文,可能被中间人劫持信息;

身份验证:没有验证通信方的身份,对方可能是其他人冒充的;

数据完整性:没有检验数据的完整性,数据可能被中间人篡改。

密码学和HTTPS

鉴于HTTP的不安全性,有了HTTPS协议。HTTPS协议在HTTP的基础之上做了一层加密,加密一般使用SSL或TLS实现。

密码学和HTTPS

SSL/TLS是一种混合加密算法,对称加密和非对称加密都有应用,在了解它之前需要先了解一些基本的密码学知识。

对称加密算法

对称加密是指加密和解密都使用同一秘钥,用该秘钥加密,同时也用该秘钥解密。对称加密的标准一般有DES、3DES、AES。

DES

DES(Data Encryption Standard) 是一种将64bit的明文加密成64bit的密文的加密算法, 他的秘钥长度为56bit。但是因为每隔7bit会设置一个用于错误检查的bit,因此实质上其秘钥长度为56bit。

DES每次只能加密64bit,如果待加密文件长于64bit,需要反复加密。目前能够在短时间内被破译, 所以目前不能该加密算法。

3DES

三重DES(triple-DES)是为了增加DES的强度, 将DES重复3次所得到的一种一张密码算法, 也称为TDEA(Triple Data Encryption Algorithm), 通常缩写为3DES。

密码学和HTTPS

3DES并不是进行三次DES加密(加密 --> 加密 ---> 加密), 而是加密 ---> 解密 ---> 加密的过程。这是为了3DES能够兼容普通DES设计, 也就是说当3DES的三个密钥都相同时, 经过前两步加密 ---> 解密之后, 得到的仍是最初的明文。

因此, 以前用DES加密的密文,就可以通过这种方式用3DES进行解密。所以,如果3个密钥都相同时,则其结果和普通的DES是等价的.

3DES解密步骤和加密正好相反, 是以密钥3, 密钥2, 密钥1的顺序执行解密 ---> 加密 ---> 加密操作.

AES

DES是美国联邦信息处理标准,已经过时, 3DES也不应该被使用。AES(Advanced Encryption Standard) 是经NIST机构选拔取代前任标准(DES)而成为新标准的一种对称密码算法。

需要注意的是,DES和AES都是一种标准,经过选拔脱颖而出的加密算法就可以成为标准。

在应用中应该选用哪种对称加密算法

应当使用AES, AES是经过NIST机构选拔的,加密算法设计及程序代码完全公开,由全世界密码学家去进行不断的验证, 即使有漏洞, 也会第一时间告知全世界并进行修复。

对称加密在通信中的缺陷

使用对称密码进行通信时,会出现秘钥的配送问题,因为要使用对称密码进行通信就必须要把秘钥发送给对方。但秘钥配送期间可能被中间人拦截,中间人可以替换自己的密文发送给接收者,这样就失去了秘钥的保密作用。

密码学和HTTPS

秘钥必须要发送,但又不能发送。不发送,通信无法加密解密;发送吧,就会有被中间人拦截的风险。

非对称加密算法能够解决秘钥配送问题。

非对称加密算法

公钥密码中,使用公钥加密的信息只能用私钥解密,使用私钥加密的信息只能用公钥解密。在公钥体系中,每个人都有自己的密钥对。

例如AB通信,AB要在实际通信前将各自的公钥发送给对方,而私钥自己保管。通信时,用对方的公钥加密信息然后发送给对方,因为中间人截取后没有私钥不能解密通信内容,所以传输过程是安全的。因为私钥自己保管且无需发送,所以私钥也是安全的。

公钥密码解决了秘钥配送问题,但并不意味着没有其他问题,因为我们没有验证所得到的公钥是否正确合法,这个问题称为公钥认证问题。公钥未验证会导致中间人攻击

如图,中间人攻击就是主动攻击者Mallory(中间人)混入发送者和接收者中间,对发送者伪装成接收者,对接收者伪装成发送者的攻击方式。

密码学和HTTPS

这种攻击虽然不能破译加密算法,但仍能达到攻击的效果。

证书系统可以解决中间人攻击的问题。

证书系统

要开车需要先考驾照,驾照上有本人的照片、姓名、出生日期等个人信息,以及有效期、准驾车辆的类型等信息,并由*局在上面盖章。只要看到驾照,就可以知道*局认定此人具有驾驶车辆的资格。

公钥证书起始和驾照很相似,里面记有姓名、组织、邮箱地址等个人信息,以及属于此人的公钥,并由认证机构施加数字签名。只要看到公钥证书,就可以知道认证机构认定该公钥的确属于此人。

密码学和HTTPS

公钥认证的过程

1. Bob生成秘钥对,并将私钥妥善保管。这里的秘钥对也可以由认证机构代为生成。

2. Bob将自己的公钥发送给了认证机构Trent,请Trent对他的公钥加上数字签名(也就是生成证书)。
   Trent收到Bob的公钥后,确认所收到的公钥是否为Bob本人所有。确认方式可以为发送邮件、打电话或者当面认证和身份证明来确认公钥所有人的身份。

3. Trent用自己的私钥对Bob的公钥施加数字签名并生成证书。

4. 现在Alice需要向Bob发送密文,因此她从Trent处获取证书。证书中包含了Bob的公钥,并带有Trent对该公钥签署的数字签名。

5. Alice得到带有认证机构Trent的公钥验证数字签名,确认Bob的合法性。如果验证成功,就相当于确认了证书中所包含的公钥的确是属于Bob。到这里,Alice就得到了合法的Bob的公钥。

6. Alice使用Bob的公钥加密要发送的消息,并将消息发送给Bob。

7. Bob用自己的私钥解密密文得到Alice的消息。

通过证书验证,能够避免中间人攻击。

证书标准规范

目前广泛使用的是ITU(International Telecommunications Union)和ISO(International Organization for Standardization)制定的X.509规范。
X.509证书所包含的构成要素与刚才Bob的证书大致对应如下:

密码学和HTTPS

公钥基础设施

公钥基础设施(Public-Key Infrastructure)是为了能够有效地运用公钥而制定的一系列规范的总称。例如X.509就是PKI的一种。在开发PKI程序时所使用的由各个公司编写的API也算是PKI的相关规范。

PKI的组成要素主要分三种:

用户:使用PKI通信的人或主机

认证机构:颁发证书的结构

仓库:保存证书的数据库

用户需要将自己的公钥交给CA来获取相应的证书,根据需要申请作废已拥有的证书;

CA在生成证书前需要对用户进行身份验证,生成并颁发证书,作废证书;

仓库是存放证书的数据库,在用户需要的时候可以从中后去证书。

证书的层级结构

为了保证根证书的密钥绝对不可访问,会使用中间证书作为代理,所以证书会有层级结构。

Intermediate certificates are used as a stand-in for our root certificate. We use intermediate certificates as a proxy because we must keep our root certificate behind numerous layers of security, ensuring its keys are absolutely inaccessible.

PKI体系中,下一级CA的证书由上一级CA颁发,用户如果信任某一个CA,则信任此CA颁发的下一级证书。对于根CA,由于不存在级别比自己还高的CA,所以根CA的证书是自签名的。

例如阿里云的证书:

密码学和HTTPS

查看中间证书信息:

密码学和HTTPS

查看根证书:

密码学和HTTPS

随机数

对称加密需要使用秘钥,而秘钥一定要具备不容易被推测出来的特质。随机数是天然最好的秘钥。

随机数的性质:

随机性:不存在统计学偏差,是完全杂乱的数列;

不可预测性:不能从过去的数列推测出下一个出现的数;

不可重现性:除非将数列本身保存下来,否则不能重现相同的数列。

这三种随机数的不可预测性逐级增加,分别为弱伪随机数,强伪随机数,真随机数,仅靠软件是无法生成真随机数的。

混合密码系统

公钥密码可以解决秘钥配送问题,但是公钥密码处理速度远低于对称密码,混合密码系统是将两种方式相结合的方法。

混合密码系统中会先用速度快的对称密码来对消息进行加密,这样消息就被转换为了密文,保证了消息的机密性。然后用公钥密码对对称密码的秘钥加密,由于对称密码的秘钥一般比消息本身的长度要短,因此公钥密码速度慢的问题就可以忽略了。

混合密码系统的加密过程:

密码学和HTTPS

混合密码的解密过程:

密码学和HTTPS

单向散列函数

单项散列函数能够保证数据的完整性。

单向散列函数有一个输入和一个输出,输入称为消息(message),输出称为散列值。单向散列函数可以根据消息的内容计算出散列值,而散列值就可以被用来检查消息的完整性。

消息不一定是文字,可以是图像、音视频等文件。散列值的长度和消息的长度无关,单向散列函数都会计算出固定长度的散列值。

单向散列函数需要具备的特点:

抗碰撞性:消息中哪怕有1bit的改变,也必须有很高的概率产生完全不同的散列值,如果单向散列函数计算出的散列值没有变化,那么消息很容易被篡改,无法用于消息完整性的检验。
         
         两个不同的消息产生相同的散列值的情况称为碰撞。好的单向散列函数一定要有非常高的抗碰撞性。

单向性:单向散列函数并不是加密函数,其单向性是指无法通过散列值反算出消息的性质。

单向散列函数的例子:MD4、MD5、SHA-1、SHA-256、SHA-384、SHA-512。

SSL/TLS

SSL/TLS是应用广泛的密码通信方法,它综合了对称密码、非对称密码、单向散列函数、伪随机数生成器以及消息认证码等多种安全技术。

SSL(Secure Socket Layer)指安全套接字协议,SSL3.0存在POODLE攻击漏洞,目前一般使用其延续版TLS。SSL/TLS承载了HTTP协议之后就是HTTPS。

TLS握手协议

握手协议负责生成共享秘钥以及交换证书。其中生成共享秘钥是为了进行密码通信,交换证书是为了双方互相认证。

握手过程:

密码学和HTTPS

1. ClientHello(客户端->服务器)

客户端向服务器端发送ClientHello消息,包括:

可用的版本号

当前时间

客户端随机数

会话ID

可用的密码套件清单

可用的压缩方式清单

客户端随机数是一个由客户端生成的不可预测的随机数,会话ID是当客户端和服务器希望使用之前建立的会话时所用的信息。

2. ServerHello(服务器->客户端)

对应客户端的ClientHello消息,服务器会返回一个ServerHello消息,包括:

使用的版本号

当前时间

服务器随机数

会话ID

使用的密码套件

使用的压缩方式

服务器根据客户端在ClientHello消息中的信息确定通信中使用的版本号、密码套件和压缩方式。

3. Certificate(服务器->客户端)

服务端发送Certificate消息,消息中包括服务器端的证书清单,首先发送的是服务器的证书,然后是其所有上级认证机构的证书。

即发送了服务器端的证书链。

4. ServerKeyExchange(服务器->客户端)

当Certificate消息不足以满足需求时,服务器会通过ServerKeyExchange消息向客户端发送一些必要信息,具体所发送内容根据所使用的密码套件而有所不同。

当不需要这些信息时,将不会发送ServerKeyExchange消息。

5. CertificateRequest(服务器->客户端)

CertificateRequest用于服务器向客户端请求证书,这是为了进行客户端认证,通过这一消息,服务器会向客户端发送一下消息:

服务器能够理解的证书类型清单

服务器能够理解的认证机构名称清单

当不使用客户端认证时,不回发送CertificateRequest消息。

6. ServerHelloDone(服务器->客户端)

服务器发送ServerHelloDone表示从ServerHello开始的一系列消息的结束。

7. Certificate(客户端->服务器)

当服务器向客户端索要证书时,客户端会发送此消息,内容包括客户端的证书,服务器收到客户端证书后进行验证。
如果服务器未索要客户端证书,此消息不会被发送。

8. ClientKeyExchange(客户端->服务器)

客户端向服务器发送预备主密码,这个预备主密码是客户端生成的随机数,之后会被用作生成主密码的种子,这个值会使用服务器的公钥进行加密后发送给服务器。

根据预备主密码,服务器和客户单会计算出相同的主密码,然后再根据主密码生成下列比特序列:

对称密码的秘钥

消息认证码的秘钥

对称密码的CBC模式中使用的初始化向量
9. CertificateVerify(客户端->服务器)

客户端只有在服务器发送CertificateRequest消息时才会发送CertificateVerify消息。这个消息的目的是向服务器证明自己的确持有客户端证书的私钥。

为了实现这一目的,客户端会计算主密码和握手协议中传送的消息的散列值,并加上自己的数字签名后发送给服务器。

10. ChangeCipherSpec(客户端->服务器)

ChangeCipherSpec消息并不是握手协议的消息,而是密码规格变更协议的消息。在ChangeCipherSpec消息之前,客户端和服务器之间已经交换了所有关于密码套件的消息,因此在收到这一消息时,客户端和服务器会同时切换密码。

在这一消息之后,TLS就开始使用双方协商决定的密码通信方式了。

11. Finished(客户端->服务器)

由于已经完成了密码切换,因此Finished消息时使用切换后的密码套件来发送的。

Finished消息的内容是固定的,因此服务器可以将受到的密文解密,来确认所收到的Finished消息是否正确。通过这一消息,就可以确认握手协议是否正常结束,密码套件的切换是否正确。

12. ChangeCipherSpec(服务器->客户端)

这是轮到服务器发送ChangeCipherSpec消息了,表示服务器要切换密码了。

13. Finished(服务器->客户端)

和客户端一样,服务器也会发送Finished消息。

14. 切换至应用数据协议

在此之后,客户端和服务器会使用TLS进行密码通信。

从结果看来,握手协议完成了下列操作:

客户端厚的了服务器的合法公钥,完成了服务器认证;

服务器获得了客户端的合法公钥,完成了客户端认证(当需要客户端认证时);

客户端和服务器生成了密码通信中使用的共享秘钥;

客户端和服务器生成了消息认证码中使用的共享秘钥。

本文关于密码学知识参考自《图解密码学》,推荐

上一篇:关于ShapeDrawable应用的一些介绍(上)


下一篇:Oracle主库归档丢失,备库日志有gap,在不重建备库的情况下,恢复备库