当前位置: 首页 > 科技观察

一文看懂HTTPS及其背后的加密原理

时间:2023-03-12 06:39:05 科技观察

HTTPS(全称:HypertextTransferProtocolSecure,超文本传输??安全协议),是一种以安全为目标的HTTP通道,简单来说就是HTTP的安全版本.在本文中,我们将深入介绍其原理。1、为什么需要https使用https的原因其实很简单,因为http不安全。当我们向服务器发送比较隐私的数据(比如你的银行卡,身份证)的时候,如果我们使用http进行通信。那么安全就得不到保障了。首先,在数据传输过程中,数据可能会被中间人捕获,然后数据会被中间人窃取。其次,中间人获取数据后,中间人可以修改或替换数据,然后发送给服务器。最后,服务端收到数据后,无法判断数据是否被修改或替换。当然,如果服务端不能确定数据真的来自客户端。总结起来,HTTP存在三个缺点:无法保证消息的机密性无法保证消息的完整性和准确性无法保证消息来源的可靠性HTTPS就是为解决上述问题而诞生的。2、基本概念https为了解决http存在的问题,使用了一些加解密、数字证书、数字签名等技术。先介绍一下这些技术的基本概念:对称加密和非对称加密为了保证消息的机密性,需要进行加密和解密。目前主流的加解密算法分为对称加密和非对称加密。1).对称加密(共享密钥加密):客户端和服务器共享一个密钥来加密和解密消息。这种方法称为对称加密。客户端和服务器就加密密钥达成一致。客户端在发送消息之前使用这个密钥对消息进行加密,发送到服务器之后,服务器再使用这个密钥解密得到消息。对称加密的优点:对称加密解决了http中的消息机密性问题。对称加密的缺点:虽然对称加密保证了消息的机密性,但是由于客户端和服务端共享一个密钥,所以密钥特别容易泄露。由于密钥泄露风险高,难以保证来源的可靠性、消息的完整性和准确性。2)非对称加密(公钥加密):由于对称加密中密钥很容易泄露,我们可以采用非对称加密的方法来解决。使用非对称加密时,客户端和服务器端都有公钥和私钥。公钥可以对外公开,??而私钥只能自己看到。用公钥加密的消息只能用相应的私钥解密。相反,用私钥加密的消息只能用公钥解密。这样,客户端在发送消息之前,先用服务器的公钥加密消息,服务器收到后用自己的私钥解密。非对称加密的优点:非对称加密采用公钥和私钥的方式,解决了http中的消息保密问题,降低了私钥泄露的风险。由于公钥加密后的消息只有对应的私钥才能解开,消息的来源和消息的准确性和完整性得到了很大程度的保证。非对称加密的缺点:在非对称加密中,需要接收方的公钥来加密消息,但公钥是不保密的,任何人都可以获得,即使是中间人。那么中介可以做两件事。第一个是当客户端与服务器交换公钥时,中介可以用自己的公钥替换客户端的公钥。这样,服务端得到的公钥就不会属于客户端,而是属于服务端了。服务器无法判断公钥来源的正确性。第二件事是中间人不需要更换公钥,但是他可以截获客户端发送的消息,篡改,然后用服务器的公钥加密后再发送给服务器。服务器将收到不正确的消息。非对称加密的性能比对称加密慢数倍甚至数百倍,消耗系统资源。正因为如此,https结合了两种加密方式。数字证书和数字签名用于解决非对称加密中公钥来源的不安全问题。我们可以使用数字证书和数字签名来解决。1.申请数字证书在现实中,有一些专门机构负责颁发数字证书。我们称这些机构为CACertificateAuthority。我们(服务器)可以向这些CA申请数字证书。申请流程大致是这样的:先在本地生成一对密钥,然后带着自己的公钥和其他信息(比如公司名称)去CA申请数字证书。CA得到信息后,会选择一种单向Hash算法(比如常见的MD5)对信息进行加密,加密后的东西称为摘要。单向哈希算法的特点之一是它是单向不可逆的。只要原始内容稍有变化,加密后的数据就会有很大的不同(当然也有很小的可能会重复,有兴趣的朋友看看鸽巢原理。),从而防止信息不被篡改。摘要生成后,CA也会用自己的私钥对摘要进行加密。摘要的加密数据称为数字签名。最后,CA会将我们的申请信息(包括服务器的公钥)与数字签名结合起来生成数字证书。然后CA将数字证书传递给我们。2、数字证书是如何工作的服务器获得数字证书后,服务器会将数字证书发送给客户端,客户端需要使用CA的公钥对数字证书进行解密,验证数字证书的有效性.那我们怎么才能得到CA的公钥呢?我们的电脑和浏览器已经内置了一些权威机构的根证书,这些根证书包含了CA的公钥。之所以是根证书,是因为在现实生活中,认证中心是分等级的,也就是说有一个认证中心,下面还有分等级的认证中心,是树状结构。根证书,但是不用担心,根证书的公钥也适用于子级别。客户端使用CA的公钥对数字证书进行解密。如果解密成功,则说明证书来自合法的证书颁发机构。解密成功后,客户端得到摘要。此时客户端会根据与CA相同的Hash算法生成申请信息摘要,并与解密后的进行比对。如果相同,说明内容完整,没有被篡改。最后,客户端从证书中安全地获取服务器的公钥,通过安全的非对称加密与服务器进行通信。服务器端也可以用同样的方法获取客户端的公钥。下图形象地说明了一般的证书申请及其使用流程。1、https的原理通过上面的学习,我们了解了对称加密和非对称加密的特点、优缺点,以及数字证书的作用。https不是采用单一的技术来实现,而是根据这些技术的特点将这些技术充分融合,以最大限度地提高性能和安全性。这套综合技术称为SSL(SecureSocketLayer)。所以https并不是一个新的协议,它只是在http之上加了一个加密的shell。对于https的建立,首先看一下建立的流程图:这里,https的建立分为6个阶段,12个过程。下面将对这12个过程一一进行说明。1.客户端通过发送ClientHello消息开始SSL通信。该消息包含客户端支持的指定SSL版本,以及密码套件列表(使用的加密算法、密钥长度等)。2.当服务器可以进行SSL通信时,它会响应一个ServerHello消息。与客户端一样,SSL版本和加密组件包含在消息中。服务器的加密组件的内容是从接收到的客户端的加密组件中过滤出来的。3.服务器发送证书消息。该消息包含公钥证书。4.最后,服务器发送ServerHelloDone消息通知客户端,SSL握手协商初始阶段结束。5.第一次SSL握手结束后,客户端以ClientKeyExchange消息响应。该消息包含一个称为Pre-mastersecret的随机密码字符串,用于通信加密。此消息已使用步骤3中的公钥加密。6.然后客户端继续发送ChangeCipherSpec消息。这条消息会提示服务器,这条消息之后的通信会被Pre-mastersecretkey加密。7.客户端发送Finished消息。此消息包含到目前为止连接的所有消息的总体检查值。本次握手协商能否成功,以服务器能否正确解密消息为准绳。8.服务器还发送一条ChangeCipherSpec消息。9.服务器也发送一个Finished消息。10、服务端与客户端的Finished消息交互完成后,SSL连接建立。当然,通信受SSL保护。从这里开始应用层协议的通信,即发送HTTP请求。11、应用层协议通信,即发送HTTP响应。12.最后被客户端断开。断开连接时,发送一条close_notify消息。上图有些遗漏。此步骤后,将发送TCPFIN消息以关闭与TCP的通信。另外,在上面的流程图中,应用层在发送数据时,会附带一个消息摘要,称为MAC(MessageAuthenticationCode)。MAC可以检查报文是否被篡改,从而保证报文的完整性。下面我用一张图来形象的说明一下。这张图比上面的数字证书图更详细(图片来源于《图解HTTP》)。经过上面的介绍,我们可以看出,https首先使用数字证书来保证服务器上的公钥能够安全无误地到达客户端。然后使用非对称加密安全传输共享密钥,最后使用共享密钥安全交换数据。使用https就是这么安全。是不是任何场景都必须用https来通信?答案是不。1、虽然https提供了安全消息传输的通道,但是每条消息的加密和解密是非常耗时的,也很消耗系统资源。所以,除非在一些对安全性要求很高的场景,比如银行系统、购物系统等,我们必须使用https进行通信,而在其他对安全性要求不高的场景,我们其实是不需要使用https的。2、使用https需要使用数字证书,但是一般权威机构颁发的数字证书是收费的,价格也比较贵,所以对于一些个人网站,尤其是学生来说,如果安全要求不高的话,也没有必要使用https。【本文为专栏作家霍利斯原创文章,作者微信公众号Hollis(ID:hollishuang)】点此阅读更多本作者好文