通俗的理解HTTPS 通信原理
0x00 为什么要使用HTTPS
HTTP(HyperText Transfer Protocol:超文本传输协议)是一种用于分布式、协作式和超媒体信息系统的应用层协议。 简单来说就是一种发布和接收 HTML 页面的方法,被用于在 Web 浏览器和网站服务器之间传递信息。
HTTP 默认工作在 TCP 协议 80 端口,用户访问网站 http:// 打头的都是标准 HTTP 服务。
HTTP 协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此,HTTP协议不适合传输一些敏感信息,比如:信用卡号、密码等支付信息。
HTTPS(Hypertext Transfer Protocol Secure:超文本传输安全协议)是一种透过计算机网络进行安全通信的传输协议。HTTPS 经由 HTTP 进行通信,但利用 SSL/TLS 来加密数据包。HTTPS 开发的主要目的,是提供对网站服务器的身份认证,保护交换数据的隐私与完整性。
由于HTTP是明文传输的,无法保证数据传输的安全,因此HTTPS应运而生。HTTPS相较于HTTP的优势:
- 数据隐私性:SSL 协议能够在客户端和服务器之间建立起一个安全通道,所有消息都经过加密处理以后进行传输,网络中的非法黑客无法窃取。
- 数据完整性:SSL 利用密码算法和散列 (HASH) 函数,通过对传输信息特征值的提取来保证信息的完整性,确保要传输的信息全部到达目的地,可以避免服务器和客户端之间的信息受到破坏。
- 身份认证:利用证书技术和可信的第三方认证,可以让客户端和服务器相互识别对方的身份。
0x01 HTTPS 的蜕变
1.密码学基础
想要数据变得隐私,无非就是对数据在传输过程中进行加密,那么使用什么加密方法呢?
首先来了解一下密码学基础:
一个密码系统,通常简称为密码体制 (Cryptosystem) ,由五部分组成
明文空间M:它是全体明文的集合。
密文空间C:它是全体密文的集合。
密钥空间K:它是全体密钥的集合。其中每一个密钥 均由加密密钥 Ke 和解密密钥 Kd 组成,即 K=<Ke Kd >。
加密算法E:它是一族由 M到C 的加密变换。
解密算法D:它是一族由C到M 的解密变换。
根据密码体制分类可以分成对称密码体制、非对称密码体制
-
对称密码体制:加密与解密密钥相同,对称加密的特点是算法公开、加密和解密速度快,适合于对大数据量进行加密,常见的对称加密算法有DES、3DES、TDEA、Blowfish、RC5和IDEA。
加密过程:C = E(M,Ke )
解密过程:M = D(C,Kd ) Ke = Kd
-
非对称密码体制:加密密钥和解密密钥不同,密钥分为公钥与私钥,公钥对外公开, 私钥对外保密。被公钥加密过的密文只能私钥解,被私钥加密过的密文自能公钥解。非对称加密的缺点是加密和解密花费时间长、速度慢,只适合对少量数据进行加密。在非对称加密中使用的主要算法有:RSA、Elgamal、Rabin、D-H、ECC等。
当公钥加密时 加密解密过程:
C = E(M,Kp) M = D(C,Ks)
当私钥加密时 加密解密过程:
C‘ = E(M,Ks) M = D(C‘ ,Kp)
2.HTTPS实现隐私性
2.1 对称加密
现在由客户端C与服务器S之间在通信,怎么才能保证C和S之间传输的数据不被黑客监听?必要对数据加密,当使用对称加密时,加密解密都是使用同一个密钥,任何人都可以得到密钥,任何人都可以解密,及不存在安全性。
2.2 非对称加密
非对称加密方法,首先在服务器存放公钥Kp和私钥Ks 。
客户端和服务器通信过程:
- 客户端向服务端请请求获取公钥Kp
- 服务器将公钥Kp发送给客户端
- 客户端获得了公钥Kp,使用Kp加密数据传输给服务器。
紧接着服务器使用Ks加密获得明文,根据明文返回对应数据,问题来了,这时服务器应该使用什么方式传输给客户端呢?
尝试使用公钥 Kp加密数据肯定是不行的,因为客户端不知道私钥Ks,即无法解密。
那么尝试使用私钥Ks加密s数据呢?当让也是不行的,因为公钥Kp任何人都可以获取,表示任何人都可以解密。
从上面的看来非对称加密的方式也是不安全的,有没有一种更安全的方法呢?
2.3 对称加密+非对称加密
聪明的科研人员分析对称加密、非堆成加密的优缺点得到一个新的方案,使用非对称加密方式协商算法和临时密钥,再用对称加密方式传输数据。
客户端和服务器通信过程:
- 客户端向服务端请请求获取公钥Kp
- 服务器将公钥Kp发送给客户端
- 客户端随机生成一个随机数n使用公钥Kp加密得到N并发送给服务器
- 服务器使用私钥Ks解出协商密钥n,并向客户端回复收到密钥
- 使用对称加密方式(密钥n)加密传输数据
使用这两种加密体制相结合,看似无懈可击找不出任何漏洞了,但真的是这样吗?
中间人攻击:
黑客在客户端与服务器中之间伪造一对公钥密钥,分别冒充服务器和客户端以此欺骗双方。
- 客户端向服务端请请求获取公钥Kp1,黑客向服务端请请求获取公钥Kp
- 黑客将公钥Kp1发送给客户端,服务器将公钥Kp发送给黑客
- 客户端随机生成一个随机数n使用公钥Kp1加密得到N并发送给黑客;黑客将得到的密钥n使用公钥Kp加密成N’ 并发送给服务器
- 黑客向客户端发送 OK ,服务器向黑客发送 OK
- 客服端和黑客之间正式进行对称加密方式数据传输;黑客和服务器之间正式进行对称加密方式数据传输
很显然,对称加密和非对称加密结合的方式依旧不安全。要怎样才能修复这一漏洞?
2.4 证书颁发机构(CA)与数字证书 引入
证书颁发机构(CA, Certificate Authority)即颁发数字证书的机构。是负责发放和管理数字证书的权威机构,并作为电子商务交易中受信任的第三方,承担公钥体系中公钥的合法性检验的责任。
**数字证书 **为实现双方安全通信提供了电子认证。在因特网、公司内部网或外部网中,使用数字证书实现身份识别和电子信息加密。数字证书中含有公钥对所有者的识别信息,通过验证识别信息的真伪实现对证书持有者身份的认证。
数字签名 用于证明SSL证书是由受信任的证书颁发机构颁发的
数字证书认证机构业务流程:
- 服务器运营向第三方CA机构提交公钥、组织信息、域名信息等信息并申请认证。
- CA机构验证信息的真实性,组织或企业的合法性
- 审核通过,CA向申请者签发认证文件——证书。证书包括:申请者公钥、申请个组织信息、签发机构CA的信息、有效时间、证书序列号、签名算法等信息的明文,同时包含一个签名。签名的生成:首先,使用散列函数计算公开明文信息摘要,然后,采用CA的密钥对摘要信息加密,得到的密文即为签名。
- 客户端向服务器发出请求,服务器返回证书文件
- 客户端读取证书文件中的明文信息,采用相同的散列函数计算摘要,然后使用CA的公钥(内置浏览器或操作系统)解密签名数据,对比证书明文摘要,如果一致,则可以确认证书的合法性。
- 客户端还会验证证书相关的域名信息、有效时间等信息,客户端会内置信任CA的证书信息(包含公钥),如果CA不被信任,则找不到对应 CA的证书,证书也会被判定非法。
数字证书签名和验证 图片来源:数字证书是什么 - shuwoom的博客
2.5 HTTPS 工作流程
https工作流程:
- 客户端向服务器发起请求
- 服务器向客户端返回证书
- 客户端验证证书的合法性, 确认合法后,生成随机密钥k,使用证书中的公钥Kp加密为K,发送给服务器
- 服务器确认协商密钥k
- 双方使用协商好的算法可密钥k进行数据传输
总结:
想要保证HTTPS通信安全,需要使用对称加密、非对称加密、散列函数、CA认证。