array(2) { ["docs"]=> array(10) { [0]=> array(10) { ["id"]=> string(3) "428" ["text"]=> string(77) "Visual Studio 2017 单独启动MSDN帮助(Microsoft Help Viewer)的方法" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(8) "DonetRen" ["tagsname"]=> string(55) "Visual Studio 2017|MSDN帮助|C#程序|.NET|Help Viewer" ["tagsid"]=> string(23) "[401,402,403,"300",404]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400964" ["_id"]=> string(3) "428" } [1]=> array(10) { ["id"]=> string(3) "427" ["text"]=> string(42) "npm -v;报错 cannot find module "wrapp"" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "zzty" ["tagsname"]=> string(50) "node.js|npm|cannot find module "wrapp“|node" ["tagsid"]=> string(19) "[398,"239",399,400]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400760" ["_id"]=> string(3) "427" } [2]=> array(10) { ["id"]=> string(3) "426" ["text"]=> string(54) "说说css中pt、px、em、rem都扮演了什么角色" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(12) "zhengqiaoyin" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400640" ["_id"]=> string(3) "426" } [3]=> array(10) { ["id"]=> string(3) "425" ["text"]=> string(83) "深入学习JS执行--创建执行上下文(变量对象,作用域链,this)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "Ry-yuan" ["tagsname"]=> string(33) "Javascript|Javascript执行过程" ["tagsid"]=> string(13) "["169","191"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511399901" ["_id"]=> string(3) "425" } [4]=> array(10) { ["id"]=> string(3) "424" ["text"]=> string(30) "C# 排序技术研究与对比" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "vveiliang" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(8) ".Net Dev" ["catesid"]=> string(5) "[199]" ["createtime"]=> string(10) "1511399150" ["_id"]=> string(3) "424" } [5]=> array(10) { ["id"]=> string(3) "423" ["text"]=> string(72) "【算法】小白的算法笔记:快速排序算法的编码和优化" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "penghuwan" ["tagsname"]=> string(6) "算法" ["tagsid"]=> string(7) "["344"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511398109" ["_id"]=> string(3) "423" } [6]=> array(10) { ["id"]=> string(3) "422" ["text"]=> string(64) "JavaScript数据可视化编程学习(二)Flotr2,雷达图" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "chengxs" ["tagsname"]=> string(28) "数据可视化|前端学习" ["tagsid"]=> string(9) "[396,397]" ["catesname"]=> string(18) "前端基本知识" ["catesid"]=> string(5) "[198]" ["createtime"]=> string(10) "1511397800" ["_id"]=> string(3) "422" } [7]=> array(10) { ["id"]=> string(3) "421" ["text"]=> string(36) "C#表达式目录树(Expression)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "wwym" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(4) ".NET" ["catesid"]=> string(7) "["119"]" ["createtime"]=> string(10) "1511397474" ["_id"]=> string(3) "421" } [8]=> array(10) { ["id"]=> string(3) "420" ["text"]=> string(47) "数据结构 队列_队列实例:事件处理" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "idreamo" ["tagsname"]=> string(40) "C语言|数据结构|队列|事件处理" ["tagsid"]=> string(23) "["246","247","248",395]" ["catesname"]=> string(12) "数据结构" ["catesid"]=> string(7) "["133"]" ["createtime"]=> string(10) "1511397279" ["_id"]=> string(3) "420" } [9]=> array(10) { ["id"]=> string(3) "419" ["text"]=> string(47) "久等了,博客园官方Android客户端发布" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(3) "cmt" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511396549" ["_id"]=> string(3) "419" } } ["count"]=> int(200) } 222 快速理解https是如何保证安全的 - 爱码网

1.https作用

  • 混合加密
  • 身份验证: 可以通过数字证书验证对方身份
  • 验证数据完成性: 防止内容被中间人冒充或篡改

2. 基础知识

  • 数字摘要:通过hash函数对报文进行哈希,得到长度固定的字符串称谓摘要, 这个过程是单向的,无法通过摘要反推原文。

  • 数字签名:对数字摘要进行非对称加密后的密文,叫做数字签名。

  • 数字证书:可用于客户端验证服务端身份的证书,一般是由CA机构签发的。数字证书包含颁发机构、过期时间、网站域名、网站公钥、CA签名。

  • CSR:CSR是Certificate Signing Request的英文缩写,即数字证书签名请求,网站只要把CSR文件提交给证书颁发机构后,证书颁发机构使用其【根证书私钥】对CSR内容进行【签名】,就生成了数字证书;CSR请求中包含网站生成的公钥,因此CSR必定有对用的key,也就是私钥.例如下图是在线生成CSR的工具:

快速理解https是如何保证安全的
生成结果:
快速理解https是如何保证安全的

3. https流程

  1. 网站首先需要申请域名,然后使用域名生成 CSR 和 私钥,然后向CA机构申请数字证书。

  2. 浏览器向网站发送https请求,URL中必须使用域名。

  3. 网站收到请求后,立刻响应数字证书。

  4. 浏览器收到数字证书后,在本地已授信的根证书列表中,查询数字证书中的颁发机构的根证书;如果不存在则无法验证,所以提示用户该数字证书不安全,如果存在,则使用本地根证书对数字证书进行验证,如果验证失败则提示用户该数字证书不安全。如果证书没有问题,浏览器自动生成一个随机数(对称**)对请求报文进行加密,然后再使用数字证书中的公钥对随机数进行加密,然后将【请求密文】和【随机数密文】发送给网站。

  5. 网站收到浏览器发来的密文后,首先使用私钥解密【随机数密文】得到【随机数】,然后使用随机数解密【请求报文】,此时SSL连接已建立,该连接以后的通信将一直使用该【随机数】进行对称加密。最后网站使用【随机数】加密响应报文,并发送到浏览器。

  6. 浏览器接受到响应报文后,使用【随机数】解密报文,然后使用【随机数】加密请求。

4. 数字证书验证主要过程

  1. 浏览器请求数字证书

比如访问百度收到的数字证书如下图:
快速理解https是如何保证安全的

点击URL框左边的锁即可查看证书,在证书的常规信息:

  • 颁发给: baidu.com 即数字证书中的网站域名
  • 颁发者: CA机构
  • 有效期: 即数字证书的有效期
    快速理解https是如何保证安全的
    上图示数字证书的详情,点击下方的【证书的详情信息】可以打开证书的解释,最重要的信息就是指纹和公钥了。

指纹就是证书签名,是CA对证书内容进行摘要后使用私钥加密后的签名。

公钥是网站的公钥。

  1. 浏览器查找CA根证书

浏览器安装后都会内置很多CA机构的根证书,基本涵盖全球CA机构,如谷歌浏览器中的根证书如下:
快速理解https是如何保证安全的
这些根证书实际就是CA机构自己给自己颁发的数字证书,其中的信息和颁发给网站的数字证书的格式是一样的。

浏览器根据网站数字证书中的颁发机构名称,从根证书列表中查询对用的根证书,如果不存在,则说明网站数字证书的颁发机构不受信任,不够安全,因此验证失败,如果存在则继续验证。

  1. 浏览器使用根证书中的公钥,对数字签名进行解密,如果能解密成功,说明指纹是CA机构使用私钥进行加密的,如果解密失败则说明数字签名是伪造的。解密成功后获得证书摘要。

  2. 浏览器根据摘要算法主动生成摘要,和解密数字签名得到的数字摘要进行对比,如果不一致则说明证书内容被篡改了,否则说明该数字证书的确是CA机构签发的。

  3. 浏览器比较数字证书中的域名是否和请求中的一致,如果不一致则说明该数字证书虽然的确是CA机构签发的,但并不是目标网站的数字证书。比如一个非法网站拥有CA签发的数字证书,但它截取了访问某个百度的https请求,并响应浏览器自己的证书,如果浏览器不进行域名校验,就会认为数字证书是正确的,进而整个会话被劫持。

这也是为什么https要求必须是域名,否者会话可能被劫持。如下图,当https请求中使用ip访问百度时,浏览器也会提示不安全,以避免会话被劫持:
快速理解https是如何保证安全的
快速理解https是如何保证安全的
流程图:
快速理解https是如何保证安全的
关系图:
快速理解https是如何保证安全的

5.证书链

快速理解https是如何保证安全的
快速理解https是如何保证安全的
可知百度的数字证书并不是一级CA机构签发的,而是二级CA机构签发的。

相关文章: