大白话详解HTTPS!
开源Linux
回复“读书”,挑选书籍资料~
我相信大家面试的时候对于 HTTPS 这个问题一定不会陌生,可能你只能简单的说一下与 HTTP 的区别,但是真正的原理是否很清楚呢?他到底如何安全?这一篇让我们用大白话来揭开 HTTPS 的神秘面纱吧!
HTTPS 是什么
HTTPS 是什么?答:HTTPS 不就是 HTTP 后面多加了一个 S 吗?
对这里的 S 就是指 SSL/TLS(就是一种安全加密协议,想深入了解的同学可以自行百度),HTTPS 是在 HTTP 的基础上,利用 SSL/TLS 加密数据包。
我们记住两个主要目的就行:
对数据加密
验证网站服务器身份
HTTPS 怎么对数据进行加密
我们已经知道 HTTPS 第一个目的是给数据加密,对于数据加密,我们这里要谈到两种加密方式:
对称加密:所谓对称就是指两边一样 发送方和接收方都用的同一个密钥,加密解密都是同一个密钥从始至终只需要保存一个密钥就行。
非对称加密:发送方和接收方使用一对密钥,即公钥和私钥。一般私钥是保密不能被泄露的,公钥可以对外传播。我们可以用公钥加密私钥解密(数据加密) 也可用私钥加密公钥解密(签名下面会解释)
混合加密:知道了两种加密方式的优缺点之后,我们的 HTTPS 就很厉害了,它采用两者混合的加密方式。
不是说对称加密的密钥不安全吗?那我们换一种思路,我们在传递过程把我们的对称加密中的密钥用非对称加密的方式去传递就好了。
这句话有点绕,我们看上图:
客户端生成会话秘钥就是我们对称加密生成的密钥。
它用公钥加密之后进行传递(这个时候被加密的不是数据 是这个会话秘钥 等于把钥匙加密了) 这里的公钥就是非对称加密中的公钥 他是由服务器传递过去的(对外公开)。
服务端用非对称加密的私钥去解密 拿到我们的会话秘钥。
客户端和服务端都能用同一个会话秘钥进行加解密了。
就算传输过程被攻击者截取到了被加密的会话秘钥 他没有服务器的私钥是无法得到会话秘钥的。
整个过程巧妙之处就在于之前我们传递的是钥匙,现在我们传递的是保险箱,钥匙在保险箱里面,你就算拿到了保险箱,没有保险箱的钥匙也拿不到钥匙。
HTTPS 怎么验证网站服务器身份
HTTPS 第二个目的是对网站服务器进行真实身份认证,那么这一点又是怎么做到的呢?
先来看一个问题,上一步我们已经解决了数据加密的问题,虽然攻击者无法解密数据,但是他可以篡改数据,我们怎么知道数据没被动过呢?
数据被篡改怎么办
这个时候就要使用数字签名了,数字签名:将原文(部分数据关键信息)先用 Hash 函数生成消息摘要,然后用发送者的私钥加密生成数字签名,与原文一起传送给接收者。
两个关键点:
Hash 算法计算生成信息摘要
私钥加密生成数字签名
客户端如何校验数字签名呢?(利用服务器私钥加密,公钥解密)客户端收到服务器发过来的数字签名之后:
用服务端的公钥去解密数字签名得到消息摘要 (原始未被篡改的)
用 Hash 函数对收到的原文计算生成一个摘要信息 (可能会被篡改的)
如果两个信息摘要一致,说明数据没有被篡改。OK,到这里可能你觉得没问题了!
其实最后还有一个很关键的点是:我们刚刚所有的假设都基于客户端的公钥是服务器传递过来的,那如果攻击者伪造了服务器的公钥怎么办呢?
服务器公钥被篡改怎么办
这个时候就要使用数字证书了,数字证书认证机构(CA)处于客户端与服务器双方都可信赖的第三方机构的立场上。
服务端向 CA 申请数字证书,审核通过后 CA 会向申请者签发认证文件-证书,包含以下内容:
拿到数字证书后,服务器传递数字证书给客户端。
客户端怎么校验数字证书
步骤如下:
首先浏览器读取证书中的证书所有者、有效期等信息进行一一校验。
浏览器开始查找操作系统中已内置的受信任的证书发布机构 CA,与服务器发来的证书中的颁发者 CA 比对,用于校验证书是否为合法机构颁发。
如果找不到,浏览器就会报错,说明服务器发来的证书是不可信任的。如果找到,那么浏览器就会从操作系统中取出颁发者 CA 的公钥,然后对服务器发来的证书里面的签名进行解密。
浏览器使用相同的 Hash 算法根据证书内容计算出信息摘要,将这个计算的值与证书解密的值做对比。
对比结果一致,则证明服务器发来的证书合法,没有被冒充。此时浏览器就可以读取证书中的公钥,用于后续加密了。
HTTPS 原理一览图如下:
来源:
https://juejin.im/post/5eb3c6065188255fd54de543
好文和朋友一起看~
大白话详解HTTPS!的更多相关文章
- java的动态代理机制详解-----https://www.cnblogs.com/xiaoluo501395377/p/3383130.html
java的动态代理机制详解-----https://www.cnblogs.com/xiaoluo501395377/p/3383130.html
- 详解 HTTPS 移动端对称加密套件优
近几年,Google.Baidu.Facebook 等互联网巨头大力推行 HTTPS,国内外的大型互联网公司很多也都已启用全站 HTTPS. Google 也推出了针对移动端优化的新型加密套件 Cha ...
- 一.定时任务详解https://i.cnblogs.com/EditPosts.aspx
定时任务的详解 h每小时运行 d每天运行 w每周运行 m每个月运行 中毒时查看系统定时任务是否有病毒的脚本. crontab -l 查看用户的定时任务 crontab -e 进入编辑界面增加 ...
- 详解https是如何确保安全的?
Https 介绍 什么是Https HTTPS(全称:Hypertext Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是 ...
- <转载> nginx服务器安装及配置文件详解 https://segmentfault.com/a/1190000002797601
nginx在工作中已经有好几个环境在使用了,每次都是重新去网上扒博客,各种编译配置,今天自己也整理一份安装文档和nginx.conf配置选项的说明,留作以后参考.像负载均衡配置(包括健康检查).缓存( ...
- 详解HTTPS加速原理
HTTPS是什么? http叫超文本传输协议,使用TCP端口80,默认情况下数据是明文传送的,数据可以通过抓包工具捕获到,因此在interner上,有些比较重要的站点的http服务器需要使用PKI(公 ...
- 详解HTTPS、TLS、SSL
HTTPS.TLS.SSL HTTP也称作HTTP over TLS.TLS的前身是SSL,TLS 1.0通常被标示为SSL 3.1,TLS 1.1为SSL 3.2,TLS 1.2为SSL 3.3.下 ...
- 详解 HTTPS、TLS、SSL、HTTP区别和关系
一.什么是HTTPS.TLS.SSL HTTP也称作HTTP over TLS.TLS的前身是SSL,TLS 1.0通常被标示为SSL 3.1,TLS 1.1为SSL 3.2,TLS 1.2为SSL ...
- Java 正则表达式详解---https://www.jb51.net/article/16829.htm
一.正则表达式基础知识 我们先从简单的开始.假设你要搜索一个包含字符“cat”的字符串,搜索用的正则表达式就是“cat”.如果搜索对大小写不敏感,单词“catalog”.“Catherine”.“so ...
随机推荐
- 构造器注入和 setter 依赖注入,那种方式更好?
每种方式都有它的缺点和优点.构造器注入保证所有的注入都被初始化,但是 setter 注入提供更好的灵活性来设置可选依赖.如果使用 XML 来描述依赖, Setter 注入的可读写会更强.经验法则是强制 ...
- Java中final的使用
原文链接https://www.cnblogs.com/dolphin0520/p/10651845.html 作者Matrix海 子 本文为笔记 0. 概述 final和static一样都是修饰词, ...
- Leetcode1——两数之和 详细解析
Leetcode1--两数之和 题目分类:数组.哈希表的应用 1. 题目描述 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数 ...
- 《Advanced Bash-Scripting Guide》 in Chinese 高级Bash脚本编程指南》Revision 10中文版
<Advanced Bash-Scripting Guide> in Chinese <高级Bash脚本编程指南>Revision 10中文版 在线阅读链接:http://ww ...
- C++ | 虚函数产生条件
虚函数产生的条件 能否成为虚函数主要有以下两种判断依据,如果以下两种条件均满足,则具有成为虚函数的条件. 1.虚函数机制为动多态提供支持,而虚函数表中存放着虚函数的地址.因此虚函数必须是可以取地址的函 ...
- C/C++头文件以及避免头文件包含造成的重定义方法
C 头文件 头文件是扩展名为 .h 的文件,包含了 C 函数声明和宏定义,被多个源文件中引用共享.有两种类型的头文件:程序员编写的头文件和编译器自带的头文件. 在程序中要使用头文件,需要使用 C 预处 ...
- 5_系统的可控性_Controllability
- 关于css布局、居中的问题以及一些小技巧
CSS的两种经典布局 左右布局 一栏定宽,一栏自适应 <!-- html --> <div class="left">定宽</div> < ...
- 前端架构gulp与webpack(知识点整理)
一 概念介绍 gulp 是 task runner,Webpack 是 module bundler.可以这么说, Webpack 和 gulp 本身都有 95% 的功能是不能被对方替代,或者直接说和 ...
- 什么是实例内部类 Instance inner class有什么语法?
1.Instance inner class定义,用途和用法 重要语法:马克-to-win:1)实例内部类一定得有个外层类的实例和它绑定在一起,所以可以用This指针.所以必须先实例化外层类之后才能再 ...