前端要知道的HTTPS
HTTPS(HTTP Secure)是一种构建在 SSL 或 TLS 上的HTTP协议。
简单的说,HTTPS 就是 HTTP 的安全版本。SSL(Secure Sockets Layer)以及继任者 TLS(Transport Layer Security)是一种安全协议,为网络通信提供来源认证、数据加密和报文完整性检测,保障通信的保密性和可靠性。HTTPS协议的 URL 都以 “https://”开头,在访问某个 Web 页面时,客户端会打开一条到服务器 443 端口的连接。
之所以说HTTP不安全,是由于以下3个原因导致的:
- 数据以明文传递,有被窃听的风险
- 接收到的报文无法证明是发送时的报文,不能保障完整性,因此报文有被篡改的风险
- 不验证通信两端的身份,请求或响应有被伪造的风险
HTTPS的组成
加密
在密码学中,加密是指将明文转换为难以理解的密文;解密与之相反,是把密文换回明文。加密和解密都是由两部分组成:算法和密钥。
加密算法可以分为两类:对称加密和非对称加密。
对称加密
对称加密在加密和解密的过程中只是用一个密钥,这个密钥叫对称密钥,也叫共享密钥,如下图。
对称加密的优点就是计算速度快,缺点也很明显,就是通信两端需要分享密钥。客户端和服务器在进行对话前,要先将对称密钥发送给对方,在传输的过程中密钥有被窃取的风险,一旦被窃取,那么密文就能轻松翻译成明文,加密保护形同虚设。
非对称加密
非对称加密在加密的过程中使用公开密钥(public key),在解密的过程中使用私有密钥(private key)。加密和解密的过程也可以反过来。
非对称加密的缺点时计算速度慢,但它很好的解决了对称加密的问题,避免了信息泄露。通信两端如果都使用非对称加密,那么各自都会生成一对密钥,私钥留在身边,公钥发送给对方,公钥在传输途中即使被人窃取,也不用担心,因为没有私钥就无法轻易解密。在交换公钥后,就可以用对方的公钥把数据加密,开始密文对话。
HTTPS采用混合加密机制,将两种加密算法组合使用,充分利用各自的优点,博采众长。在交换公钥阶段采用非对称加密,在传输报文阶段使用对称加密。
数字签名
数字签名是一段由发送者生成的特殊加密校验码,用于确定报文的完整性,数字签名的生成涉及两种技术:非对称加密和数字摘要。
数字摘要可以将变长的报文提取为定长的摘要,报文内容不同提取的摘要也将不同,常用的摘要算法有 MD5 和 SHA。签名和校验的过程总共分为 5 步,如下如。
- 发送方用摘要算法对报文进行提取,生成一段摘要
- 然后用私钥对摘要进行加密,加密后的摘要作为数字签名附加在报文上,一起发送给接收方
- 接收方收到报文后,用同样的摘要算法提取出摘要
- 再用接收到的公钥对报文中的数字签名进行解密
- 如果两个摘要相同,那么就能证明报文没有被篡改
数字证书
数字证书相当于网络上的身份证,用于身份识别,由权威的数字认证机构(CAlendar)负责颁发和管理、数字证书的格式普遍遵循 X.509 国际标准,证书的内容包括:
- 有效期
- 颁发机构
- 颁发机构的签名
- 证书所有者的名称
- 证书所有者的公开密钥
- 版本号和唯一序列号
客户端(如浏览器)会预先植入一个受信任的颁发机构列表,如果收到的证书来自陌生的机构,那么会弹出一个安全警报对话框,如下图时IE浏览器的安全警报。
一般数字证书都会被安装在服务器处,当客户端发起安全请求时,服务器就会返回数字证书。客户端从受信机构列表中找到相应的公开密钥,解开数字证书。然后验证数字证书中的信息,如果验证通过,就说明请求来自意料之中的服务器;如果不通过,就说明证书被冒用,来源可疑,客户端立刻发出警告。下图描绘了这个认证过程。
安全通信机制
客户端和服务器将通过好几个步骤建立起安全连接,然后开始通信,下面时精简过的步骤:
- 客户端发送 Client Hello 报文开始 SSL 通信,报文中还包括协议版本号、加密算法等信息
- 服务器发送 Server Hello 报文作为应答,在报文中也会包括协议版本号、加密算法等信息
- 服务器发送数字证书,数字证书中包括服务器中的公开密钥
- 客户端解开并验证数字证书,验证通过后,生成一个随机密码串(premaster secure),再用收到的服务器公钥进行解密,发送给服务器
- 客户端再次发送 Change Cipher 报文,提示服务器在此条报文之后,采用刚刚生成的随机密码串进行数据加密
- 服务器也发送 Change Cipher Spec 报文
- SSL 连接建立完成,接下来就可以开始传输数据了
下图描绘了这些步骤
常见笔试面试题
HTTPS有哪些缺点?
HTTPS有如下4个缺点
- 通信两端都需要进行加密和解密,会消耗大量的CPU、内存等资源,增加了服务器的负载
- 加密运算和多次握手降低了访问速度
- 在开发阶段,加大了页面调试难度。由于信息都被加密了,所以用代理工具的话,需要先解密然后才能看到真实信息。
- 用 HTTPS 访问的页面,页面内的外部资源都得用HTTPS请求,包括脚本中的AJAX请求
什么是运营商劫持?有什么办法预防?
运营商是指提供网络服务的ISP(Internet Service Provider),例如三大基础运营商:中国电信、中国移动和中国联通。
运营商为了牟取经济利益,有时候会劫持用户的HTTP访问最明显的特征就是在页面上植入广告,有些是购物广告,有些却是淫秽广告,非常影响界面体验和公司形象。为了避免被劫持,可以让服务器支持 HTTPS HTTPS 协议,HTTPS传输的数据都被加密过了,运营商就无法再注入广告代码,这样页面就不会再被劫持。
本文摘抄自《前端程序员面试笔试宝典》,媛媛之家/组编 平文 等/编著,机械工业出版社,版权归原作者所有