Linux之Https协议原理
- 一.Https协议的概念
- 二.常见的加密方法
- 三.数据摘要(数字指纹)
- 四.Https协议加密方法的逐渐完善
- 4.1使用对称或者非对称加密
- 4.2增加CA证书
一.Https协议的概念
Https协议是基于Http协议延申出的一种应用层协议,其原理就是在Http协议的的基础上加了一层保密层。
我们使用Http协议传输时都是以文本的形式传输的,无论什么信息都是光明正大的写在上面这就导致一些人去篡改文本的内容从而产生错误或者造成用户的隐私安全问题。
Https协议的保密手段就是加密,那么什么是加密和解密呢?简单来说加密就是将明文也就是我们要传输的信息转换为密文也就是别人看不懂的信息,解密就是将密文转换为明文。而在加密和解密的过程中通常我们还需要使用一个或者多个数据来辅助进行这个过程,这样的数据就叫做密钥。
我们说Http协议是以文本的形式传输的所以需要加密,那么别人该如何知道文本的内容呢?也就是 说为什么需要加密呢?
我们都知道我们国家有三大运营商:电信,移动和联通。所以我们发送的信息会先以数据的形式传输到运营商的手上再传输到对方的手上。那么如果运营商想要对我们的数据做手脚我们岂不是丝毫不知毕竟我们通过http协议发送的数据都是以文本的形式,这就造成了运营商劫持事件。如今我们很少见到运营商劫持的情况发送但是在我们国家互联网刚刚发展的那段时间这种事件是屡见不鲜的。就比如我们想要在网上下载一个软件时正常的流程应该是我们用户发起http请求后运营商接收后再像软件公司的服务器提交请求,之后服务器会把数据返回给运营商再由运营商发送给我们。但是某些运营商就会篡改服务器返回的数据从而导致我们下载成了其他的软件等等。
并且不止有运营商有这种能力篡改我们的数据有些黑客也可以直接偷到你像服务器发送的数据以及服务器发送给你的数据。所以加密的事情是刻不容缓的。
二.常见的加密方法
Https协议中常见的加密方法有两种:对称加密和非对称加密
-
对称加密
采用单密钥的加密方法,同一个密钥可以进行信息的加密和解密。
特征:加密和解密用的都是同一把密钥类似于我们利用异或进行加密:将明文异或成密文再将密文异或成明文,异或就是密钥。
常见的对称算法:DES、3DES、AES、TDEA、Blowfish、RC2 等
特点:算法公开、计算量⼩、加密速度快、加密效率⾼ -
非对称加密
采用双密钥的加密方法,两个密钥分别是公开密钥和私有密钥
特征:公钥和私钥是配对的,可以用公钥加密私钥解密也可以用私钥加密公钥解密
常见的非对称算法:RSA,DSA,ECDSA
特点:算法强度复杂、安全性依赖于算法与密钥
缺点:运算速度非常的慢
三.数据摘要(数字指纹)
数据摘要(数字指纹),其基本原理是利用单向散列函数(Hash 函数)对信息进行运算, 生成一串固定⻓度的数据摘要。数据摘要并不是一种加密机制,但可以用来判断数据有没有被篡改以及判断两份数据是否相同。
因为生成的数据摘要基本是独一无二的所以只要原始数据有一点变动都会造成利用单向散列函数产生的摘要和原本的摘要不一样。
摘要常见算法:有 MD5、SHA1、SHA256、SHA512 等
特征:和加密算法的区别是,摘要严格意义不是加密,因为没有解密,只不过从摘要很难反推原信息,通常用来进行数据对比。
四.Https协议加密方法的逐渐完善
4.1使用对称或者非对称加密
在我们了解了两种加密方法后大家能不能想出一个方法来让黑客也就是中间人无法得到我们的数据呢?
是只使用对称加密还是只使用非对称加密又或者使用对称加非对称加密的方法?我们一个一个的来试然后再找出问题再进行改进。
-
只使用对称加密
如果通信双方都已经知道了密钥是什么那么这种方法就是万无一失除非中间人能把密钥给破解了。
因为客户端和服务器传输的都是通过密钥加密过的密文。
但是这种形式过于理想化因为服务器不可能只服务给你一个人,服务器需要对接的客户端有很多每个客户端的密钥还不一样所以正常情况下需要客户端和服务器商量一下用哪个密钥也就需要客户端把密钥传输给服务器。但是密钥又只能明文传输也就会被中间人获取从而导致满盘皆输,三方都有密钥了。
-
只用非对称加密
因为非对称加密的密钥分为私钥和公钥,那么只要服务器把公钥传给客户端那么之后客户端发送给服务器的信息就是保密的因为只要客户端用公钥加密明文那么就只有客户端的私钥才能解密,而中间人并没有私钥。但是服务器发送给客户端的信息就无法保证保密了因为客户端和中间人都有公钥可以解密用私钥加密的明文。
-
双方都用非对称加密
这样一来客户端和服务器就都各有一个公钥和一个私钥了,那么只要客户端和服务器互相交换公钥那么他们互相发送的消息不就只有自己的私钥才能解密了吗?
这样貌似就万无一失了但是我们刚刚说过非对称加密的运算速度非常慢更何况这里使用了两个非对称加密就更加慢了不仅如此这个方法仍然存在与方案二一样的漏洞。 -
使用对称加非对称加密
既然两个非对称加密的运算速度过慢那么我们试试用非对称加对称加密,这时服务器有公钥和私钥,我们只需要让服务器把公钥传给客户端随后客户端再在本地生成对称密钥,之后客户端再用公钥将对称密钥加密传输给服务器因为对称密钥被公钥加密所以只有服务器的私钥可以解密而中间人拿不到对称密钥,所以之后服务器和客户端只要用对称密钥通信即可。
这个方法似乎更好,不仅加快了运算速度还完成了保密。但是我想告诉大家的是它和上面两个方法都有着相同的隐患。
有聪明的加密方法那么自然也会有聪明的中间人,就以第四个方法为例。中间人只需要自己创建一个公钥M和密钥M‘,当服务器向客户端传输公钥S的时候将其拦截下来并替换成它的公钥M。这样在客户端利用公钥M将对称密钥C加密传输给服务器的途中再次将其拦截,并且使用自己的私钥M’解密得出对称密钥C,然后用第一次拦截得到的公钥S加密对称密钥C发送给服务器,服务器使用私钥S‘解密后就以为自己得到了对称密钥C。服务器和客户端就会觉得自己的传输毫无问题根本不会察觉到中间人也拥有了对称密钥C,所以在服务器和客户端之后用对称密钥C加密传输数据时中间人也可以轻而易举的得到数据。
这种方法也可以针对方案2和方案3,所以只使用对称加密和非对称加密是不可能完成真正的加密的。所以我们还需要利用其他的东西来完善我们的方案!
4.2增加CA证书
其实方案4已经非常的完善了我们可以思考一下方案4欠缺的是哪一点,其实就是客户端无法判断接收到的公钥是服务器的公钥还是中间人的公钥也就是无法判断公钥的合法性。中间人和公司的区别是什么:一个在明面一个在暗面,一个可以正儿八经出现一个只能藏起来。所以我们只需要创建一个只有公司能办中间人办不了的独一无二的数据并且将其加入到传输的公钥里,这样客户端只要看这个独一无二的数据就可以判断这到底是不是公司的服务器发出的公钥了。而这个独一无二的数据就是CA证书。
CA(Certificate Authority,证书授权)是由认证机构服务者签发,是数字签名的技术基础保障,也是网上实体身份的证明,能够证明某一实体的身份及其公钥的合法性,证明该实体与公钥二者之间的匹配关系。
这是我从百度百科中截取的对CA证书的解释从这段解释中我们也能发现CA证书最大的作用就是证明公钥的合法性以及将公钥和实体之间进行匹配。那么CA证书是如何做到这件事情的呢?
我们先来看看CA证书为什么是公司可以中间人不可以的。首先公司想要申请CA证书就必须把自己的公钥和私钥,域名真实姓名等等数据提交给CA公司,光这一点就够中间人喝一壶因为中间人是做着违法犯罪的事情怎么可能把自己的真实信息提交给CA公司就算他胆量够大真的提交了。在提交之后CA公司会对你的公司进行审核从而判断你是否有资格申请CA证书。而这个审核的手段包括但不限于查询你公司是否偷税纳税公司的规模甚至会去到公司进行实地考察,而这一条就是对中间人基于现实最无法做到的事情。更何况还有后手,在审核完成后CA公司会发放证书而证书中会包含一项数字签名,这个数字签名需要后面我们仔细研究现在我们先把流程走完。之后服务器在发送公钥时会把证书也发送过去而客户端只需要验证证书的真假即可完成密钥的协商。
这就是CA证书申请和使用的全过程,光申请证书就需要中间人有自己的公司可以把真实信息上传并且可以经受得住审核。
而且证书真正的厉害之处还没有体现,我们来更加深入的了解CA证书中包含了哪些东西
我们首先来关注一下数字签名,从图中我们可以看出数字签名其实就是把公钥经过单向散列函数计算出的数据摘要再通过CA公司的私钥加密后形成的一串数字。虽然只是一串数字却是经过了两项措施:单向散列函数形成基本上独一无二的数字,用CA公司的私钥将数字再次加密。
而这串签名则会和CA审核通过后颁发的证书一起形成一个带有数字签名的数据。
当服务器将数据发送给客户端后客户端可以将其拆分为两部分:数据,签名。首先数据我们再次通过单向散列函数生成一个散列值,其次用证书中附带的CA公司的公钥把签名解密形成另外一个散列值,只要我们把两个散列值对比一下就知道数据是否被篡改。
那么如果中间人想要篡改的话他需要干什么呢?
- 只改数据
导致数据通过散列函数形成的散列值与签名解密后的散列值不同,所以数字签名无效数据也无效。 - 只改签名
就不论可行性这样做就根本没有意义,你都不改数据你还算啥篡改啊。其次你修改了签名也会导致散列值不同从而数字签名无效数据也无效。 - 同时更改数据和签名
中间人如果想要同时更改数据和签名他就必须保证他也有一本证书这样他才能把数据换成自己证书的数据再使用自己证书中的CA公司的公钥解密签名再将其换成自己的签名。这样才能让数据和签名的散列值相同,但是我们要知道CA证书中是会存放域名的也就是IP地址,中间人把数据更换了也就是把域名也换成自己的了这样客户端只要和与自己想要访问的服务器的域名一对比就会发现域名不同也就导致了数据无效。
所以这是一个无解的方法,除非你可以直接破解CA公司的私钥这样你就可以伪造一个数字签名出来。但是为什么这个方法具有权威性那就是因为大家都知道这件事是不可能的这件事是有国家背书的。
那么我们来总结一下CA证书是如何进行保密的,一共可以分为三方面
- 现实中的中间人大多不敢暴露自己的真实信息也没有可以通过审核的公司
- 没有人可以破解CA公司的私钥,所以CA公司的数字签名具有唯一性中间人想要更换数据就必须更换签名
- 客户端的验证方法不止是判断两个散列值是否相同,还会判断域名是否相同这也就导致了就算中间人有自己的证书但是域名不同所以无法通过判断。