HTTPS原理解析

一、HTTPS风险

1.1 风险一: 网络嗅探与监听

用wireshark抓包时发现,途径终端ip的所有http报文都可以以明文方式被直接捕获,包括但不限于用户名、密码、报表数据等。

  • 本地src = 10.252.18.21,天枢服务器desc = 172.28.63.46。浏览器通过post方式向服务器发起请求:


    image.png
  • 服务器返回数据:


    image.png
  • 思考:不使用https的情况下,应该如何处理客户端输入的口令/提交的表单以保证数据机密性?
    前端:
    将明文数据用md5哈希;
    将哈希过的密文拼上一段随机生成的, 固定长度的盐;
    将上一步的结果使用后端的公钥加密并传递给后端.

    后端:
    将前端传递过来的密文用私钥解密;
    去盐。因为盐是固定长度的, 所以直接裁剪即可;
    再次随机生成一段盐;
    将第2步去盐后的密码拼上第3步生成的盐, 并作 md5 哈希;
    将第4步的结果和第3步生成的盐存入数据库;

    验证密码的时候, 后端只需将第2步去盐后的密码拼上从数据库中取得的盐, 作 md5 哈希后与数据库中的密码相比较即可。

1.2 风险二:身份认证缺乏校验,存在中间人攻击。

image.png

1.3 风险应对措施

  • 信息加密
    HTTP 交互信息是被加密的,第三方就无法被窃取。
  • 校验机制
    校验信息传输过程中是否有被第三方篡改过,如果被篡改过,则会有警告提示。
  • 身份证书
    证明通信双方身份的真实性。

二、HTTPS协议

2.1 HTTPS

HTTPS 协议是由 HTTP 加上 TLS/SSL 协议构建的可进行加密传输、身份认证的网络协议,主要通过数字证书、对称加密、非对称加密等技术完成互联网数据传输加密,实现互联网传输安全保护。

设计目标主要有三个。
(1)机密性(通过对称加密实现):保证传输数据内容不会被第三方知晓。就像快递员传递包裹一样,都进行了封装,别人无法获知里面装了什么。

(2)完整性(通过数字签名/哈希实现):保证传输数据内容没有被第三方篡改。就像快递员虽然不知道包裹里装了什么东西,但他有可能中途掉包,数据完整性就是指如果被掉包,我们能轻松发现并拒收。

(3)可靠性(通过非对称加密实现):保证传输数据内容只会被指定有权限的通信方收到。就像我们邮寄包裹时,虽然是一个封装好的未掉包的包裹,但必须确定这个包裹不会送错地方,通过身份校验来确保送对了地方。


image.png

2.2 SSL

Secure Socket Layer,安全套接字协议,用以保障在Internet上数据传输的安全,利用数据加密技术,保证传输数据的机密性、完整性、可靠性。

SSL是一个不依赖于平台和运用程序的协议,位于TCP/IP协议与各种应用层协议之间,为数据通信提高安全支持。

image.png

SSL协议主要分为两层:

(1)SSL握手协议层:包括SSL握手协议(SSL HandShake Protocol)、SSL密码参数修改协议(SSL Change Cipher Spec Protocol)和SSL告警协议(SSL Alert Protocol)。握手层的这些协议用于SSL管理信息的交换,允许应用协议传送数据之间相互验证,协商加密算法和生成密钥等。

(2)SSL记录协议层:为高层协议提供基本的安全服务。SSL纪录协议针对HTTP协议进行了特别的设计,使得超文本的传输协议HTTP能够在SSL运行。纪录封装各种高层协议,具体实施压缩解压缩、加密解密、计算和校验MAC等与安全有关的操作。

2.3 TLS

TLS(Transport Layer Security,传输层安全协议)建立在SSL 3.0协议规范之上,是SSL 3.0的后续版本。与SSL主要的区别在于支持的加密算法不同。
TLS对于安全性的改进:

1)对于消息认证使用密钥散列法:TLS 使用“消息认证代码的密钥散列法”(HMAC),当记录在开放的网络(如因特网)上传送时,该代码确保记录不会被变更。SSLv3.0还提供键控消息认证,但HMAC比SSLv3.0使用的(消息认证代码)MAC 功能更安全。

2)增强的伪随机功能(PRF):PRF生成密钥数据。在TLS中,HMAC定义PRF。PRF使用两种散列算法保证其安全性。如果任一算法暴露了,只要第二种算法未暴露,则数据仍然是安全的。

3)改进的已完成消息验证:TLS和SSLv3.0都对两个端点提供已完成的消息,该消息认证交换的消息没有被变更。然而,TLS将此已完成消息基于PRF和HMAC值之上,这也比SSLv3.0更安全。

4)一致证书处理:与SSLv3.0不同,TLS试图指定必须在TLS之间实现交换的证书类型。

5)特定警报消息:TLS提供更多的特定和附加警报,以指示任一会话端点检测到的问题。TLS还对何时应该发送某些警报进行记录。

三、加解密算法

image.png

3.1 非对称加密

3.1.1 特点

加密密钥≠解密密钥,公钥和私钥之间存在数学上的配对关系。

公钥:公开的,用于加密或者验签。使用公钥加密的数据,只能使用对应私钥解密
私钥:秘密的,用户解密或者签名。使用私钥签名的数据,可以使用对应的公钥验签。

3.1.2 加密机制

公钥密码:公钥加密得到密文,私钥解密得到明文消息。

image.png

数字签名:私钥加密生成签名,公钥解密验证签名
image.png

TLS常用非对称加密、密钥协商算法:
image.png

TLS常用签名算法:
image.png

ECDSA详细:https://zhuanlan.zhihu.com/p/66794410

ECC(ECDSA)与RSA 相比,有以下的优点:
a. 相同密钥长度下,安全性能更高,如160位ECC已经与1024位RSA、DSA有相同的安全强度。
b. 计算量小,处理速度快,在私钥的处理速度上(解密和签名),ECC远 比RSA、DSA快得多。
c. 存储空间占用小 ECC的密钥尺寸和系统参数与RSA、DSA相比要小得多, 所以占用的存储空间小得多。
d. 带宽要求低使得ECC具有广泛得应用前景。

注意:不要选择1024bit及以下的RSA算法做HTTPS的加密,建议使用2048bit以上的RSA。ECDHE+AESGCM最先选,目前没有已知漏洞。

3.2 对称加密

3.2.1 特点

加密密钥=解密密钥。
TLS常用对称加密算法:AES,主要有四种操作处理,分别是密钥加法层(也叫轮密钥加,英文Add Round Key)、字节代换层(SubByte)、行位移层(Shift Rows)、列混淆层(Mix Column)。


image.png

四、HTTPS通信流程

4.1 概览

image.png

4.2 具体步骤

  1. 客户端发起请求,与服务器建立TCP连接(三次握手)


    image.png
  2. TLS第一次握手
    (1)客户端->服务器 Client Hello
    消息里面有客户端使用的 TLS 版本号、支持的密码套件列表,支持的压缩算法,以及生成的随机数(Client Random),这个随机数会被服务端保留,它是生成对称加密密钥的材料之一。
    image.png

    注:TLS支持的所有加密算法: Transport Layer Security (TLS) Parameters (iana.org)
    (2)服务器→客户端 ACK
  3. TLS第二次握手
    (1)服务器->客户端 Server Hello

当服务端会确认 TLS 版本号是否支持,和从密码套件列表中选择一个密码套件,以及生成随机数(Server Random)。

接着,返回「Server Hello」消息,消息里面有服务器确认的 TLS 版本号,也给出了随机数(Server Random),然后从客户端的密码套件列表选择了一个合适的密码套件。


image.png

可以看到,服务端选择的密码套件是 “Cipher Suite: TLS_RSA_WITH_AES_128_GCM_SHA256”。

这个密码套件看起来真让人头晕,好一大串,但是其实它是有固定格式和规范的。基本的形式是「密钥交换算法 + 签名算法 + 对称加密算法 + 摘要算法」, 一般 WITH 单词前面有两个单词,第一个单词是约定密钥交换的算法,第二个单词是约定证书的验证算法。比如刚才的密码套件的意思就是:

由于 WITH 单词只有一个 RSA,则说明握手时密钥交换算法和签名算法都是使用 RSA;
握手后的通信使用 AES 对称算法,密钥长度 128 位,分组模式是 GCM;
摘要算法 SHA256 用于消息认证和产生随机数;

就前面这两个客户端和服务端相互「打招呼」的过程,客户端和服务端就已确认了 TLS 版本和使用的密码套件,而且你可能发现客户端和服务端都会各自生成一个随机数,并且还会把随机数传递给对方。

那这个随机数有啥用呢?其实这两个随机数是后续作为生成「会话密钥」的条件,所谓的会话密钥就是数据传输时,所使用的对称加密密钥。

注:配置https时,加密套件的安全性:

ECDHE+AESGCM最先选,目前没有已知漏洞。
PFS ciphersuite优先,其中ECDHE优先于DHE
SHA256优先于SHA1。完全禁用MD5。
AES 128优先于AES 256。这个问题有一些讨论。
在向后兼容模式中,AES优先于3DES。
完全禁止RC4。3DES只用于兼容老版本。

(2)服务器->客户端 Server Certificate
服务端为了证明自己的身份,会发送「Server Certificate」给客户端,这个消息里含有数字证书。


image.png

(3)服务器→客户端 Server Hello Done
目的是告诉客户端,我已经把该给你的东西都给你了,本次打招呼完毕。


image.png
  1. 客户端验证证书,验证原理如本文3.1-加密机制-数字签名。


    image.png

    image.png

    image.png
  2. TLS第三次握手

客户端验证完证书后,认为可信则继续往下走。接着,客户端就会生成一个新的随机数 (pre-master),用服务器的 RSA 公钥加密该随机数,通过「Change Cipher Key Exchange」消息传给服务端。

服务端收到后,用 RSA 私钥解密,得到客户端发来的随机数 (pre-master)。

至此,客户端和服务端双方都共享了三个随机数,分别是 Client Random、Server Random、pre-master。

于是,双方根据已经得到的三个随机数,生成会话密钥(Master Secret),它是对称密钥,用于对后续的 HTTP 请求/响应的数据加解密。

生成完会话密钥后,然后客户端发一个「Change Cipher Spec」,告诉服务端开始使用加密方式发送消息。


image.png

然后,客户端再发一个「Encrypted Handshake Message(Finishd)」消息,把之前所有发送的数据做个摘要,再用会话密钥(master secret)加密一下,让服务器做个验证,验证加密通信是否可用和之前握手信息是否有被中途篡改过。


image.png

可以发现,「Change Cipher Spec」之前传输的 TLS 握手数据都是明文,之后都是对称密钥加密的密文。
  1. TLS第四次握手

服务器也是同样的操作,发「Change Cipher Spec」和「Encrypted Handshake Message」消息,如果双方都验证加密和解密没问题,那么握手正式完成。

  1. 用会话密钥加解密请求与响应

4.3 其他

1.为什么公钥存储在客户端,私钥存储在服务器?

(1)请求是由客户端向特定服务器发起的,客户端只希望特定的服务器能解密,因此https设计成只有持有特定私钥的服务器才能解密的机制。

(2)私钥存储在用户物理机器上,每次请求用户都要输私钥(响应不过来);私钥存储在浏览器cookie上,容易泄露、被iframe读取;还有一种口令密钥协商的情况(不适合C-S http请求的应用场景)

(3)密码学角度上来说,私钥加密的数据,一定能被公钥解密。无法满足信息的机密性。

2.为什么要用随机数进行对称加密?

保证会话的前向安全性。即使本次会话的会话密钥泄露,也不会影响之前会话的秘密泄露。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 222,183评论 6 516
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,850评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,766评论 0 361
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,854评论 1 299
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,871评论 6 398
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,457评论 1 311
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,999评论 3 422
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,914评论 0 277
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,465评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,543评论 3 342
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,675评论 1 353
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,354评论 5 351
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,029评论 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,514评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,616评论 1 274
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 49,091评论 3 378
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,685评论 2 360

推荐阅读更多精彩内容

  • HTTPS 是在 HTTP 和 TCP 之间建立了一个安全层,HTTP 与 TCP 通信的时候,必须先进过一个安全...
    我写的代码绝对没有问题阅读 1,451评论 0 23
  • HTTP是什么 超文本传输协议(英文:HyperText Transfer Protocol,缩写:HTTP)是互...
    foamzou阅读 4,781评论 1 53
  • 一、前言 在说HTTPS之前先说说什么是HTTP,HTTP就是我们平时浏览网页时候使用的一种协议。HTTP协议传输...
    VincentHK阅读 379评论 0 2
  • http协议是现在网络通信中最常用的协议之一,但是由于http协议本身并没有考虑网络安全方面的问题,因此很多基于h...
    RainMi阅读 688评论 0 1
  • HTTPS可以看作是安全的HTTP,你可能听说过关于HTTPS的一些问题,比如什么握手,什么证书,加密之类的等等。...
    coolcao阅读 614评论 0 2