前置知识

SSL是90年代Netscape弄出来的一套东西,为的是解决HTTP协议明文传输数据的问题。后来SSL慢慢成了事实上的标准,于是IETF就把SSL标准化了,名字叫做TLS,TLS 1.0其实就是SSL 3.1。所以SSL和TLS经常被放在一起写成SSL/TLS,因为这两个名词在现在其实就是同一个东西。HTTPS是使用TLS的HTTP协议。

证书以及信任链

我们知道,HTTPS的网站都有一个自己的证书,用于表明自己的身份。证书本质上是为了让公钥能可信的传输。公钥是放在证书里面的,如果证书可信,那么公钥就也是可信的。那为什么一个公钥是可信的呢?这就要说到信任链和CA。CA指的是Certificate Authority,CA都是权威机构,他们的证书叫做根证书,这些根证书被操作系统信任,根证书信任的证书也是可信的。因此权威机构颁发的证书都能被操作系统信任,这就组成了信任链。

这里以RSA密钥交换算法为例为例,CloudFlare提供Keyless服务,把网站放到它们的CDN上,不用提供自己的私钥,也能使用SSL加密链接。

https加密解密过程:

  1. 客户端发起https请求到服务端(服务器端要一套数字证书,可以自己制作,也可以向组织申请),向服务器端索要公钥。

    发送的信息一般带上:

    • 客户端生成的一个随机值

    • 支持的SSL/TSL协议的版本号

    • 所支持的加密算法

    • Session ID(用于恢复会话)

  1. 服务端接收到客户端的请求后回应客户端以及公钥(也就是证书)传给客户端。如果带有Session ID,直接恢复对话。

    没有Session ID一般会返回这些信息给客户端:

    • 选择SSL/TLS协议的版本号

    • 选择加密方式

    • 一个服务器随机生成的数

    • 服务器的证书

  1. 客户端收到服务端发来的公钥后会解析证书,首先是由TLS层验证服务端证书是否有效,比如说颁发机构、有效时间、证书中的域名与当前会话域名是否匹配等。

    如果发现异常,就会弹出一个警告框,提示证书有问题。

    验证完证书的有效性后,客户端向服务端发送的信息包括有一下内容:

    • 证书校验没有问题的话,生成一个premaster secret(另一个随机值),然后用服务端发过来的证书对该随机值进行加密。

    • 客户端把加密的随机值传回给服务器,加密约定改变,通知服务器,其目的是让服务端得到这个随机值,以后客户端与服务端之间的通信就用协商好的加密方法和密钥进行加密。

    • 客户端握手结束通知。这个报文也是验证消息,是前面发送的所有内容的哈希值,用来供服务器校验。

  2. 服务器用私钥解密后,得到了客户端传过来的随机值(私钥),然后对该值进行对称加密。所谓对称加密就是,将信息和私钥通过某种算法混合在一起,除非知道私钥,否则无法获得内容,因而客户端和服务端都知道这个公钥,只要加密算法够彪悍,私钥够复杂,数据就越安全。

    这是握手过程的最后一步,服务器会把以下信息发送给客户端:

    • 加密约定改变通知,通知客户端,以后的通信都适用协商好的加密方法和密钥进行加密

    • 服务器握手结束通知,该报文也作为校验消息,供客户端验证

  3. 服务端利用这个私钥加密数据并发送数据给客户端,加密的数据可以被还原

  4. 客户端接收到这份数据后,利用私钥解密这段数据,于是获取了加密的内容。即时第三方在数据传输的中途获取了这份数据,没有私钥也束手无策

SSL/TLS层是位于应用层传输层之间,应用层的数据不再直接传递给传输层,而是传递给SSL/TLS层,对传过来的数据进行加密,并增加相应的头信息。

整个对话过程中(握手阶段和其后的对话),服务器的公钥和私钥只需要用到一次。这就是CloudFlare能够提供Keyless服务的根本原因。

某些客户(比如银行)想要使用外部CDN,加快自家网站的访问速度,但是出于安全考虑,不能把私钥交给CDN服务商。这时,完全可以把私钥留在自家服务器,只用来解密对话密钥,其他步骤都让CDN服务商去完成。

加解密相关知识

对称加密

对称加密(也叫私钥加密)指加密和解密使用相同密钥的加密算法。有时又叫传统密码算法,就是加密密钥能够从解密密钥中推算出来,同时解密密钥也可以从加密密钥中推算出来。而在大多数的对称算法中,加密密钥和解密密钥是相同的,所以也称这种加密算法为秘密密钥算法或单密钥算法。

常见的对称加密有:DES(Data Encryption Standard)、AES(Advanced Encryption Standard)、RC4、IDEA

非对称加密

与对称加密算法不同,非对称加密算法需要两个密钥公开密钥(public key)和 私有密钥(private key);并且加密密钥和解密密钥是成对出现的。非对称加密算法在加密和解密过程使用了不同的密钥,非对称加密也称为公钥加密,在密钥对中,其中一个密钥是对外公开的,所有人都可以获取到,称为公钥,其中一个密钥是不公开的称为私钥。

主要算法:RSA、Elgamal、背包算法、Rabin、D-H、ECC(椭圆曲线加密算法)

使用最广泛的是RSA算法Elgamal是另一种常用的非对称加密算法

RSA性能是非常低的,原因在于寻找大素数、大数计算、数据分割需要耗费很多的CPU周期,所以一般的HTTPS连接只在第一次握手时使用非对称加密,通过握手交换对称加密密钥,在之后的通信走对称加密

总结:

服务端用RSA生成公钥私钥,把公钥放在证书里发送给客户端,私钥自己保存

客户端接收到公钥后,首先向一个权威的服务器检查证书的合法性,如果证书合法,客户端产生一段随机数,这个随机数就作为通信的密钥,我们称之为对称密钥,用公钥加密这段随机数,然后发送到服务器

服务器用密钥解密获取对称密钥,然后,双方就已对称密钥进行加密解密通信了

传输服务器的证书(公钥)时,被别人窃取走了怎么办?

当然服务器没有这么笨,传给客户端的证书是被加密了的,而且是由第三方权威机构CA的私钥加密证书,第三方权威机构CA的公钥维护于(存在于)每个浏览器(无论是中间的黑客、真正的请求者,还有服务器)中。这些有CA机构颁发的证书,都是有CA机构加密了的,客户端或者中间商收到这份CA颁发的证书,都可以解密出服务器的公钥。

那么,最开始https请求到服务器给的证书(CA机构颁发的)过程中,证书到达客户端的路上被黑客拦截了,中间的 "笨笨的黑客" 向CA申请了一套自己的证书,把自家的证书发回给那个客户端,然后通过自己申请的那一套证书的私钥解密出客户端发出的信息,通过拦截下来的服务器端的公钥解密服务端返回给客户端的信息,在中间的位置窃取信息。当然这种事情不会发生,权威的CA机构颁发的证书是有数字签名的,任何组织申请的证书都有对应的证书编码,证书是颁发给谁的,使用者是谁,这些申请者的详细信息都是被记录在案,客户端接收到这份证书后会计算出证书数字签名,证书的使用者对不上也是没有用的。

这样,通过权威的CA机构和证书的数字签名,客户端和服务器端之间建立起的对话秘钥就不会被别人窃取走,即时中间的第三者拿到了服务器的公钥也没有办法解密用服务器公钥加密的内容。

https的加密解密过程的更多相关文章

  1. golang实现aes-cbc-256加密解密过程记录

    我为什么吃撑了要实现go的aes-cbc-256加密解密功能? 之前的项目是用php实现的,现在准备用go重构,需要用到这个功能,这么常用的功能上网一搜一大把现成例子,于是基于go现有api分分钟实现 ...

  2. 图解HTTPS协议加密解密全过程

    我们都知道HTTPS能够加密信息,以免敏感信息被第三方获取.所以很多银行网站或电子邮箱等等安全级别较高的服务都会采用HTTPS协议. HTTPS简介 HTTPS其实是有两部分组成:HTTP + SSL ...

  3. HTTPS协议加密解密全过程(图解)

    我们都知道HTTPS能够加密信息,以免敏感信息被第三方获取.所以很多银行网站或电子邮箱等等安全级别较高的服务都会采用HTTPS协议. HTTPS简介 HTTPS其实是有两部分组成:HTTP + SSL ...

  4. https的加密解密是怎么写的?

    原文转载至:http://blog.csdn.net/aqiangsz/article/details/53611665 文章中有些不对的地方,比如用证书对改随机码进行加密,这个是不对,证书本身并没有 ...

  5. ASP.NET中的DEC加密解密过程

    本文章分享自 青青果树园的博客,地址是:http://www.cnblogs.com/qqingmu/archive/2008/01/10/1034168.html 我们做网页时经常会遇到URL传输( ...

  6. https加密解密过程详解

    要点: https协议对传输内容进行加密,具有更强的安全性,防止被抓包后解析出请求内容. https是建立在ssl之上的http协议. 服务器支持https协议必须安装一套数字证书,所谓数字证书就是一 ...

  7. Flask-session,WTForms,POOL,Websocket通讯原理 -握手,加密解密过程

    1.Flask-session Flask中的session 需要执行 session_interface - open_session存储到redis中,存的key:session:d3f07db2 ...

  8. des加密解密——java加密,php解密

    最近在做项目中,遇到des加密解密的问题. 场景是安卓app端用des加密,php这边需要解密.之前没有接触过des这种加密解密算法,但想着肯定会有demo.因此百度,搜了代码来用.网上代码也是鱼龙混 ...

  9. winform 配置文件的加密解密

    winform 配置文件的加密解密Visual Studio 命令提示(2010) 窗口下直接输入 :解密aspnet_regiis -pdf connectionStrings 程序文件夹全目录 加 ...

随机推荐

  1. kubectl apply部署时可以用 --record 方便记录版本 和回退

    1.部署时正常时下面的 kubectl apply -f http.yaml 2.如果修改文件文件重新部署或者之前有上一个版本的  想回退上一个的 可以无感知的回退回去 不影响业务 其中http-de ...

  2. Ts基本数据类型

    TS的基本数据类型 string let str : string str = 1 //报错 会提示num是字符串 不是数字 str = 'test' //正确 //拼接字符串 let str2 : ...

  3. 限制只有VIP会员才能下载Ecshop文章页的附件

    以官方2.7.2默认模板为基础来讲述一下"如何在文章详情页限制只有VIP会员才能下载相关附件"这里假设VIP会员的等级ID为2首先修改 article.php 文件打开 /arti ...

  4. java eclipse 使用随笔

    1,无法import java.awt. 等各种文件,解决办法:(在module-info.java文件中加入requires java,desktop这句话)

  5. TP框架 商城前台用户注册方法

    //注册 public function register(){ if(IS_POST){ //接收数据 $data = I('post.'); $model = D('User'); $data[' ...

  6. vue three.js 结合tween.js 实现动画过渡

    参考地址:https://www.jianshu.com/p/d6e3b4b153bb https://www.jqhtml.com/10513.html 官方文档:https://github.co ...

  7. 鸿蒙内核源码分析(根文件系统) | 先挂到`/`上的文件系统 | 百篇博客分析OpenHarmony源码 | v66.01

    百篇博客系列篇.本篇为: v66.xx 鸿蒙内核源码分析(根文件系统) | 先挂到/上的文件系统 | 51.c.h.o 文件系统相关篇为: v62.xx 鸿蒙内核源码分析(文件概念篇) | 为什么说一 ...

  8. 密码学系列之:1Password的加密基础PBKDF2

    目录 简介 PBKDF2和PBKDF1 PBKDF2的工作流程 详解PBKDF2的key生成流程 HMAC密码碰撞 PBKDF2的缺点 总结 简介 1password是一个非常优秀的密码管理软件,有了 ...

  9. Python3入门系列之-----列表

     列表 列是Python中最基本的数据结构.序列中的每个元素都分配一个数字 - 它的位置,或索引,第一个索引是0,第二个索引是1,依此类推. Python有6个序列的内置类型,但最常见的是列表和元组. ...

  10. 3.docker容器常用命令

    docker容器的常用命令 docker有很多命令,让我们一个一个全部背下来,基本是不可能的,帮助文档的作用就很大了,想要查询那个命令,直接去找帮助文档,帮助文档地址:https://docs.doc ...