超文本传输安全协议(Hyper Text Transfer Protocol over Secure Socket Layer,HTTPS),是一种通过计算机网络进行安全通信的传输协议。HTTPS 经由 HTTP 进行通信,但利用 SSL / TLS 来加密数据包。HTTPS 开发的主要目的,是提供对网站服务器的身份认证,保护交换数据的隐私与完整性。
HTTPS = HTTP + SSL(加密 + 认证 + 完整性保护)
HTTP 协议采用明文传输信息,存在信息窃听、信息篡改和信息劫持的风险,而协议 SSL / TLS 具有身份验证、信息加密和完整性校验的功能,可以避免此类问题发生。
SSL / TLS 全称安全传输层协议 Transport Layer Security,是介于 TCP 和 HTTP 之间的一层安全协议,不影响原有的 TCP 协议和 HTTP 协议,所以使用 HTTPS 基本上不需要对 HTTP 页面进行太多的改造。
使用 HTTP 协议通信存在的问题:
窃听属于数据加密问题,而伪造和否认则属于身份认证问题。
对通信内容进行加密的解决方案:
MAC
密钥和密文组成的字符串的哈希值。能够解决 伪造
问题,但无法解决 否认
问题否认
问题中间人攻击
问题对称加密算法(Symmetric Key Algorithms)加密使用的密钥和解密使用的密钥是相同的。也就是说,加密和解密都是使用的同一个密钥。因此对称加密算法要保证安全性的话,密钥要做好保密,只能让使用的人知道,不能对外公开。
对称密钥加密一个很重要的特点就是使用相同的密钥进行加密和解密
假设 B 是没有解密钥匙,所以 A 需要通过互联网将钥匙发送给 B。
但是 X 也有可能看到并获取到这个钥匙,因此,X 也可以通过这个钥匙来解密密文。
上面这个场景就会引出一个新问题,这个问题被称为钥匙交付问题,那怎么解决这个问题?
为了解决上面的钥匙交付问题,我们这里引入一个新的方法 —— 非对称加密(Asymmetric Key Algorithms)
非对称加密过程
接收方 B 创建一个公钥和一个私钥,公钥被发送给 A。
在这个过程中:
公开密钥加密的问题
混合密钥加密分为两个步骤:
中间人攻击(Man In the Middle Attack)。
为了更好地理解公开密钥加密的可靠性问题,我们回到传递公钥的场景。
A 拿到的其实是 X 发送给他的伪造公钥,但是 A 无法察觉。
最后,X 用他自己的密钥加密响应数据,并发送给 A,就这样,虽然 A、B 双方能顺利完成通信,但是恶意的第三方 X 能看到解密后的请求数据和响应数据,而 A、B 双方则毫不知情。
中间人攻击的攻击方式:
潜在的中间人攻击威胁:
消息鉴别码(Message Authentication Code,简写 MAC)是一种用于确认消息完整性(数据不会被篡改)和可靠性(消息认证是确认消息来自正确的发送者)的技术。消息鉴别码可以理解为密钥和密文组成的字符串的哈希值。
消息鉴别码虽然可以解决伪造问题,但是仍然无法避免否认问题。
为了解决这个否认问题,我们接下来看看数字签名方法。
数据发送方通过约定的哈希函数从数据报文中生成报文摘要(Digest),然后利用私钥对报文摘要进行加密,这个加密后的摘要将作为报文的数字签名和数据报文一起发送给接收方。
数据接收方首先使用与发送方一致的哈希函数从接收到的原始报文中计算出报文摘要,接着再用发送方的公钥对数字签名进行解密,得出摘要。如果摘要相同,那么接收方就能确认该数字签名是发送方的。
虽然上面的方法已经能避免窃听、伪造、否认等问题,但是现在还是没办法避免中间人攻击,因为我们还是没办法验证公钥的所有者,因此我们需要数字证书系统来验证公钥的所有者。
接下来,先看看数字证书申请的过程,我们将数字证书认证机构(Certificate Authority)称之为 CA。
数字证书申请过程:
服务器方向第三方机构 CA 提交公钥、组织信息、个人信息(域名) 等信息并申请认证
CA 通过线上、线下等多种手段验证申请者提供信息的真实性,如组织是否存在、企业是否合法、是否拥有域名的所有权等
如信息审核通过,CA 会向申请者签发认证文件证书。证书包含以下信息:申请者公钥、申请者的组织和个人信息、签发机构 CA 的信息、有效时间、证书序列号等信息的明文,同时包含数字签名。
数字签名通过散列函数计算公开的明文信息的信息摘要,然后,采用 CA 提供的私钥对信息摘要进行加密,加密后的信息摘要即为数字签名
现在 B 已经申请到一个数字证书了,那么怎么使用数字证书来检验公钥 PB 是属于 B 呢。
数字证书校验流程:
客户端向服务端发送请求时,服务端返回数字证书文件
客户端读取证书中的相关的明文信息,采用与加密时相同的散列函数计算得到信息摘要,然后利用内置客户端中的受信任的 CA 公钥解密数字签名,对比证书的信息摘要
客户端验证证书相关的域名信息、有效时间等信息
现在可以验证 PB 是属于 B 的,但是怎么验证 PC 是属于受信任的 CA 的呢。
事实上,认证机构形成一个树形结构,高级别的权威机构为较低级别的机构创建证书,那就是说,如果要验证的话,就是一级一级向上认证,信任链条的最终是 Root CA,他采用自签名,对他的签名是无条件的信任。
HTTPS 在传输数据之前需要客户端(浏览器)与服务端之间进行一次握手,在握手过程中将确立双方加密传输数据的密码信息。TLS/SSL 协议使用非对称加密、对称加密以及 HASH 算法确保信息通信的安全。
具体流程:
Client Hello:客户端发起 HTTPS 请求。
Server Hello:服务端从客户端支持的加密规则中选用一组加密算法(包括用于生成通信密钥的算法),并随机生成密码串记为 Random2,后续将数据传回客户端。
Client Finish
enc_key = Func(Random1, Random2, Pre-Master)
(即消息鉴别码:即用于终端数据交互的对称密钥),并用证书中提供的服务端公钥加密该随机数Server Finish:使用私钥将信息解密取出密钥,使用密钥解密客户端发来的握手信息,并验证 HASH 是否与浏览器发来的一致
浏览器解密并计算握手信息的 Hash,如果与服务端发来的 Hash 一致,此时握手过程结束,之后所有的通信数据将由之前客户端生成的对称密钥并利用堆成加密算法进行加密
这里客户端与服务端互相发送加密的握手消息并验证,目的是为了保证双方都获得了一致的密码,并且可以正常的加密解密数据,为后续真正数据的传输做一次测试。
客户端取出提前内置在手机内部的认证机构的公钥
- Client Hello 包含域名的信息是比较特别的,因为域名是工作在应用层 HTTP 里的,而握手是发生在 TLS 还在传输层。在传输层里面就把域名信息告诉服务端,好让服务器根据域名发送相应的证书。
常见的散列函数 Hash 算法:MD5、SHA1、SHA256
散列函数特点是函数单向不可逆转、对输入非常敏感、输出长度固定,针对数据的任何修改都会改变散列函数的结果,用于防止信息篡改并验证数据的完整性。
在信息传递过程中,散列函数不能单独实现信息信息防篡改,因为明文传输,中间人可以修改信息之后重新计算信息摘要,因此需要对传输的信息以及信息摘要进行加密。
常见的对称加密算法:AES-CBC、DES、3DES、RC4
相同的密钥可以用于信息的加密和解密,掌握密钥才能获取信息,能够防止信息窃听,通信方式是 1 对 1。
对称加密的优势是信息传输 1 对 1,需要共享相同的密码,密码的安全是保证信息安全的基础,服务器和 N 个客户端通信,需要维持 N 个密码记录,且缺少修改密码的机制。
常见非对称加密算法:RSA、DSA / DSS
密钥成对出现,一般称为公钥(公开)和私钥(保密),公钥加密的信息只能私钥解开,私钥加密的信息只能公钥解开。因此掌握公钥的不同客户端之间不能互相解密信息,只能和掌握私钥的服务器进行加密通信,服务器可以实现 1 对 N 的通信,客户端也可以用来验证掌握私钥的服务器身份。
非对称加密的特点是 1 对多,服务器只需要维持一个私钥就能够和多个客户端进行加密通信,但服务器发出的信息能够被所有的客户端解密,且该算法的计算复杂,加密速度慢。
HTTP 协议和 HTTPS 协议的区别
区别 | HTTP | HTTPS |
---|---|---|
协议 | 运行在 TCP 之上,明文传输,客户端与服务端都无法验证通信双方的身份 | 基于 SSL 的 HTTP,运行于 SSL 之上,SSL 运行于 TCP 之上,是添加了加密和认证机制的 HTTP |
端口 | 80 | 443 |
资源消耗 | 较少 | 由于加密处理,会消耗更多 CPU 和内存资源 |
开销 | 无需证书 | 需要 CA 证书,而证书一般需要向认证机构购买 |
加密机制 | 无 | 共享密钥加密和公开密钥加密并用的混合加密机制 |
安全性 | 弱 | 由于加密机制,安全性强 |
HTTPS 主要作用