由于之前项目中IOS系统建议将http协议换成https协议所以查看相关资料在此记录 HTTPS 通讯过程的基本原理

问:Https是什么?

答:

HTTP 协议定义了一套规范,让客户端或浏览器可以和服务器正常通信,完成数据传输

但是,HTTP 使用明文传输,你输入的账户密码等重要信息易被中间人窃听,从而造成数据泄露,所以说 HTTP 是不安全的,为了解决安全传输的问题,人们发明了 HTTPS,即 HTTP + Secure

问:为什么 HTTPS 是安全的?

答:

只要把传输的数据加密,那么通信就是安全的,前提是除通信双方外,任何第三方无法解密

问:HTTPS 是怎么实现安全通信的?

答:

使用对称加密技术,简单而言,通信双方各有一把相同的钥匙(所谓对称),客户端把数据加密锁起来后,传送给服务器,服务器再用钥匙解密。同理,服务器加密后传输给客户端的数据,客户端也可以用钥匙解密,此处有一个新问题怎样在通信之前,给双方分配两把一样的钥匙呢?有一个简单的解决方案是:客户端在每次请求通信之前,先和服务器协商,通过某种办法,产生只有双方知道的对称密钥

这个过程就是所谓:密钥交换(Key Exchange),密钥交换算法有很多,常见的有

  • Deffie-Hellman 密钥交换算法
  • RSA 密钥交换算法

在此,以RSA算法为例进行介绍

RSA 密钥交换算法需要客户端向服务器提供一个 Pre-Master-Key,然后通信双方再生成 Master-Key,最后根据 Master-Key 产生后续一系列所需要的密钥,包括传输数据的时候使用的对称密钥。那么客户端怎么把 Pre-Master-Key 告诉服务器呢?

在此引入一种新的加密技术:非对称加密(服务器可以生成一对不同的密钥,一把私自保存,称为私钥;一把向所有人公开,称为公钥
这对密钥有这样的性质:公钥加密后的数据只有私钥能解密,私钥加密后的数据只有公钥能解密)

具体的交互过程:

  1. 客户端向服务器索取公钥 PublicKey;
  2. 服务器将公钥发给客户端(这里没有保密需求,因为公钥是向所有人公开的);
  3. 客户端使用服务器的公钥 PublicKey 把 Pre-Master-Key 加密成密文,传送给服务器;
  4. 服务器用私钥 PrivateKey 解密密文,获取到客户端发送的 Pre-Master-Key;

在此又会引发新的问题,由于互联网是公开的,服务器发送给客户端的公钥可能在传送过程中被中间人截获并篡改(所谓中间人攻击 Man-in-the-middle attack,缩写:MITM),因为中间人也可以生成一对非对称密钥,它会截获服务器发送的公钥,然后把它自己的公钥 MiddleMan-PublicKey 发送给客户端,进行欺骗。

为了解决这个问题,服务器需要到权威机构 (Authority) 办一张证书 Certificate,上面记载了服务器的域名、公钥、所属单位,还有签发机关、有效期等当客户端收到服务器发过来的证书后,只要证书不是伪造的,那么上面记载的公钥肯定也就是真的!

不过,这里又有个新问题:怎么证明证书不是伪造的?

只要服务器发送的证书上有权威机构 Authority 的签名,就可以确信证书是颁发给服务器的,而不是谁伪造的

如此看来

HTTPS 通信过程已经很明朗了:

  1. 操作系统/浏览器 自带了 CA 根证书;
  2. 客户端因此可以验证服务器发送的证书真实性,从而获取到服务器的公钥;
  3. 有了服务器的公钥,客户端就可以把 Pre-Master-Key 传送给服务器;
  4. 服务器获取到 Pre-Master-Key 后,通过后续产生的对称密钥,就可以和客户端加密通信了。

HTTPS 加密原理探究的更多相关文章

  1. HTTPS加密原理(转)

    Header HTTP.HTTPS在我们日常开发中是经常会接触到的. 我们也都知道,一般 Android 应用开发,在请求 API 网络接口的时候,很多使用的都是 HTTP 协议:使用浏览器打开网页, ...

  2. HTTPS加密原理与过程

    HTTPS加密原理与过程 HTTP 超文本传输协议一种属于应用层的协议 缺点: 通信使用明文(不加密),内容可能会被窃听 不验证通信方的身份,因此有可能遭遇伪装 无法证明报文的完整性,所以有可能已遭篡 ...

  3. HTTPS加密原理

    http(超文本传输协议) 一种属于应用层的协议 缺点: 通信使用明文(不加密),内容可能会被窃听 不验证通信方的身份,因此有可能遭遇伪装 无法证明报文的完整性,所以有可能已遭篡改 优点: 传输速度快 ...

  4. https 加密原理

    转载于 https://www.cnblogs.com/imteck4713/p/12016313.html 补充: <图解HTTP> 1.引言 随着互联网安全意识的普遍提高,对安全要求稍 ...

  5. 一篇读懂HTTPS:加密原理、安全逻辑、数字证书等

    1.引言 HTTPS(全称: Hypertext Transfer Protocol Secure,超文本传输安全协议),是以安全为目标的HTTP通道,简单讲是HTTP的安全版.本文,就来深入介绍下其 ...

  6. HTTPS加密通信原理及数字证书系统

    https加密通信原理: 公钥私钥成对,公钥公之于众,私钥只有自己知道. 用公钥加密的信息只能由与之相对应的私钥解密. 甲给乙发送数据时,甲先用乙的公钥加密这段数据,再用自己的私钥对这段数据的特征数据 ...

  7. 理解 HTTPS 工作原理(公钥、私钥、签名、数字证书、加密、认证)(转)

    本文摘录参考: 细说 CA 和证书(主要讲解 CA 的使用) 数字签名是什么?(简单理解原理) 深入浅出 HTTPS 工作原理(深入理解原理) HTTP 协议由于是明文传送,所以存在三大风险: 1.被 ...

  8. HTTPS工作原理

    HTTPS是什么 HTTPS全称为Hypertext Transfer Protocol over Secure Socket Layer,及以安全为目标的HTTP通道,简单说就是HTTP的安全版本. ...

  9. HTTPS实现原理

    HTTPS实现原理 HTTPS(全称:Hypertext Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版 ...

随机推荐

  1. sql存储过程循环实现事务

    //往一张表中添加数据,获取添加数据生成的ID,再往另一张表中添加多条数据 ALTER PROCEDURE [dbo].[AttendanceCardAndDetail_Add] @SchoolID ...

  2. hdu 5279 YJC plays Minecraft——生成函数

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=5279 令 n 个点的树的 EGF 是 g(x) ,则 \( g(x) = \sum\limits_{i=0 ...

  3. (转)使用OpenGL显示图像(五)添加移动

    添加移动 编写:jdneo - 原文:http://developer.android.com/training/graphics/opengl/motion.html 转:http://hukai. ...

  4. Java Freemarker生成word

    Java Freemarker生成word freeMaker 简介: FreeMarker是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页.电子邮件.配置文件.源代 ...

  5. 02 java语言基础

    常量:字面值常量(字符串,字符,整数,小数,布尔,null),自定义常量,''这个不是字符常量,""这个是字符串常量 进制: 02.01_Java语言基础(常量的概述和使用) A: ...

  6. 使用latex绘制多层神经网络结构图

    1,使用Tikz包: 2,参考官方例程单层神经网络结构,绘制了一个含有3隐藏层的BP神经网络节点图 代码如下: \documentclass{article} \usepackage{tikz} \b ...

  7. 如何深入理解Java泛型

    一.泛型的作用与定义 1.1泛型的作用 使用泛型能写出更加灵活通用的代码泛型的设计主要参照了C++的模板,旨在能让人写出更加通用化,更加灵活的代码.模板/泛型代码,就好像做雕塑时的模板,有了模板,需要 ...

  8. org-mode记录总结

    org-mode记录总结 */--> code {color: #FF0000} pre.src {background-color: #002b36; color: #839496;} cod ...

  9. 详解 Flexible Box 中的 flex 属性

    导读: 弹性盒子是 CSS3 的一种布局模式,一种当页面需要适应不同的屏幕大小以及设备类型时确保元素拥有适当的行为的布局方式.其中 flex 属性用于指定弹性子元素如何分配空间. flex 属性的值 ...

  10. html 中手写阴影弹窗框封装

    // 弹出提示框 function popup(pWidth,content) { $("#msg").remove(); var html ='<div id=" ...