Hulk's Blog

文章
笔记

https如何做到加密通信的

5/17/2019 • ☕️ 3 min read

http的缺点

  1. 不能验证通信方的身份
  2. 通信使用明文进行传输,内容会被窃听
  3. 无法证明报文的完整性,有可能已被恶意篡改

被广泛使用的wireshark,它可以获取http请求和响应内容,并对其进行解析,如请求方法、响应码、响应报文等。

加密协议

http中没有加密机制,但可以通过SSL(secure socket layer,安全套接层)或TLS(transport layer security,安全传输协议)组合使用,加密http的通信内容。
用SSL建立安全的通信线路后,就可以在这条线路上进行http通信了,与SSL组合使用的http被称为https(HTTP secure 超文本传输安全协议)

加密算法

在搞懂SSL之前,需要明确两个加密算法,目前加密算法都是公开的,但密钥却是保密的,通过这种方式来保持加密算法的安全性。

共享密钥加密

加密和解密都使用同一个密钥的方式被称为共享密钥加密,也被叫做对称加密,但密钥的安全传递给对方是个问题,一旦密钥被攻击者截获,也就失去了加密的意义,单凭这一个算法无法解决问题,要是密钥能被安全传递,那么数据也该被安全传递。

公开密钥加密

公开密钥加密,也就是说加密时,采用对方的公开密钥进行加密,对方收到后,再用自己的私钥进行解密即可,也被称为非对称加密。利用这种方式,不用发送密钥,那么也不用担心被窃听者盗走了。
但安全的另一方面,就代表着要根据密钥和密文来解密是相当困难的,解密的过程就是对离散对数进行求值,这并非简单就能办到。

https采用混合加密机制

既然那个方法不一定安全,这个方法又很复杂,那么应该充分利用两者的优势,https就采用了两者混合的加密机制,在交换密钥环节用复杂、安全的公开密钥算法进行处理速度较快的共享密钥的传输,之后的报文再用安全传递的共享密钥的算法进行加密,很舒服。觉得设计真的挺巧妙的。

无法验证通信方的身份?

通过上面两个共享密钥和公开密钥的加密算法相结合,已经增强了http的安全性,但还没解决,验证通信方身份的问题,因为,无法验证公开密钥就是货真价实的,有可能在传输的途中就被攻击者替换掉了。这时就请来网站上经常能看到的证书来参与通信了,使用客户端与服务器双方都可信赖的数字证书认证机构颁发的公开密钥的证书。
首先,需要服务器方向数字证书认证机构提出公开密钥的申请。数字证书认证机构在判明提出申请者的身份之后,会对已申请的公开密钥做数字签名,然后分配这个已签名的公开密钥,并将该公开密钥放入公钥证书后绑定在一起。
服务器会将这份由数字证书认证机构颁发的公钥证书发送给客户端,以进行公开密钥加密方式通信。接到证书的客户端可使用数字证书认证机构的公开密钥,对那张证书上的数字签名进行验证。
一旦验证通过,客户端便可明确两件事:一,认证服务器的公开密钥的是真实有效的数字证书认证机构。二,服务器的公开密钥是值得信赖的。 此处认证机关的公开密钥必须安全地转交给客户端。使用通信方式时,如何安全转交是一件很困难的事,因此,多数浏览器会事先在内部植入常用认证机关的公开密钥。这样就解决了验证通信方身份的问题。

通信使用明文进行传输,内容会被窃听?

在解决无法确认通信方的身份的问题时提到了,使用共享加密(对称加密)方式,加密密文,如果共享密钥被安全的送达,那么报文的内容也就无从被获取了。

无法证明报文的完整性,有可能已被恶意篡改?

在https通信时,应用层会在发送数据时附加一种叫做MAC(Message authentication Code)的报文摘要,MAC能够查知报文是否遭到篡改,从而保护报文的完整性

https性能

https也存在着一些问题,当使用SSL加密通信时,它的处理速度会变慢,一种是通信变慢,一种是消耗大量的cpu,内存资源,导致处理速度变慢。针对https性能方面,目前没有根本性的解决方案,只有使用SSL加速器(专用服务器)硬件来改善该问题,仅在SSL处理时,提高数倍的SSL的计算速度,以分担负载。

合理的使用https

与http通信相比https会耗费很多的cpu及内存资源,如果滥用或者一直使用https通信,会浪费很多资源,平摊到一台计算机上时,能够处理的请求数量也会随之减少,还有加大购买证书的开销。因此,合理的使用http会节约资源,只有在涉及私人或敏感信息时,再使用https进行通信