Android 网络编程之HTTPS详解

前言:HTTPS涉及相关的知识,老是很难的将其概括总结起来,本文旨在带你学习详细的HTTPS相关知识点,看完本文后,你会了解到如下相关知识点;html

  • HTTPS的工做原理
  • HTTPS为何要这样设计
  • 密码学相关原理

本文篇幅较长,建议收藏,慢慢食用,那么接下来让咱们开启HTTPS的学习之旅吧!git

本章目录

  • 一、HTTPS是什么?
  • 二、什么是加密?
  • 三、什么是对称加密?
  • 四、什么是非对称加密?
  • 五、数字证书
  • 六、什么是SSL/TSL?

本章结构图

一、HTTPS是什么?

1.一、HTTPS的介绍

HTTPS简称:超文本传输安全协议(英语:HyperText Transfer Protocol Secure,缩写:HTTPS);github

HTTPS是基于HTTP上扩展出的一种安全的传输协议,在很早以前,HTTP的不安全为人所诟病,而一些金融领域,涉及到敏感信息的通讯,HTTP已经远远不知足需求了,因此安全的传输协议已经迫在眉睫了;算法

HTTPS协议发明出来的主要目的就是保护互联网的传输过程当中,保护数据的隐私和完整性,最开始是由网景公司(Netscape)在1994年首次提出的协议,后来就扩展到互联网上了;编程

1.二、HTTP的痛点

HTTP协议,是咱们目前使用最多,也是最普遍的协议,几乎咱们无时无刻不在使用着它,可是HTTP有一个致命的缺点,就是不能进行安全的传输;浏览器

网络的世界是很复杂的,若是有人想要窃取或者篡改某些你要传输的数据,那么在HTTP协议上是很容易出现的,好比登陆、转帐这些极其敏感的操做,若是不使用安全的传输协议,那么就很容易被不法分子所利用,致使损失惨重;缓存

那么安全的传输协议也就天然而然的诞生了,而想保证安全性,那么加密这一块,是必不可少的,而HTTPS就是基于这些加密算法,来保证了安全传输;安全

1.三、HTTPS是怎么工做的?

HTTPS是基于HTTP的基础上进行工做的,经过加密协议对通讯进行加密,该协议称之为传输层安全性(TLS),之前是被称做为SSL;服务器

该协议经过协商密钥,以及验证身份的方式,来保证通讯的双方数据不被获取到,以此来保证数据传输的安全性;markdown

而这其中涉及到不少算法,好比哈希算法,对称加密算法,非对称加密算法,数字证书等相关知识;

接下来咱们来一步步分解,深刻探索;

二、什么是加密?

2.一、加密

将内容转换为没法识别的密文,这个过程就叫作加密;

好比有一串中文:我是祖国的花朵。

那么加密后可能就变成:HSUUI&&*768SASKD&7980%8SHOS%^$hUSHHD&6788

那么上面的那一串密文是没法直接读取过来的,必需要经过解密后,才能够看到内容;

而加密的方式有不少,这里就先讲讲几种主要使用的加密方式;

2.二、哈希

哈希算法是不可逆加密算法;

为啥叫不可逆呢?

由于加密后的内容是没法被转化为原来的内容的,那么到这里你是否会有疑问?

既然加密后不能转化为原来的内容,那么这个加密还有什么用呢?

不可逆加密的用途,大多都是用于数据校验,不可逆加密算法有一个很大的特色就是,和原内容强相关,什么意思呢?

就是说原内容,通过不可逆算法生成的值,是和原内容息息相关的,若是原内容被篡改了一个字符或者几个字符时,生成的值就和原来的大不相同了;

因此这种特色很是适合于传输过程当中的数据校验,判断数据在传输过程当中是否被篡改了;

可是并不能避免数据被篡改,只是能够洞察到这种被篡改的状况;

三、对称加密

3.一、什么是对称加密

对称加密,简而言之就加密和解密使用的密钥是一致的;

也就是说使用对称加密的双方,都持有相同的密钥,用于加密和解密;

下面咱们从一张图里能够形象的看出对称加密算法加密解密的流程;

对称加密中,有几种常见的数学算法,目的是为了让被加密的数据尽量的复杂,避免被很容易的po解,那么经常使用的数学算法有哪些呢?

3.二、对称加密涉及的数学计算有哪些?

(1) 移位和循环移位
移位就是数码按照必定的顺序进行移动,好比有一段数码为12345678,那么其右移后变成23456781,左移后变成81234567;
(2)置换
将数码中的数据根据置换表,进行移位,移动后的数据会变得杂乱无章; 好比一段置换表为:2,4,1,5,3,6; 那么123456这个数据根据这个置换表,进行置换后,数据就变成了:315246;

固然我这里只是举例,实际的置换表有64位,远远比这个复杂;

(3)扩展

将数码中的数据扩展为比原来更长的数据,能够利用置换表进行扩展;

(4)压缩

将数码中的数据压缩为比原来更短的数据,同理能够利用置换表进行压缩;

(5)异或 为二进制布尔代数运算

(6)迭代

进行屡次重复的运算,这在加密算法里很常见,可让数据变得更复杂和更难以po解;

3.三、DES算法的工做原理

下面咱们来分析一下最多见的对称加密算法DES,以及其对应的工做原理;

(1):DES描述

DES算法全称为Data Encryption Standard,即数据加密算法,是IBM公司研发出来的对称加密算法,DES算法是典型的分组加密算法,也是应用最普遍的对称加密算法;

(2):DES工做原理

先来看一张流程图:

这里涉及太多复杂的操做,一时半会讲不完,这里就先缩略了,感兴趣的能够看看这位大佬写的文章:算法科普:神秘的 DES 加密算法

DES非对称加密算法是最为常见的分组加密算法,其核心在于置换与移位的数学运算,因为其加密算法是公开的,那么密钥的保密就很是的关键了,只要密钥泄露了,那么数据就会垂手可得的被po解了;

四、非对称加密

4.一、非对称加密是什么?

非对称加密,理解起来很简单,就是加密和解密的密钥不同,正如这个名称所说的非对称;

下面咱们以RSA非对称加密来举例;

非对称加密有两组密钥,一组为公钥,一组为私钥,这里为啥要组来称呼呢? 这个与非对称加密的原理有关,请继续往下看!

非对称加密的密钥格式为(a,b),a和b能够为任何整数,好比公钥(1234,12),私钥(1234,34)这种;固然我这里只是举例,这里的公钥和私钥没有关联关系;

上面为啥要说我这里随便写的没有关联关系呢?由于公钥和私钥是一一对应的,也就是说用公钥加密的,只能用对应的私钥才能解开;

那么到这里你是否有疑问了,为何非对称的加密和解密的秘钥不一致?而不和对称加密同样,经过算法能够加密和解密内容;

4.二、RSA非对称加密算法

下面咱们来说讲RSA的加密和解密算法;

假设咱们加密的公钥为(n,e);

加密算法:

( )

RSA的加密算法为上面这个公式,所谓的加密,就是求这个公式的c,这里的m表示明文;

这个公式的解读:m的e次方除以n的余数为c,求c的值;

假如咱们的明文m为12,公钥为(3233, 17);

那么代入公式后: ( )

那么获得的结果c为:1730,那么1739就是用公钥加密后的结果;

接下来来看看解密算法;

假设咱们解密的私钥为(n, d);

解密算法:

( )

RSA的解密算法为上面这个公式,所谓的解密,就是求这个公式的m,这里的c表示密文;

这个公式的解读:c的d次方除以n的余数为m,求m的值;

这里解密的私钥为(3233,2753),通过公钥加密后的密文c为:1730;

那么代入公式后: ( )

那么获得的结果为:12;

到这里RSA的加密解密算法就讲完了,RSA的加密解密和对称加密算法DES还不同,没有DES的操做那么复杂,各类对数据进行置换,迭代,逆置换之类的,RSA的加密解密就是简单粗暴的进行n次方计算,最后求余数;

这里只是举了两个简单的密钥,而实际上的密钥不可能这么短,目前已有公开的po解的是768位,比较安全的是1024位,超级安全的是2048位;

那么到这里你是否已经明白,为何RSA非对称加密算法相对对称加密算法会比较耗时呢?

这是由于RSA算法的加密解密都会进行屡次的平方,密钥越长,那么通过的平方也就越多,所以会致使运算变慢;

4.三、RAS非对称加密算法的原理

上面咱们讲了RSA非对称加密和解密算法,那么你是否会有疑问?

两组不相同的秘钥,经过不一样的算法确认将明文加密后,正常解密为原来的明文,这是怎么作到的呢?那么让咱们带着疑问继续看下去;

在开始以前,咱们先来说讲非对称加密涉及的数学原理;

1. 互质关系

什么是互质关系呢?

解读:若是两个正整数,除了1之外,没有其余公因子,咱们就称这两个数是互质关系(coprime);

好比15和11,24和19,这个关系相信理解起来并不难;

2. 欧拉函数

什么是欧拉函数?

请思考一个问题:给出一个正整数,求小于这个正整数的互质数有多少个?

上面这个问题的求证过程就是欧拉函数欧拉函数是用于求小于某个数的互质数的个数,用来表示;

好比 ,表示10的互质数分别有:9,7,5,3,1,那么加起来就为5个;

3. 欧拉定理

欧拉定理指的是:若是有两个整数a和b互质,那么下面的公式就会成立;

( )

解读:a的次方除以b的余数为1;就是欧拉函数;

对于欧拉定理的证实比较复杂,这么咱们就不过多深刻了,以避免跑题;

4. 模反元素

模反元素指的是:若是两个正整数a和b互质,那么必定能够找到整数k,使得 ak-1 被b整除,或者说ak被b除的余数是1。

公式为: ( )

欧拉定理能够用来证实上面的公式必然成立;

如: ( )

那么到这里,涉及的数学知识就讲完了,接下来咱们就来说讲非对称加密的公钥和私钥是怎么生成的;

密钥生成步骤:

第一步:随机选择两个互质数p和q;

第二步:将这两个质数想相乘,那么获得的结果为n;

第三步:求这个结果的欧拉函数,也就是

第四步:随机选择一个整数e,e要大于1且小于

第五步:计算e对于于的模反元素d,也就是求公式: ( );

最终咱们有了六个数据,分别为:p,q,n,,e,d;

这里将n和d封装成公钥(n,e),而后将n和d封装成私钥(n,d),固然这里只是举例,实际状况是用ASN.1格式来表示的;

接下来咱们来看看RSA非对称加密的安全性,由上面生成的密钥可知,对外公布的公钥为(n,e),那么咱们能不能在已知公钥的状况下,推导出私钥呢?

已知n,要解出d的值;

根据上面的步骤五的公式, ( ) ,要求出d的值就得先知道和e的值,才能求出来;

而根据上面的步骤三的公式,的值得先知道p和q才能求出来;

而要求出p和q的值,就得对n作因数分解,可是对于大整数的分解是极其困难的,目前公布的被po解的RSA密钥最长为768位,而1024位的是比较安全的,2048位是极其安全,4096位是变态安全;

对于私钥解密公式的证实,这里就不过多深刻探究了,感兴趣的请看这位巨佬写的两篇文章,超级详细;

RSA算法原理(一)
RSA算法原理(二)

五、数字证书

5.一、什么是数字签名?

刚看完非对称加密,接下来咱们来看看数字签名;

在看下去以前,咱们来思考一个问题,在通讯的双方,若是发生了第三方攻击,也就是有黑客截取了主机A发送给主机B的数据,而且进行篡改后,在发送给主机B,而这时候主机B拿到的已经不是主机A发过去的原始数据了,数据已经被篡改了,那么咱们怎么避免这种状况发生呢?

答案是:数字签名

那么这里可能会有疑问了?我使用非对称加密不就好了吗,第三方就算截取了个人数据,可是仍是解密不了;

没错,非对称加密虽然能够防止被po解,可是仍是不能防止被篡改,要是攻击者,把截取到的密文,修改了几个字符,那么接收者经过私钥解密后的内容就已经不是原来的内容了,因此这种方案仍是不严谨;

咱们先来看一下什么是数字签名?

数字签名其实就至关于人类的签名,数字签名就是通讯的时候对数据进行签名,签名的做用就是通讯的双方能够辨识该数据的身份,以避免被伪造身份;

那么数字签名是怎么实现的呢?

假如正在通讯的主机A和主机B,主机A持有私钥,主机B持有主机A的公钥;

首先,主机A使用Hash算法对数据生成一段摘要值,而后再用私钥对这个摘要值加密,并将这个摘要值附在数据后面,发送给主机B;

主机B接收到数据后,使用公钥对这个摘要进行解密,而后再使用Hash算法对数据生成摘要值,将生成的摘要值,和解密后的摘要值进行比较,若是一致,那么则认为该数据持有的人是对的人,而不是被假冒的第三方;

第一种状况,使用公钥加密,私钥解密:

第二种状况,使用私钥加密,公钥解密:

看到这里,你是否会有疑惑,这两种状况是否还存在风险呢?

假如第一种状况,公钥被别人盗取了,那么别人就能够用这个公钥来假冒身份进行通讯,而通讯的对方识别不出来;

第二种状况,私钥泄露了,那么同理别人也能够用这个私钥来假冒身份进行通讯;

那么怎么解决以上这两种问题呢?

那么就轮到咱们的主角登场了,那就是:数字证书;

5.二、数字证书

数字证书是什么?

说的通俗易懂的,数字证书其实就至关于身份证,用于证实你是你,而不是被别人冒充的你,而数字证书的做用,用于在服务器出示证书验证身份用的;

做用就是为了不第三方攻击,也就是别人冒充你去和对方进行通讯,在通讯的时候起到鉴别身份的做用;

数字证书是怎么起到鉴别身份的做用呢?

数字证书是由一个权威机构颁发的,这个权威机构叫CA,英文全称:certificate authority,又被称为证书中心;

这个CA中心,相似于公安局那种权威机构,给咱们办理的身份证就是权威的,其余机构可信任的;

而CA中心就是这种原理,颁发的证书,能够被浏览器和客户端所信任;

接下来咱们来看看证书都包含着哪些内容?

其实有一个很简单的方法,打开浏览器,输入百度的地址,而后点击左上角的锁头就能看到百度网站使用的证书,如图:

从上图能够看出,证书主要包含的主要内容有:

下面咱们来看看数字证书是怎么验证身份的;

假设浏览器和服务器正在进行HTTPS通讯:

首先,服务器会先把他的数字证书发送给浏览器,也就是上面图片这个,可是这个证书的相关内容是被CA的私钥加密过的;

浏览器持有CA内嵌的证书,包含有CA的公钥,而这个内嵌的证书叫作根证书,浏览器收到服务器发送过来的数字证书,那么就用CA的公钥对这个证书进行解密,解密成功,则表示该证书可信任,那么就认为服务器的身份正常;

而后浏览器将验证解密后的数字证书,会验证证书的有效期,还有服务器的地址是否正确(避免钓鱼网站),提取证书里服务器的公钥验证签名,若是都验证经过了,那么才会进行正常的通讯,若是验证不过,那么就会创建链接失败,或者是提示用户,该网站不可信,请谨慎访问,给用户选择权;

那么到这里你是否会有疑问了?黑客照着这个证书仿照一个不行吗?这样不就能够骗过浏览器了?

黑客拿不到CA机构的私钥,因此无法伪造证书,所以这个问题不成立;

那么你是否又会有疑问了,黑客去权威机构申请一个证书不就好了吗?

答案是不行的,为啥呢? 由于证书的申请须要认证身份的,黑客无法假冒身份去申请证书;

假设浏览器和服务器经过非对称算法来加密数据,那么下面咱们经过流程图来看看浏览器和服务器是怎么经过数字证书来校验身份的;

六、SSL/TSL

6.一、什么是SSL?

SSL简称安全套接字协议,SSL协议是HTTPS的保障,HTTPS等于HTTP+SSL;

SSL协议位于应用层和传输层之间,用于保障通讯双方的安全传输;

如图所示:

而TSL是SSL的升级版,虽然咱们大多数时候称呼安全协议为SSL,可是大部分使用的都是TSL的协议;

咱们上面讲的方案是使用非对称加密来进行安全传输的,而事实是非对称加密使用的算法比较耗时,那么咱们真正商用的时候,不可能使用这种非对称算法来进行数据的加解密;

那么怎么解决这种缺陷呢?

既然非对称加密算法比较耗时,而对称加密算法则不会很耗时,可是对称加密算法的密钥不安全,那么咱们能够结合这两种加密算法来进行安全传输;

如图所示:

1,使用对称加密来加密数据;
2,使用非对称加密来加密对称加密的密钥;

那么SSL协议具体是怎么实现的呢?

SSL协议的具体实现并不像上面这种简单的实现,实际状况是,经过几回握手来进行密钥的协商,最终协商出通讯双方使用的对称加密的密钥;

6.二、SSL协议

SSL协议的具体划分:

SSL体系分为SSL握手协议层和SSL记录协议层;

SSL握手协议层包含SSL握手协议,SSL密码变化协议,SSL警告协议,主要用于SSL的信息交换,协商加密算法以及密钥生成等操做;

SSL记录协议层主要针对应用层协议HTTP协议进行特别的设计,使HTTP协议可以在SSL协议层正常运行,主要用于加密解密,以及MAC校验等安全操做;

说了这么多,那么SSL协议是怎么来保证安全传输的呢?

别急,且听我细细道来;

6.三、SSL协议层是怎么创建链接的?

在上一篇文章,我讲了TCP链接是经过握手来创建链接的;

Android 网络编程之TCP、UDP详解

而SSL协议,促使通讯的双方,经过SSL握手来创建通讯的安全通道,那么SSL是怎么让HTTP达到安全传输的目的的呢?

在开始讲以前,咱们来思考几个问题;

(1)SSL握手总共有几回?
(2)SSL握手是怎么协商密钥的?
(3)SSL安全通道是否可复用?

接下来,让咱们带着这几个问题,来学习SSL握手吧;

咱们先来看一下SSL握手的流程图:

假设咱们经过客户端访问百度网站,客户端向服务器发起请求,此时双方尚未创建起安全通讯;

第一次握手:

客户端向服务器发送ClientHello消息,这个消息包含一个随机数 Random1(用于后续生成密钥使用),客户端支持哪一种加密的相关信息(加密套件),SSL版本等信息;

服务器收到消息后,那么就会回客户端一个ServerHello消息,包含一个随机数Random2,以及服务器使用哪一种加密的相关信息(加密套件),那么这时候客户端和服务器都有了两个随机数:Random1 + Random2

从上面能够看出,第一次握手的主要做用的沟通协商通讯双方支持的加密信息,以及生成随机数;

第二次握手:

第二次握手由服务器发起,服务器向客户端发送Certificate消息,消息包含数字证书,而后客户端验证服务器发送过来的证书,验证完毕后,取出证书中公钥,这里客户端是怎么经过数字证书验证身份的,上面已经讲过了,这里就再也不多说;

从上面能够看出第二次握手主要做用是校验身份,这里主要是客户端校验了服务器的身份,若是服务器要求客户端也要校验身份,那么客户端也须要将数字证书发送给服务端;

第三次握手:

第三次握手由客户端发起,客户端向服务器发送Client Key exchange消息,客户端生成一个随机数Random3,而后使用服务器的公钥加密这个随机数Random3,生成pre-master,而后将这个加密后的pre-master发送给服务器;

服务器接收到这个使用公钥加密后的pre-master,而后服务器使用私钥解密这个pre-master,获得Random3,那么这时候服务器和客户端都持有Random1 + Random2 + Random3

那么这个东西是用来干吗的呢?

答案是:对称机密

服务端和客户端使用这一串随机数,使用相同的算法生成对称加密的密钥,用于通讯的双方的数据加密;

而这一串随机数的生成,避免了对称加密的密钥泄露的问题;

第四次握手:

第四次握手客户端向服务器发送一个加密后的消息,使用对称密钥加密消息,使用非对称密钥加密对称加密的密钥,而后使用非对称密钥进行签名,这个上面已经讲过了,这里就再也不多说;

而服务器也使用一样的操做向客户端发送一个加密后的消息;

第四次握手的主要做用是用于检验通讯的双方协商的密钥是否有效;

下面请看具体的流程图:

固然,实际的握手比这个还要复杂,由于涉及到太多计算机专业术语,这里不打算讲太多,容易把人绕晕,能理解过程就能够了;

若是有想要深刻了解的小伙伴,能够看看这篇文章,讲的很详细:

SSL/TLS协议详解

6.四、SSL协议优化

那么看到这里,你是否会有疑问,若是客户端和服务端每次进行HTTPS通讯的时候,都须要进行四次握手来创建安全通道,那么这样会形成很大的开销,而HTTPS做为商用的通讯机制,那么确定是已经考虑过这个问题了,那么究竟是怎么解决的呢?

答案是:SSL会话复用;

会话复用,说白了就是已经创建过一次HTTPS链接的双方,当再次通讯时,能够复用以前已经创建好的通道;

那么究竟是怎么作到复用的呢?

有两种方案:

第一种方案session ID机制

1,首先,若是客户端和服务器已经成功创建链接,那么服务器就会返回一个session ID给客户端,服务器会保存这个session ID相关的通讯信息;

2,当客户端再次发起HTTPS请求时,会将这个session ID传给服务器;

3,服务器接收到session ID后,经过session ID获取本地的缓存,判断缓存是否过时,若是没有过时,那么则继续复用该session ID对应的通讯信息,因而直接跳过了前三次握手,直接进去第四次握手;

4,若是第四次握手双方验证数据成功后,那么就表示第四次握手成功,双方能够进行通讯了;

看到这里你是否发现了一个问题,若是每一个服务器将每一个客户端的session ID相关信息都保存到服务器的话,那么就会面临占用资源过大的问题,若是客户端较少,那么该问题不存在,可是现实是客户端的数量是巨大的,服务器得考虑性能问题;

那么这个问题要怎么解决呢? 请看第二种方案;

第二种方案session ticket;

1,若是客户端和服务端已经创建起链接了,那么服务器会将使用公钥加密后的session ticket发送给客户端,由客户端来保存;

2,若是客户端须要和服务端再次创建链接,那么就会将session ticket相关的加密信息发送给服务端;

3,若是服务器能够正常解密这个session ticket,那么表示该session ticket有效,那么服务器就会进入第四次握手,若是解密失败,那么按正常的握手流程走;

4,若是客户端解密服务器的数据成功后,那么第四次握手成功;

方案二与方案一不一样的地方,在于将对应的通讯信息,放到客户端来保存,由非对称密钥来保证安全性,大大的下降了服务器的压力;

很高兴再次见到你!

上面咱们讲了一堆东西,Hash,对称加密,非对称加密,数字证书,SSL等相关知识,那么HTTPS具体是怎么实现的呢?

那么请看下面最后的总结

总结

HTTPS的实现原理

HTTPS的实现,等于HTTP+SSL,而SSL协议作的主要工做是,帮助通讯的双方,创建起通讯的安全通道,经过四次握手,进行身份验证,密钥协商等操做,让服务器与客户端经过对称加密算法进行数据的加密,而后经过非对称加密算法来进行数据的签名,保证数据的完整性,以此来达到安全传输的目的;

请看最后总结的流程图:

从这里能够看出,最重要的一步,就是SSL协议,是HTTPS的基石;

那么到这里HTTPS相关的知识就已经讲完了,若是你有更好的观点,或者文中有哪些不合理的,均可以在评论区留言;

参考&感谢

算法科普:神秘的 DES 加密算法
RSA算法原理(一)
RSA算法原理(二)
通俗理解数字签名,数字证书和https 证书颁发机构 SSL/TLS协议详解
SSL/TLS 握手过程详解
HTTPS系列干货(一):HTTPS 原理详解
SSL/TLS 握手过程详解

其余

Android 你不得不学的HTTP相关知识
Android 网络编程之TCP、UDP详解

关于我

兄dei,若是个人文章对你有帮助的话,请帮我点个赞吧️,也能够关注一下个人Github博客;

本文使用 mdnice 排版

相关文章
相关标签/搜索