https是如何实现安全通信的

如果有不正确的地方,还望指出!

web基础系列目录

回顾

总结几个概念(具体描述可以看上一篇文章)

数字签名和数字证书的应用

  • 场景是这样的:rose给jiajun写情书
  • 刚开始用非对称加密的方式,rose用jiajun的公钥对情书进行加密,那么这样的话,如果Billy截获到情书,也无法对情书进行解密,因为只有jiajun有私钥,除非私钥泄露了
  • jiajun收到,要回信给rose,这个时候jiajun要证明这封信是他自己写的,而且中途没有被别人修改
  • 这个时候,jiajun将信进行摘要,然后对摘要用私钥进行加密,这就是一个数字签名,然后我将数字签名和信一起发送给rose
  • rose接到后,用公钥对数字签名进行解密,得到的是一个摘要(这个时候不知道有没有被人修改过),然后对信进行摘要,这样的话,对两个摘要进行比较,如果不同那么说明这封信被修改过。
  • 后来,Billy想冒充jiajun(让rose和jiajun分手),他把jiajun的公钥换成他自己的公钥,然后按照上面的一样的操作发送给rose。这样Billy就可以得手
  • 再后来,为了不让Billy得逞,jiajun想出一个方法,要解决这个问题就是要向rose确定这个公钥是否是jiajun的,所以jiajun去找证书中心(CA),为公钥做认证,证书中心用自己的私钥对公钥和一些相关中心进行加密,这样产生的就是数字证书
  • 那么以后,jiajun发送消息给rose的时候,就将数字签名和数字证书发送个rose,这样rose通过数字证书就可以得到真实的公钥,就可以通过数字签名判断是否更改过

https的安全通信

SSL/TLS

  • SSL(Secure Sockets Layer安全套接层),是一种网络安全协议
  • TLS(Transport Layer Security传输层安全协议),是基于SSL协议的通用化协议,正逐步替代SSL。
  • SSL/TLS分为两层,一层是记录协议(建立在可靠的传输协议上(比如tcp),提供数据封装,加密解密,数据建议等基本功能),一层是握手协议(建立在记录协议上,在实际的数据传输开始前,进行加密算法的协商,通信密钥的交换等)。

什么是https

  • 全称是hypertext protocol over secure socket layer,也就是基于ssl的http协议,http的安全版,可以理解为https=http+ssl
  • https支持单向认证(只验证服务端证书的有效性),也支持双向验证(既验证服务端证书的有效性也验证客户端证书的有效性)
  • https协议在http协议与tcp协议之间增加一层安全层,数据在网络传输之前,会先进行加密,再进行传输

为什么用https

  • 有时候,我们访问一个国外的http站点,发现下面会有国内的一些小广告,事实上是中间人(一些网络节点,比如wifi热点,路由器,防火墙等)劫持,在html注入了一段广告的html。而只是注入广告的话还只是小问题,如果有一些有一些重要的信息被抓取的话,那么问题就挺严重的
  • 打个比喻,http是三轮车,没有封闭,里面装的什么东西可以被看到,https是封闭的汽车,看不到里面装了什么

https功能

  • 内容加密,用对称密钥进行加密
  • 身份认证,数字证书验证身份

https协商过程

  • 浏览器向服务器发出请求
  • 服务器响应浏览器,将证书发送给浏览器,浏览器确认证书有效
  • 浏览器和服务器通过非对称密钥算法协商好对话密钥(用于对称加密)
  • 后面双方都使用对话密钥做对称加解密就能完成整个通信
  • 总的来说,通信内容用对称加密算法机密,而对称加密的加密密钥通过非对称加密协商

握手过程(以RSA密钥协商为例,不同的算法实现不一样)

  • 客户端发送消息,消息包含协议的版本信息,客户端支持的加密算法,客户端产生的随机数
  • 服务端响应消息,消息包括服务端产生的随机数,协议版本信息,服务端数字证书,从客户端提供的加密算法确认使用的加密算法
  • 客户端根据证书管理器,验证服务端证书(验证有效期,证书中的域名和浏览器中域名是否匹配等)的有效性
  • 验证通过后,从证书获取公钥,生成随机数,此时通过这3个随机数经过一定的算法生成一个对话密钥,然后发送随机数(用证书的公钥进行加密),
  • 服务器端用私钥解密第三个随机数,然后通过3个随机数计算生成对话密钥
  • 握手阶段结束,客户端和服务端进入加密通信,用对话密钥加密内容

https的性能问题

  • 对比http,我们多了一个ssl握手的过程,而这个过程,有对称加密和非对称加密的过程,那么自然会消耗cpu资源了

用故事总结本文内容

  • 场景一样,同样是rose给jiajun写情书
  • rose和jiajun协商好用对称加密的方式给情书加密,可是现在有一个问题对称密钥怎么解决,无法安全地生成和保管对称密钥
  • 于是jiajun想了办法,jiajun生成一对公钥和私钥,公钥是公开的,于是rose生成一个用于对称加密的对话密钥,然后用公钥加密这个对话密钥,那么这样的话,即使中间lBilly截获了这部分内容,因为对话密钥很安全,所以无法获取内容
  • Billy很聪明,想到一个方法,伪装成jiajun,把他的公钥给rose,此时非对称协商密钥协商的对象是Billy
  • jiajun也不笨,很快他发现问题,要解决这个问题根本上就是要向rose证明这个公钥是谁的。于是jiajun找到了认证中心CA,生成一份数字证书

我觉得分享是一种精神,分享是我的乐趣所在,不是说我觉得我讲得一定是对的,我讲得可能很多是不对的,但是我希望我讲的东西是我人生的体验和思考,是给很多人反思,也许给你一秒钟、半秒钟,哪怕说一句话有点道理,引发自己内心的感触,这就是我最大的价值。(这是我喜欢的一句话,也是我写博客的初衷)

作者:jiajun 出处: http://www.cnblogs.com/-new/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。如果觉得还有帮助的话,可以点一下右下角的【推荐】,希望能够持续的为大家带来好的技术文章!想跟我一起进步么?那就【关注】我吧。

web基础系列(五)---https是如何实现安全通信的的更多相关文章

  1. 【C++自我精讲】基础系列五 隐式转换和显示转换

    [C++自我精讲]基础系列五 隐式转换和显示转换 0 前言 1)C++的类型转换分为两种,一种为隐式转换,另一种为显式转换. 2)C++中应该尽量不要使用转换,尽量使用显式转换来代替隐式转换. 1 隐 ...

  2. web基础(五)Jquery

    jQuery是一个快速的,简洁的javaScript库(占空间特别小,但功能强大!兼容性极强!),这个库里封装了一些方法,使用户能更方便地处理HTMLdocuments.events.实现动画效果,并 ...

  3. 家庭记账本小程序之改(java web基础版五)

    实现修改消费账单 1.main_left.jsp中该部分,调用Servlet中的list方法 2.Servlet中的list方法,调用Dao层的list方法,跳转到list.jsp页面 3.Dao层的 ...

  4. es6基础系列五--数组的拓展

    Array.from() 用于将两类对象转为真正的数组,类似数组对象和可遍历对象(包括数据结构Set和Map)转化为数组 格式:Array.from(arrayLike[, mapFn[, thisA ...

  5. Redis总结(五)缓存雪崩和缓存穿透等问题 Web API系列(三)统一异常处理 C#总结(一)AutoResetEvent的使用介绍(用AutoResetEvent实现同步) C#总结(二)事件Event 介绍总结 C#总结(三)DataGridView增加全选列 Web API系列(二)接口安全和参数校验 RabbitMQ学习系列(六): RabbitMQ 高可用集群

    Redis总结(五)缓存雪崩和缓存穿透等问题   前面讲过一些redis 缓存的使用和数据持久化.感兴趣的朋友可以看看之前的文章,http://www.cnblogs.com/zhangweizhon ...

  6. Spring基础系列-Web开发

    原创作品,可以转载,但是请标注出处地址:https://www.cnblogs.com/V1haoge/p/9996902.html SpringBoot基础系列-web开发 概述 web开发就是集成 ...

  7. Vue基础系列(五)——Vue中的指令(中)

    写在前面的话: 文章是个人学习过程中的总结,为方便以后回头在学习. 文章中会参考官方文档和其他的一些文章,示例均为亲自编写和实践,若有写的不对的地方欢迎大家和我一起交流. VUE基础系列目录 < ...

  8. java基础解析系列(五)---HashMap并发下的问题以及HashTable和CurrentHashMap的区别

    java基础解析系列(五)---HashMap并发下的问题以及HashTable和CurrentHashMap的区别 目录 java基础解析系列(一)---String.StringBuffer.St ...

  9. SSM框架开发web项目系列(五) Spring集成MyBatis

    前言 在前面的MyBatis部分内容中,我们已经可以独立的基于MyBatis构建一个数据库访问层应用,但是在实际的项目开发中,我们的程序不会这么简单,层次也更加复杂,除了这里说到的持久层,还有业务逻辑 ...

随机推荐

  1. css预处理器less和scss之less介绍(一)

    第一次发的标题有误,重发一遍,抱歉了 一.less基础语法 1.声明变量:@变量名:变量值 使用变量:@变量名 例如 @color : #ff0000; @length : 100px; #div1{ ...

  2. 2016-2017-2 《Java 程序设计》课堂实践项目

    目录 基本工具 基础内容 Hello World 和 模块分解 数组的使用 命令行参数 递归 分支语句 String类的使用 类的定义与测试 多态 IO与异常 数据库 网络与安全 数据结构应用 And ...

  3. 个人作业2——必应词典APP分析

    第一部分:调研.评测 1.刚刚打开必应词典的时候,它给我的第一反应就是界面美观,最上面是一个查询框,下面有一些经典的句子.单词以及一些精选的文章,所有的功能都可以一目了然,看一眼就知道要怎么去使用,这 ...

  4. 201521123102 《Java程序设计》第5周学习总结

    1. 本周学习总结 2. 书面作业 Q1.代码阅读:Child压缩包内源代码 1.1 com.parent包中Child.java文件能否编译通过?哪句会出现错误?试改正该错误.并分析输出结果. 不能 ...

  5. 201521123088《java程序设计》第三周学习总结

    1. 本周学习总结 本周学习了关于Java的封装,所谓封装就是将属性私有化,提供公有的方法访问私有属性 2. 书面作业 代码阅读 public class Test1 { private int i ...

  6. 201521123025<<java程序设计>>第9周学习总结

    1. 本周学习总结 2.书面作业 Q1.常用异常 题目5-1 1.1 截图你的提交结果(出现学号) 1.2 自己以前编写的代码中经常出现什么异常.需要捕获吗(为什么)?应如何避免? 经常出现Array ...

  7. Hyperledger Fabric 1.0 从零开始(四)——Fabric源码及镜像文件处理

    2:Fabric源码及镜像文件处理 2.1下载Fabric源码 下载Fabric源码是因为要用到源码中提到的列子和工具,工具编译需要用到go语言环境,因此需要把源码目录放到$GOPATH下.通过1.3 ...

  8. Spring Boot Maven Plugin(一):repackage目标

    简介 Spring Boot Maven Plugin插件提供spring boot在maven中的支持.允许你打包可运行的jar包或war包. 插件提供了几个maven目标和Spring Boot ...

  9. OSGi-入门篇之生命周期层(03)

    前言 生命周期层在OSGi框架中属于模块层上面的一层,它的运作是建立在模块层的功能之上的.生命周期层一个主要的功能就是让你能够从外部管理应用或者建立能够自我管理的应用(或者两者的结合),并且给了应用本 ...

  10. web自动化1-selenium简介及环境搭建

    selenium 开源软件 支持多浏览器Firefox.Chrome.IE 跨平台Windows.Mac.Linux 多语言 java python Ruby php js 对web支持好,多种API ...