刚刚学完网络信息安全,随手整理了下有关https的安全原理。
一.为什么要用https
简单的说:Http + SSL(加密 + 认证 + 完整性保护,位于会话层) = Https。
传统的Http协议是一种应用层的传输协议,Http直接与TCP协议通信。
其本身存在一些缺点:
- Http协议使用明文传输,容易遭到窃听;
- Http对于通信双方都没有进行身份验证,通信的双方无法确认对方是否是伪装的客户端或者服务端;
- Http对于传输内容的完整性没有确认的办法,往往容易在传输过程中被劫持篡改。
因此,在一些需要保证安全性的场景下,比如涉及到银行账户的请求时,Http无法抵御这些攻击。 Https则可以通过增加的SSL\TLS,支持对于通信内容的加密,以及对通信双方的身份进行验证。
二.https加密原理
近代密码学中加密的方式主要有两类:
- 1)对称秘钥加密;
- 2)非对称秘钥加密。
对称秘钥加密是指加密与解密过程使用同一把秘钥。这种方式的优点是处理速度快,但是因为要经常更换密钥,如何安全的从一方将秘钥传递到通信的另一方是一个问题,而且对称密钥也很难识别另一方的身份。
非对称秘钥加密是指加密与解密使用两把不同的秘钥。这两把秘钥,一把叫公开秘钥,可以随意对外公开。一把叫私有秘钥,只用于本身持有。得到公开秘钥的客户端可以使用公开秘钥对传输内容进行加密,而只有私有秘钥持有者本身可以对公开秘钥加密的内容进行解密。这种方式克服了秘钥交换的问题,但是相对于对称秘钥加密的方式,处理速度较慢。
而另一方面,非对称加密时需要使用到接收方的公匙对消息进行加密,但是公匙不是保密的,任何人都可以拿到,中间人也可以。那么中间人可以做两件事,第一件是中间人可以在客户端与服务器交换公匙的时候,将客户端的公匙替换成自己的。这样服务器拿到的公匙将不是客户端的,而是服务器的。服务器也无法判断公匙来源的正确性。第二件是中间人可以不替换公匙,但是他可以截获客户端发来的消息,然后篡改,然后用服务器的公匙加密再发往服务器,服务器将收到错误的消息。
SSL\TLS的加密方式则是结合了两种加密方式的优点。首先采用非对称秘钥加密,将一个对称秘钥使用公开秘钥加密后传输到对方。对方使用私有秘钥解密,得到传输的对称秘钥。之后双方再使用对称秘钥进行通信。这样即解决了对称秘钥加密的秘钥传输问题,又利用了对称秘钥的高效率来进行通信内容的加密与解密。
三.https的认证
SSL\TLS采用的混合加密的方式还是存在一个问题,即怎么样确保用于加密的公开秘钥确实是所期望的服务器所分发的呢?也许在收到公开秘钥时,这个公开秘钥已经被别人篡改了。因此,我们还需要对这个秘钥进行认证的能力,以确保我们通信的对方是我们所期望的对象。
目前的做法是使用由数字证书认证机构颁发的公开秘钥证书。服务器的运营人员可以向认证机构提出公开秘钥申请。认证机构在审核之后,会将公开秘钥与共钥证书绑定。服务器就可以将这个共钥证书下发给客户端,客户端在收到证书后,使用认证机构的公开秘钥进行验证。一旦验证成功,即可知道这个秘钥是可以信任的秘钥。
具体过程如下:
在现实中,有一些专门的权威机构用来颁发数字证书,我们称这些机构为认证中心(CA Certificate Authority)。
我们(服务器)可以向这些CA来申请数字证书。
1.申请
- 1)自己本地先生成一对密匙,然后拿着自己的公匙以及其他信息(比如说企业名称啊什么的)去CA申请数字证书。
- 2)CA在拿到这些信息后,会选择一种单向Hash算法(比如说常见的MD5)对这些信息进行加密,加密之后的东西我们称之为摘要:
单向Hash算法有一种特点就是单向不可逆的,只要原始内容有一点变化,加密后的数据都将会是千差万别(当然也有很小的可能性会重复,有兴趣的小伙伴鸽巢原理了解一下),这样就防止了信息被篡改。 - 3)生成摘要后还不算完,CA还会用自己的私匙对摘要进行加密,摘要加密后的数据我们称之为数字签名。
- 4)最后,CA将会把我们的申请信息(包含服务器的公匙)和数字签名整合在一起,由此而生成数字证书。
- 5)然后CA将数字证书传递给我们。
2.认证
服务器在获取到数字证书后,服务器会将数字证书发送给客户端,客户端就需要用CA的公匙解密数字证书并验证数字证书的合法性。那我们如何能拿到CA的公匙呢?我们的电脑和浏览器中已经内置了一部分权威机构的根证书,这些根证书中包含了CA的公匙。
之所以是根证书,是因为现实生活中,认证中心是分层级的,也就是说有顶级认证中心,也有下面的各个子级的认证中心,是一个树状结构,计算机中内置的是最顶级机构的根证书,不过不用担心,根证书的公匙在子级也是适用的。
客户端用CA的公匙解密数字证书,如果解密成功则说明证书来源于合法的认证机构。解密成功后,客户端就拿到了摘要。
此时,客户端会按照和CA一样的Hash算法将申请信息生成一份摘要,并和解密出来的那份做对比,如果相同则说明内容完整,没有被篡改。最后,客户端安全的从证书中拿到服务器的公匙就可以和服务器进行安全的非对称加密通信了。服务器想获得客户端的公匙也可以通过相同方式。
最后说一句,客户端与服务端进行接口交互如果使用https有单向认证和双向认证两种。单向认证即客户端认证服务端,双向认证即服务端也认证客户端,多用于企业认证。
四.https加密流程
HTTPS 在内容传输的加密上使用的是对称加密,非对称加密只作用在证书验证阶段。
① 证书验证阶段(SSL四次握手):
- 1)浏览器发起SSL连接请求,并发送一个随机数(Client Random)和客户端支持的加密方法(如RSA),此时是明文传输;
- 2)服务端选择客户端所支持的加密方法并生成另一个随机数(Server Random),将HTTPS证书发给客户端,此时为明文传输;
- 3)客户端验证证书是否合法,如果不合法则提示告警。
② 数据传输阶段:
- 1)当证书验证合法后,在本地生成随机数(Premaster Secret);
- 2)通过公钥加密随机数,并把加密后的随机数传输到服务端,此时为密文传输;
- 3)服务端通过私钥对随机数进行解密;
- 4)服务端通过以上三个随机数构造对称加密算法,对返回结果内容进行加密后传输。
常见的非对称加密算法包括RSA,常见的密钥交换算法有Deffie-Hellman算法等
详情可参见RFC5246