HTTPS是如何保证安全的
HTTP存在的问题
- 窃听风险:通信使用明文(不加密),内容可能会被窃听(第三方可能获知通信内容)
- 冒充风险:不验证通信方的身份,因此有可能遭遇伪装
- 篡改风险:无法证明报文的完整性,所以有可能已遭篡改
HTTPS
HTTPS网站
可以看到 HTTPS的网站,在浏览器的地址栏内会出现一个带锁的标记。
HTTPS并非是应用层一个新的协议,通常 HTTP 直接和 TCP 通信,HTTPS则先和安全层(SSL/TLS)通信,然后安全层再和 TCP 层通信。
HTTPS
SSL/TLS协议就是为了解决上面提到的HTTP存在的问题而生的,下面我们来看一下它是怎么解决的:
- 所有的信息都是加密传输的,第三方无法窃听
- 配备身份验证,防止身份被冒充
- 具有校验机制,一旦被篡改,通信双方会立刻发现
加密
对称加密
加密和解密同用一个秘钥的方式称为 共享秘钥加密,也被叫做对称秘钥加密。
对称加密
- 浏览器发送给服务端
client_random
和一系列加密方法 - 服务端发送给浏览器
server_random
和加密方法
现有浏览器和服务器有了三个相同的凭证:client_random
、server_random
和加密方法 用加密方法把 client_random
、server_random
两个随机数混合起来,生成秘钥,这个密钥就是浏览器和服务端通信的暗号。
存在的问题:第三方可以在中间获取到client_random
、server_random
和加密方法,由于这个加密方法同时可以解密,所以中间人可以成功对暗号进行解密,拿到数据,很容易就将这种加密方式破解了。
非对称加密
非对称加密
- 浏览器发送给服务端 一系列加密方法
- 服务端发送给浏览器 加密方法以及公钥
之后浏览器通过公钥将数据加密传输给服务端,服务端收到数据使用私钥进行解密。服务端给浏览器发送数据,则使用私钥进行加密,浏览器收到服务端发送过来的数据,使用公钥进行解密。
存在的问题:
- 非对称加密效率太低, 这会严重影响加解密的速度,进而影响到用户打开页面的速度。
- 无法保证服务器发送给浏览器的数据安全, 服务器的数据只能用私钥进行加密(因为如果它用公钥那么浏览器也没法解密啦),中间人一旦拿到公钥,那么就可以对服务端传来的数据进行解密了,就这样又被破解了。
HTTPS使用对称加密和非对称加密结合
传输数据阶段依然使用对称加密,但是对称加密的秘钥我们采用非对称加密传输。
HTTPS加密
- 浏览器向服务器发送client_random和加密方法列表。
- 服务器接收到,返回server_random、加密方法以及公钥。
- 浏览器接收,接着生成另一个随机数pre_master, 并且用公钥加密,传给服务器。(重点操作!)
- 服务器用私钥解密这个被加密后的pre_master。
到此为止,服务器和浏览器就有了相同的 client_random
、server_random
和 pre_master
, 然后服务器和浏览器会使用这三组随机数生成对称秘钥。有了对称秘钥之后,双方就可以使用对称加密的方式来传输数据了。
CA (数字证书)
使用对称和非对称混合的方式,实现了数据的加密传输。但是这种仍然存在一个问题,服务器可能是被黑客冒充的。这样,浏览器访问的就是黑客的服务器,黑客可以在自己的服务器上实现公钥和私钥,而对浏览器来说,它并不完全知道现在访问的是这个是黑客的站点。
服务器需要证明自己的身份,需要使用权威机构颁发的证书,这个权威机构就是 CA(Certificate Authority), 颁发的证书就称为数字证书 (Digital Certificate)。
对于浏览器来说,数字证书有两个作用:
- 通过数字证书向浏览器证明服务器的身份
- 数字证书里面包含了服务器公钥
下面我们来看一下含有数字证书的HTTPS的请求流程
含有数字证书的HTTPS的请求流程
相对于不含数字证书的HTTPS请求流程,主要以下两点改动
- 服务器没有直接返回公钥给浏览器,而是返回了数字证书,而公钥正是包含数字证书中的;
- 在浏览器端多了一个证书验证的操作,验证了证书之后,才继续后序流程。
参考
- 如何用通俗易懂的话来解释非对称加密?[1]
- 十分钟搞懂HTTP和HTTPS协议?[2]
- HTTPS 原理分析——带着疑问层层深入[3]
- 图解HTTP[4]
- 浏览器工作原理与实践[5]
参考资料
[1]
如何用通俗易懂的话来解释非对称加密?: https://www.zhihu.com/question/33645891
[2]
十分钟搞懂HTTP和HTTPS协议?: https://zhuanlan.zhihu.com/p/72616216
[3]
HTTPS 原理分析——带着疑问层层深入: https://www.cnblogs.com/leap/p/11953836.html
[4]
图解HTTP: https://book.douban.com/subject/25863515/
[5]
浏览器工作原理与实践: https://time.geekbang.org/column/article/156181
- JavaScript 基础(二)数组
- 限制扫码付款额度,支付宝和微信要被“祭旗”?
- 拖动条SeekBar及星级评分条
- 【DeveMobile实例】利用Mobile Detect 制作单独移动端页面项目
- 互联网+智能物流高峰论坛举行运的易现场签约完成战略布局
- Quartz.net通过配置文件来完成作业调度
- JavaScript 基础(一)
- 我也来说说.net开源
- 是时候对员工进行网络安全培训了:黑客正将目标瞄准打印机
- 进度条ProgressBar
- Microsoft Visual Studio International Pack
- 柯洁5冠在手“食言”再战AI:我已看开 输赢无所谓
- JGulp: 利用Gulp 配置的前端项目自动化工作流
- 微软Enterprise Library 4.0将支持依赖注入
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Android读取properties配置文件的实例详解
- Android开发实现popupWindow弹出窗口自定义布局与位置控制方法
- Android编程实现使用handler在子线程中更新UI示例
- Android编程实现图片放大缩小功能ZoomControls控件用法实例
- 详解Android MacAddress 适配心得
- Android编程使用GestureDetector实现简单手势监听与处理的方法
- 【MySQL】通过SQL_Thread快速恢复binlog
- 渗透系列之flask框架开启debug模式漏洞分析
- Android之ImageSwitcher的实例详解
- Android中HTTP请求中文乱码解决办法
- Android编程之播放器MediaPlayer实现均衡器效果示例
- Android studio点击跳转WebView详解
- Android webveiw 出现栈错误解决办法
- Android开发之实现手势滑动的功能
- Android编程实现带有单选按钮和复选按钮的dialog功能示例