HTTPS加密机制

本文是对「一文读懂HTTPS加密机制」的提炼。

HTTPS等价为HTTP+SSL。由于http协议是明文传输的,因此很容易被截获,所以是不安全的,需要采用加密机制。

为何不能只用对称加密

对称加密是加密和解密都用同一个密钥,服务器给浏览器发消息,首先用自身的密钥加密。但如果想要浏览器解密报文,必须把这个密钥也发送给浏览器,这样密钥很容易被截获,所以是不安全的。

为何不能只用非对称加密

非对称加密是指服务器有一个私钥和一个公钥,私钥始终自己保存,公钥发送给浏览器。如果用私钥加密,则用公钥解密;如果用公钥加密,则用私钥解密。

服务器向浏览器发送消息的加密过程如下:首先服务器用私钥进行加密,发送公钥给浏览器,然后浏览器利用得到的公钥解密。这样如果服务器和浏览器都有各自的一对公钥和私钥,那就可以达到预期了。然而HTTPS并没有这样做,因为相比于对称加密,非对称加密的成本非常高,两组非对称加密会带来很大的延迟。

用对称+非对称加密存在什么问题

由于两组非对称加密时延很长,有一种做法是服务器发给浏览器用非对称机密,反过来用对称加密。也就是说流程如下:服务器发送给浏览器的数据,先用服务器自身的私钥加密,与公钥一起传给浏览器,浏览器随机生成密钥,将该密钥用服务器传递过来的公钥加密,这样浏览器传给服务器的数据就可以用服务器自身的私钥进行解密,保证了安全。HTTPS协议也是基于这种机密模式设计的。

但是这样存在一个问题,即中间人攻击。就是当服务器传递数据和公钥给浏览器时,可能会被拦截。假设被一台中间机器拦截,可以通过公钥进行解密,同时将公钥篡改为自己的公钥,发送给浏览器。这样当浏览器发回其密钥时,就可以截获浏览器的密钥。因此存在这种中间人攻击的风险。

数字签名

现在的问题就是:浏览器该如何才能知道,发过来的公钥正是未经过篡改的服务器的公钥?这里就用到了数字证书。一个网站在使用HTTPS协议前需要向CA机构申领一份数字证书,数字证书里含有证书持有者信息、公钥信息等。服务器把证书传输给浏览器,浏览器从证书里获取公钥就可以了。那么如何利用数字证书来保证真实性呢?

这里就用到了数字签名技术:

在这里插入图片描述
签名过程如下:CA证书也拥有公钥和私钥,首先用CA证书里的散列函数对数据进行hash,然后用CA证书的私钥对hash后的散列值加密,得到数字签名S。数据和数字签名一起,组成了数字证书发送给浏览器。随后浏览器要验证这个证书的真实性。

验证过程如下:首先将数字证书拆分成签名S和明文T,用CA机构的公钥对签名S进行解密(浏览器对CA机构是信任的,因此会预安装CA机构的根证书,因此可以拿到可信的CA机构公钥)。随后用证书里指明的hash算法对明文T进行hash得到T‘,如果T‘与签名S相等,那么表明证书可信。

通过这种方式,服务器传递公钥给浏览器,浏览器传递密钥给服务器,就成为了一个相对安全的过程。hash在这里更多起到一个提升效率的作用,将长度较长的明文,转化为例如128长度的哈希值,会提高加解密效率。

试想下会不会存在中间人攻击?(1)如果中间人篡改数据,那么他没有CA机构的私钥,无法用私钥加密,浏览器用公钥解密会失败,因此会发现篡改;(2)如果中间人将证书调包,那么证书里显示的域名等信息与浏览器请求的不一致,也会发现受到了攻击。因此不会存在中间人攻击的现象。

HTTP协议是现代互联网通信的基础,其核心机制包括请求/响应模型、状态码、Header字段(如User-Agent和Cookie)以及HTTPS加密机制。以下是对这些关键概念的深入解析: ### 请求/响应模型 HTTP协议采用客户端-服务器架构,通信过程基于请求/响应模型。客户端(如浏览器)向服务器发送一个HTTP请求,请求中包含请求方法(如GET、POST)、URL、协议版本以及可选的请求头和请求体。服务器接收到请求后,处理请求并返回一个HTTP响应,响应中包含状态码、响应头和响应体。这种模型确保了客户端与服务器之间的高效通信[^1]。 ### 状态码 HTTP状态码是服务器用来告知客户端请求处理结果的三位数字代码。常见的状态码包括: - **200 OK**:请求成功。 - **301 Moved Permanently**:资源已永久移动到新位置。 - **400 Bad Request**:客户端发送的请求有误。 - **401 Unauthorized**:请求需要用户身份验证。 - **403 Forbidden**:服务器拒绝执行请求。 - **404 Not Found**:请求的资源不存在。 - **500 Internal Server Error**:服务器内部错误。 状态码帮助客户端理解请求的处理结果,并据此采取适当的操作。 ### Header字段 HTTP头字段是HTTP请求和响应中的元数据,用于传递附加信息。常见的Header字段包括: - **User-Agent**:标识客户端的浏览器类型、操作系统、渲染引擎等信息,服务器可以根据User-Agent提供不同的内容[^1]。 - **Cookie**:用于存储用户会话信息,服务器通过Set-Cookie头字段设置,客户端在后续请求中通过Cookie头字段发送回服务器。 ### User-Agent User-Agent是一个特殊的字符串头,用于向服务器提供客户端的浏览器类型、操作系统及版本、浏览器内核等信息。UA字符串的标准格式包括浏览器标识、操作系统标识、加密等级标识、浏览器语言和渲染引擎标识。通过分析User-Agent,服务器可以识别用户的设备和浏览器类型,从而提供优化的内容。 ### Cookie Cookie是服务器存储在客户端的小型数据片段,用于跟踪用户会话或保存用户偏好。服务器通过Set-Cookie头字段设置Cookie,客户端在后续请求中通过Cookie头字段将Cookie发送回服务器。Cookie可以包含过期时间、路径、域名等属性,以控制其生命周期和作用范围。 ### HTTPS加密机制 HTTPS是HTTP协议的安全版本,通过SSL/TLS协议对数据进行加密,确保客户端与服务器之间的通信安全。HTTPS的主要机制包括: - **加密传输**:数据在传输过程中被加密,防止中间人攻击。 - **身份验证**:通过数字证书验证服务器身份,确保客户端连接的是合法的服务器。 - **完整性保护**:确保数据在传输过程中未被篡改。 HTTPS通过结合对称加密和非对称加密技术,确保数据的机密性和完整性。 ```python # 示例:使用Python的requests库发送带有自定义User-Agent的GET请求 import requests headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36' } response = requests.get('https://example.com', headers=headers) print(response.status_code) print(response.headers) print(response.cookies) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值