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. 当今游戏大作share的特性大盘点

    极品游戏制作时的考虑要素大盘点 不知不觉入坑Steam已近4年,虽然说Steam的毒性让很多人走向一条不归路,但是想我这样即使"中毒"还是很快乐很感恩的.那么本期文章就谈谈我对其中 ...

  2. 【Beta】阶段 第三次Daily Scrum Meeting

    每日任务 ·1.本次会议为第三次 Meeting 会议 ·2.本次会议在周三上午9:40召开,会议时间为10分钟 一.今日站立式会议照片 二.每个人的工作(有work item的ID) 三.工作中遇到 ...

  3. return 的使用

    (一):while中使用return //编译不通过,编译器不知道isTrue()方法是否会返回true,这样不能test()方法一定有返回值. public String test(){ while ...

  4. 使用properties配置文件为javabean注入属性值

    ①:实体类 package com.hts.entity; import java.io.Serializable; public class A implements Serializable{ p ...

  5. 201521123096《Java程序设计》第十三周学习总结

    1. 本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 2. 书面作业 1. 网络基础 1.1 比较ping www.baidu.com与ping cec.jmu ...

  6. find命令基础讲解

    目录 前言 find命令 查找条件 指定搜索层级 根据文件名和inode查找 根据属名属主查找 根据文件类型查找 组合条件 根据文件大小查找 根据时间戳查找 根据权限查找 动作处理 参数替换xargs ...

  7. 复用代码【SSH配置文件】

    web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="htt ...

  8. Servlet第二篇【Servlet调用图、Servlet细节、ServletConfig、ServletContext】

    Servlet的调用图 前面我们已经学过了Servlet的生命周期了,我们根据Servlet的生命周期画出Servlet的调用图加深理解 Servlet的细节 一个已经注册的Servlet可以被多次映 ...

  9. eclipse复制到IDEA中文不匹配,编译失败

    今天使用把eclipse的包复制到Intellij Idea下,结果在编译的时候,它说我的数据是GBK,而Idea默认的数据是UTF-8,因此出错了... 解决:在项目中直接把对象的encoding. ...

  10. 在linux环境下搭建java web测试环境(非常详细!!)

    一.项目必备软件及基本思路 项目必备:虚拟机:VMware Workstation (已安装linux的 CentOS6.5版本) 项目:java web项目 (必须在本地部署编译后选择项目的webR ...