🌠 作者:@阿亮joy.
🎆专栏:《学会Linux》
🎇 座右铭:每个优秀的人都有一段沉默的时光,那段时光是付出了很多努力却得不到结果的日子,我们把它叫做扎根
目录
- 👉基础概念👈
- 什么是HTTPS协议
- 什么是加密
- 为什么要加密
- 常见的加密方式
- 数据摘要和数据指纹
- 数字签名
- 👉HTTPS的工作过程探究👈
- 方案1:只使用对称加密
- 方案2:只使用非对称加密
- 方案3:双方都使用非对称加密
- 方案4:非对称加密+对称加密
- 中间人攻击
- 引入证书
- 非对称加密+对称加密+证书认证
- 如何成为中间人
- 完整流程
- 👉总结👈
👉基础概念👈
什么是HTTPS协议
HTTP 协议内容都是按照文本的方式明文传输的,这就导致在传输过程中出现⼀些被篡改的情况。很明显,这是不安全的,所以引入了 HTTPS 协议来解决这个问题。
HTTPS(Hyper Text Transfer Protocol Secure)是 HTTP 协议的一种安全版本,通过使用 SSL 或 TLS 协议对 HTTP 协议的通信进行加密,从而保证通信的安全性。
注:什么是安全呢?安全就是破解的成本远远大于破解的收益。
什么是加密
加密就是把明文(要传输的信息)进行⼀系列变换,生成密文。解密就是把密文再进行⼀系列变换,还原成明文。在这个加密和解密的过程中,往往需要⼀个或者多个中间的数据,辅助进行这个过程,这样的数据称为密钥。
加密解密到如今已经发展成⼀个独立的学科:密码学。而密码学的奠基人,也正是计算机科学的祖师爷之一,艾伦·麦席森·图灵。
关于图灵大佬的简介:
为什么要加密
运营商劫持是指网络运营商(例如电信、联通、移动等)通过技术手段修改用户的网络流量,从而使用户的访问请求被重定向到其他网站或者被修改。这种行为通常是为了广告投放、监控用户行为或者政治审查等目的。
运营商劫持的方式有很多种,最常见的是 DNS 劫持和 HTTP 劫持。DNS 劫持指的是运营商篡改 DNS 服务器的解析结果,将用户请求的域名解析到错误的 IP 地址,从而达到劫持的效果。HTTP 劫持则是通过拦截用户的 HTTP 请求包,修改其中的内容或者插入广告等信息,再将请求转发到服务器上。
现在我们来讨论一下 HTTP 劫持,假设我想要下载一个天天动听,未被劫持的效果,点击下载,就会弹出天天动听的下载链接。如下图所示:
已被劫持的效果,点击下载按钮,就会弹出QQ浏览器的下载链接。
由于我们通过网络传输的任何的数据包都会经过运营商的网络设备(路由器、交换机等),那么运营商的网络设备就可以解析出你传输的数据内容,并进行篡改。
点击 “下载按钮”,其实就是在给服务器发送了⼀个 HTTP 请求,获取到的 HTTP 响应其实就包含了该 APP 的下载链接。运营商劫持之后,就发现这个请求是要下载天天动听,那么就自动的把交给用户的响应给篡改成 QQ浏览器 的下载地址了。
因为 HTTP 的内容是明文传输的,明文数据会经过路由器、WIFI 热点、通信服务运营商、代理服务器等多个物理节点,如果信息在传输过程中被劫持,传输的内容就完全暴露了。劫持者还可以篡改传输的信息且不被双方察觉,这就是中间人攻击 ,所以我们才需要对信息进行加密。
不止运营商可以劫持,其他的黑客也可以用类似的手段进行劫持,来窃取用户的隐私信息或者篡改内容。所以在互联网上,采用明文传输是很危险的事情!!!HTTPS 就是在 HTTP 的基础上进行了加密,进⼀步的来保证用户的信息安全。
常见的加密方式
对称加密
- 采⽤单钥密码系统的加密方法,同⼀个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密,也称为单密钥加密,特征:加密和解密所用的密钥是相同的。
- 常见对称加密算法(了解):DES、3DES、AES、TDEA、Blowfish、RC2等。
- 特点:算法公开、计算量小、加密速度快、加密效率高。
对称加密其实就是通过同⼀个密钥,由发送方和接收方共享的。用这个秘钥就可以把明文加密成密文,并且也能把密文解密成明文。因此只要知道了对称密钥,就可以轻松地解密加密的数据。缺点是密钥的分发比较困难,容易被攻击者获取密钥从而破解数据。
⼀个简单的对称加密:按位异或
非对称加密
- 需要两个密钥来进行加密和解密,这两个密钥是公开密钥(public key,简称公钥)和私有密钥(private key,简称私钥)。
- 常见非对称加密算法(了解):RSA,DSA,ECDSA
- 特点:算法强度复杂、安全性依赖于算法与密钥。但是由于其算法复杂,而使得加密解密速度没有对称加密解密的速度快;而其优点是密钥的分发和管理比较容易。
非对称加密使用一对密钥来加密和解密数据,公钥是公开的,任何人都可以获取,用来加密数据;私钥只有接收方才有,用来解密数据。
公钥和私钥是配对的,最大的缺点就是运算速度非常慢,比对称加密要慢很多。
- 通过公钥对明文加密,变成密文
- 通过私钥对密文解密,变成明文
也可以反着用
- 通过私钥对明文加密,变成密文
- 通过公钥对密文解密,变成明文
数据摘要和数据指纹
数据摘要和数据指纹都是用于数据完整性验证的技术,通常应用于数据传输和存储等场景。
数据摘要(Message Digest)是将任意长度的消息(message)通过一个单向的、不可逆的函数,变换成固定长度的摘要(digest)的过程。常见的数据摘要算法有 MD5、SHA-1、SHA-256 等,这些算法在输入数据不同的情况下会生成不同的固定长度的输出值,输出值也称为摘要值。因为数据摘要算法是单向的,所以无法从摘要值反推出原始数据,因此数据摘要算法可以用于数据的完整性验证。
数据指纹(Digital Fingerprint)也是一种数据完整性验证技术,常用于文件的完整性验证。数据指纹的生成过程是将文件的内容按照一定的算法生成一个唯一的、不可篡改的指纹值,也称为哈希值(hash value)。与数据摘要不同的是,数据指纹是对文件整体进行哈希运算,生成的指纹值可以用于验证文件的完整性。
数据摘要、数据指纹和加密算法的区别是,摘要和指纹严格意义不是加密,因为没有解密。只不过从摘要和指纹很难反推原始信息,通常用来进行数据对比,判断数据有没有被篡改。
注:两个不同的信息算出的摘要值可能相同,但是概率非常低。数据摘要和数据指纹都是用于验证数据完整性的技术,但数据指纹更多用于文件完整性验证,而数据摘要可以应用于更广泛的场景中,例如密码存储、数字签名等。
数据摘要和数据指纹的应用场景
数字签名
数字签名是一种加密技术,用于验证数据的完整性和身份认证。数字签名可以用来验证文件、文本、电子邮件和其他数据的来源和完整性,以确定它是否已被篡改或损坏。
数字签名基于公钥加密技术和哈希函数。发送方使用哈希函数对数据进行处理,生成摘要,并使用自己的私钥对摘要进行加密,这就形成了数字签名。接收方收到数据和数字签名后,使用发送方的公钥对数字签名进行解密,并使用同样的哈希函数处理数据,生成一个新的摘要。然后将这个新的摘要与数字签名中的摘要进行比较,如果两个摘要匹配,则可以确定数据的完整性和身份认证。
数字签名的应用非常广泛,例如在网上银行、电子邮件和电子商务中,数字签名可以用来保护敏感信息和交易的安全性。
👉HTTPS的工作过程探究👈
既然要保证数据安全,就需要加密。往络传输中不再直接传输明文了,而是加密后的密文。加密的放式有很多,但是整体可以分成两大类:对称加密和非对称加密。
方案1:只使用对称加密
如果通信双方都各自持有同⼀个密钥 X,且没有别人知道,这两方的通信安全当然是可以被保证的(除非密钥被破解)。
引入对称加密之后,即使数据被截获也没有任何影响。由于黑客不知道密钥是啥,因此就无法对密文进行解密,也就无法知道请求的真实内容是啥了。
但事情并没有这么简单,服务器同⼀时刻其实是给很多客户端提供服务的。这么多客户端,每个客户端的秘钥都必须是不同的(如果是相同的密钥就太容易扩散了,黑客就也能拿到了)。因此服务器就需要维护每个客户端和每个密钥之间的关联关系,这也是一件比较麻烦的事。
比较理想的做法就是能在客户端和服务器建立连接的时候,双放协商确定这次通信的密钥是啥。
但是如果直接把密钥明文传输,那么黑客也就能获得密钥了,此时后续的加密操作就形同虚设了。因此密钥的传输也必须加密传输!!!
但是要想对密钥进行对称加密,就仍然需要先协商确定⼀个 “密钥的密钥”,这就成了先有鸡还是先有蛋的问题了,此时密钥的传输再用对称加密就行不通了。
方案2:只使用非对称加密
鉴于非对称加密的机制,如果服务器先把公钥以明文方式传输给浏览器,之后浏览器向服务器传数据前都先用这个公钥加密好再传,从客户端到服务器信道似乎是安全的,因为只有服务器有相应的私钥能解开公钥加密的数据。
但是服务器到浏览器的这条路怎么保障安全?如果服务器用它的私钥加密数据传给浏览器,那么浏览器用公钥可以解密它。而这个公钥是⼀开始通过明文传输给浏览器的,若这个公钥被中间⼈劫持到了,那他也能用该公钥解密服务器传来的信息了。
只使用非对称加密的方式只能保证数据从客户端到服务端的安全,无法保证数据从服务端到客户端的安全。
方案3:双方都使用非对称加密
- 服务端拥有公钥 S 与对应的私钥 S’,客户端拥有公钥 C 与对应的私钥 C’
- 客户和服务端交换公钥
- 客户端给服务端发信息:先用 S 对数据加密再发送,只能由服务器解密,因为只有服务器有私钥 S’
- 服务端给客户端发信息:先用 C 对数据加密再发送,只能由客户端解密,因为只有客⼾端有私钥 C’
以上的加密方式似乎可以,但存在效率太低和安全的问题。
方案4:非对称加密+对称加密
采用非对称加密 + 对称加密的方式可以解决双方都采用采用非对称加密的效率低问题。
- 服务端具有公钥 S 和私钥 S’
- 客户端发起请求,获取服务端公钥S
- 客户端在本地生成对称密钥 C,通过公钥 S 加密后发送给服务器
- 由于中间的网络设备没有私钥,即使截获了数据,也无法还原出内部的原文,也就无法获取到对称密钥
- 服务器通过私钥 S’ 解密,还原出客户端发送的对称密钥 C,并且使用这个对称密钥加密给客户端返回的响应数据
- 后续客户端和服务器的通信都只用对称加密即可,由于该密钥只有客户端和服务器两个主机知道,其他主机或设备不知道密钥即使截获数据也没有意义
由于对称加密的效率比非对称加密高很多,因此只是在开始阶段协商密钥的时候使用非对称加密,后续的传输仍然使用对称加密。
虽然非对称加密 + 对称加密的方式已经比较接近答案了,但是依旧有安全问题。方案 2,方案 3,方案 4都存在⼀个问题:如果最开始,中间人就已经开始攻击了呢?
中间人攻击
中间人攻击是一种常见的网络安全攻击,也称为 MITM 攻击(Man-In-The-Middle Attack)。该攻击利用了网络通信中的弱点,将通信的两端之间的数据流量在中途拦截,以获取敏感信息或篡改通信内容。
具体来说,中间人攻击的过程通常包括以下几个步骤:
-
欺骗双方:攻击者伪装成客户端或服务端,向另一方发送假数据或假身份信息,使对方误以为自己正在与合法的通信对象通信。
-
拦截通信:攻击者在客户端和服务端之间插入自己的设备或程序,拦截双方之间的通信,获取数据流量。
-
篡改内容:攻击者可以修改拦截到的数据流量,篡改通信内容或植入恶意软件,以达到控制双方通信的目的。
中间人攻击可以通过多种方式实施,如 ARP 欺骗、DNS 欺骗、Wi-Fi 劫持等。为了避免中间人攻击,通常需要采取一些安全措施,如使用加密通信协议、验证数字证书、使用安全的 Wi-Fi 网络等。
在方案 2 / 3 / 4 中,客户端获取到公钥 S 之后,对客户端形成的对称秘钥 X 用服务端给客户端的公钥 S 进行加密,中间人即使窃取到了数据,此时中间人确实无法解出客户端形成的密钥 X,因为只有服务器有私钥 S。
但是中间人的攻击,如果在最开始握手协商的时候就进行了,那就不一定了。
- 服务器具有非对称加密算法的公钥 S,私钥 S’
- 中间人具有非对称加密算法的公钥 M,私钥 M’
- 客户端向服务器发起请求,服务器明文传送公钥 S 给客户端
- 中间人劫持数据报文,提取公钥 S 并保存好,然后将被劫持报文中的公钥 S 替换成为自己的公钥 M,并将伪造报文发给客户端
- 客户端收到报文,提取公钥 M( 客户端当然不知道公钥被更换过了),自己形成对称秘钥 X,用公钥 M 加密 X形成报文发送给服务器
- 中间人将报文劫持后,直接用自己的私钥 M’ 进行解密,得到通信秘钥 X,再用曾经保存的服务端公钥 S 加密后,再将报文推送给服务器
- 服务器拿到报文,用自己的私钥 S’ 解密,得到通信秘钥 X
- 双方开始采用 X 进行对称加密和通行,但是一切都在中间人的掌握中,中间人劫持数据、进行窃听甚至修改都是可以的
上面的攻击放案,同样适用于方案 2 和方案 3。问题本质出在哪里了呢?中间人能够对数据进行篡改以及客户端无法确定收到的公钥就是目标服务器的公钥。
引入证书
CA 认证
CA(Certificate Authority)认证是指使用数字证书来证明身份的一种方式,由权威机构(CA 机构)颁发,主要用于保障通信的安全性和可靠性。
CA 机构会通过严格的身份验证流程来确定证书申请者的身份和资质,然后颁发数字证书给申请者。数字证书包含了证书申请者信息、申请者的公钥、数字签名、有效期等信息,CA 机构的数字签名保证了证书的真实性和完整性。在通信过程中,如果接收方需要验证对方的身份,可以通过使用对方的数字证书来验证其真实性,从而确保通信安全和可靠性。
CA 认证的优点是可以避免中间人攻击和假冒身份等问题,同时提高了通信的保密性和完整性。在互联网应用中,HTTPS 协议的通信安全机制就是基于 CA 认证实现的。
服务端在使用 HTTPS 前,需要向 CA 机构申请一份数字证书。申请成功后,服务器把证书传输给浏览器,浏览器从证书里获取公钥就行了。证书就如身份证,证明服务端公钥的权威性。
这个证书可以理解成是⼀个结构化的字符串,里面包含了这些信息:证书发布机构、证书有效期、公钥、证书所有者、签名等。
需要注意的是:申请证书的时候,需要在特定平台生成一对密钥,即公钥和私钥。这对密钥就是用来在网络通信中进行明文加密以及数字签名的。
其中公钥会随着 CSR 文件,⼀起发给 CA 机构进行权威认证,私钥服务端自己保留,用来后续进行通信(其实主要就是用来交换对称秘钥)。
CSR 在线生成工具
形成 CSR 之后,后续就是向 CA 机构进行申请认证。不过认证过程一般很繁琐,如果真的需要可以找证书申请服务商解决就行。
理解数据签名
数据摘要经过加密就能够得到数据签名,数据签名的形成是基于非对称加密算法的!
当服务端申请 CA 证书的时候,CA 机构会对该服务端进行审核,并专门为该网站形成数字签名,过程如下:
- CA 机构拥有非对称加密的私钥 A 和公钥 A’
- CA 机构对服务端申请的证书明文数据进行 hash,形成数据摘要
- 然后对数据摘要用 CA 私钥 A’ 加密,得到数字签名 S
服务端申请的证书明文和数字签名 S 共同组成了数字证书,这样一份数字证书就可以颁发给服务端了。
非对称加密+对称加密+证书认证
在客户端和服务器刚一建立连接的时候,服务器给客户端返回⼀个证书,证书包含了之前服务端的公钥,也包含了网站的身份信息。
客户端进行认证
- 当客户端获取到这个证书之后,会对证书进行校验(防止证书是伪造的)
- 判定证书的发布机构是否受信任(操作系统中已内置的受信任的证书发布机构)
- 验证证书是否被篡改:从系统中拿到该证书发布机构的公钥(公钥是内置的),对数字签名解密,得到⼀个哈希值(称为数据摘要),设为 hash1。然后计算整个证书的哈希值,设为 hash2。对比 hash1 和 hash2 是否相等,如果相等,则说明证书是没有被篡改过的。
中间人有没有可能篡改该证书?
- 中间人篡改了证书的明文
- 由于中间没有 CA 机构的私钥,所以无法 hash 之后用私钥加密形成签名,那么也就没法办法对篡改后的证书形成匹配的签名
- 如果强行篡改证书,客户端收到该证书后会发现明文和签名解密后的值不一致,则说明证书已被篡改。证书不可信,客户端从而终止向服务器传输信息,防止信息泄露给中间人
查看浏览器的受信任证书发布机构
Chrome 浏览器,点击右上角的三个点。选择 “设置”,搜索 “证书管理”,即可看到以下界面。(如果没有,在隐私设置和安全性->安全里面找找)
中间人整个掉包证书?
- 因为中间人没有 CA 私钥,所以无法制作假的证书
- 所以中间人只能向 CA 申请真证书,然后用自己申请的证书进行掉包
- 这个确实能做到证书的整体掉包,但是别忘记证书明文中包含了域名等服务端认证信息。如果整体掉包,客户端依旧能够识别出来
- 永远记住,中间人没有 CA 私钥,所以对任何证书都无法进行合法修改,包括自己的
为什么摘要内容在网络传输的时候一定要加密形成签名?
假设我们的证书只是一个简单的字符串 hello,对这个字符串计算 hash 值(比如md5),结果为 BC4B2A76B9719D91。
如果 hello 中有任意的字符被篡改了,比如变成了 hella,那么计算的 md5 值就会变化很大,为 BDBD6F9CF51F2FD8。
然后我们可以把这个字符串 hello 和 哈希值BC4B2A76B9719D91 从服务器返回给客户端,此时客户端如何验证 hello 是否是被篡改过?那么就只要计算字符串的哈希值,看看是不是 BC4B2A76B9719D91 即可。
但是还有个问题,如果黑客把 hello 篡改了,同时也把哈希值重新计算下,客户端就分辨不出来了。
所以被传输的哈希值不能传输明文,需要传输密文。
所以,对证书明文(这里就是字符串 hello) hash 形成散列摘要,然后 CA 机构使用自己的私钥加密形成签名,将
hello 和加密的签名合起来形成 CA 证书颁发给服务端。当客户端请求的时候,就发送给客户端,中间人截获了,因为没有 CA 私钥,就无法更改或者整体掉包,就能够证明证书的合法性。最后客户端通过操作系统里内置的证书发布机构的公钥进行解密,还原出原始的哈希值,再进行校验。
为什么签名不直接加密,而是要先 hash 形成摘要?
缩小签名明文的长度,加快数字签名的验证签名的运算速度。
如何成为中间人
-
ARP欺骗:通过伪造 ARP 协议的响应来欺骗网络上的其他设备,使得攻击者可以拦截、篡改、丢弃网络通信数据包,实现中间人攻击等行为。在局域网中,黑客经过收 ARP Request 广播包,能够偷听到其它节点的地址(IP、MAC)。黑客收到两个主机 A、B 的地址,告诉 B(受害者),自己是 A,使得 B 在发送给 A 的数据包都被黑客截取。
-
ICMP 攻击:由于 ICM P协议中有重定向的报文类型,那么我们就可以伪造一个 ICMP 信息然后发送给局域网中的客户端,并伪装自己是一个更好的路由通路,从而导致目标所有的上网流量都会发送到我们指定的接口上,达到和 ARP 欺骗同样的效果。
-
假 WIFI 攻击是指攻击者伪造一个 WIFI 热点,使得用户连接到该热点后,攻击者可以窃取用户的敏感信息,如账号密码等。
-
假网站攻击是指攻击者伪造一个与正规网站类似的网站,诱导用户在该网站上输入敏感信息,从而窃取用户的账号密码等敏感信息。
完整流程
左侧都是客户端做的事情,右侧都是服务器做的事情。
总结
HTTPS 工作过程中涉及到的密钥有三组
第一组(非对称加密):用于校验证书是否被篡改。服务器持有私钥(私钥在形成 CSR 文件与申请证书时获得),客户端持有公钥(操作系统内置了可信任的 CA 认证机构有哪些,同时持有对应的公钥)。服务器在客户端请求时,返回携带签名的证书,客户端通过这个公钥进行证书验证,保证证书的合法性,进一步保证证书中携带的服务端公钥权威性。
第二组(非对称加密):用于协商生成对称加密的密钥。客户端用收到的 CA 证书中的公钥(是可被信任的)给随机生成的对称加密的密钥加密,传输给服务器,服务器通过私钥解密获取到用于对称加密的密钥。
第三组(对称加密):客户端和服务器后续传输的数据都通过这个对称密钥加密解密。
其实一切的关键都是围绕这个对称加密的密钥,其他的机制都是辅助这个密钥工作的。
- 第一组非对称加密的密钥是为了让客户端拿到第二组非对称加密的公钥。
- 第二组非对称加密的密钥是为了让客户端把这个对称密钥传给服务器。
👉总结👈
本篇博客主要讲解了什么是HTTPS协议、什么是加密、为什么要加密、常见的加密方法、数据摘要、数据指纹、数字签名以及探讨了 HTTPS 的工作过程等等。以上就是本篇博客的全部内容了,如果大家觉得有收获的话,可以点个三连支持一下!谢谢大家啦!💖💝❣️