HTTPS 到底加密了什么?

HTTPS 到底加密了什么?

2018/07/03 · 基础技术 ·
HTTPS

原文出处:
云叔_又拍云   

关于 HTTP 和 HTTPS
这个老生常谈的话题,我们之前已经写过很多文章了,比如这篇《从HTTP到HTTPS再到HSTS》,详细讲解了
HTTP 和 HTTPS 的进化之路,对的没错,就是 HTTP 兽进化 HTTPS 兽。

图片 1

那么今天我们主要聊一聊 HTTPS 到底加密了些什么内容。

先跟大家讲个故事,我初恋是在初中时谈的,我的后桌。那个时候没有手机这类的沟通工具,上课交流有三宝,脚踢屁股、笔戳后背以及传纸条,当然我只能是那个屁股和后背。

说实话传纸条真的很危险,尤其是这种早恋的纸条,被抓到就是一首《凉凉》。

于是我和我的小女朋友就商量一下加密这个小纸条上面的数据,这样就算被班主任抓到她也奈何不了我们!

我们用将英文字母和数字一一对应,组成一个密码本,然后在小纸条上写上数字,要将他翻译成对应的字母,在拼成拼音才能知道这串数字意思。

上面就是最初我坎坷的感情史。

后来等我长大了,才知道这是回不去的美好。如果给我一个机会,我愿意……啊呸,跑偏了,等长大了才知道,这个就是现在网站数据传输中的
HTTPS。

STEP 4: 客户端解析证书

这部分工作是由客户端的TLS 来完成的。

  1. 首先会验证证书是否有效,这是对服务端的一种认证,比如颁发机构,过期时间等等,如果发现异常,则会弹出一个警告框,提示证书存在问题。
  2. 如果证书没有问题,那么浏览器根据步骤 3 的 server_random
    生成一个随机值 premaster_secret (前 2 个字节是协议版本号,后 46
    字节是用在对称加密密钥的随机数字)和
    master_secret 。 master_secret 的生成需要 premaster_key ,并需要
    client_randomserver_random 作为种子

    master_secret = PRF(pre_master_secret, "master secret", client_random + server_random)
    

    现在,各方面已经有了主密钥 master_secret
    ,根据协议约定,我们需要利用PRF
    生成这个会话中所需要的各种密钥,称之为“密钥块”(Key Block ):

    key_block = PRF(SecurityParameters.master_secret, "key expansion", SecurityParameters.server_random + SecurityParameters.client_random);
    密钥块用于构成以下密钥:
    client_write_MAC_secret[SecurityParameters.hash_size]
    server_write_MAC_secret[SecurityParameters.hash_size]
    client_write_key[SecurityParameters.key_material_length]
    server_write_key[SecurityParameters.key_material_length]
    client_write_IV[SecurityParameters.IV_size]
    server_write_IV[SecurityParameters.IV_size]
    

    这是由系列 Hash 值组成,它将作为数据加解密相关的Key Material
    ,包含六部分内容,分别是用于校验一致性的密钥,用于对称内容加解密的密钥,以及初始化向量,客户端和服务器端各一份。其中,write MAC key
    ,就是session secret 或者说是session key
    Client write MAC key 是客户端发数据的session secret
    Server write MAC secret 是服务端发送数据的session key
    MAC(Message Authentication Code)
    ,是一个数字签名,用来验证数据的完整性,可以检测到数据是否被串改。然后用证书公钥
    public_key
    对该随机值进行加密。就好像上面说的,把随机值用锁头锁起来,这样除非有钥匙,不然看不到被锁住的内容。

  3. Hash 握手信息,用第3步返回约定好的 Hash 算法对握手信息取 Hash
    值,然后用随机数加密“握手消息+握手消息 Hash 值(签名)”

多了 SSL 层的 HTTP 协议

简而言之,HTTPS 就是在 HTTP 下加入了 SSL
层,从而保护了交换数据隐私和完整性,提供对网站服务器身份认证的功能,简单来说它就是安全版的
HTTP。

现在随着技术的发展,TLS 得到了广泛的应用,关于 SSL 与 TLS
的差别,我们不用在意,只要知道 TLS 是 SSL 的升级版本就好。
图片 2
一般来说,HTTPS
主要用途有三个:一是通过证书等信息确认网站的真实性;二是建立加密的信息通道;三是数据内容的完整性。
图片 3

上文为又拍云官网,我们可以通过点击浏览器地址栏锁标志来查看网站认证之后的真实信息,SSL证书保证了网站的唯一性与真实性。

那么加密的信息通道又加密了哪些信息呢?

签发证书的 CA
中心会发布一种权威性的电子文档——数字证书,它可以通过加密技术(对称加密与非对称加密)对我们在网上传输的信息进行加密,比如我在
Pornhub 上输入:

账号:cbssfaw

密码:123djaosid

可是这个数据被黑客拦截盗窃了,那么加密后,黑客得到的数据可能就是这样的:

账号:çµø…≤¥ƒ∂ø†®∂˙∆¬

密码:∆ø¥§®†ƒ©®†©˚¬

图片 4

最后一个就是验证数据的完整性,当数据包经过无数次路由器转发后会发生数据劫持,黑客将数据劫持后进行篡改,比如植入羞羞的小广告。开启HTTPS后黑客就无法对数据进行篡改,就算真的被篡改了,我们也可以检测出问题。

对称加密

客户端与服务器使用相同的密钥对消息进行加密
优点:

  • 加密强度高,很难被破解
  • 计算量小,仅为非对称加密计算量的 0.1%

缺点:

  • 无法安全的生成和管理密钥
  • 服务器管理大量客户端密钥复杂

对称加密与非对称加密

对称加密

对称加密是指加密与解密的使用同一个密钥的加密算法。小编初中的时候传纸条使用了同一套加密密码,所以我用的加密算法就是对称加密算法。

目前常见的加密算法有:DES、AES、IDEA 等

非对称加密

非对称加密使用的是两个密钥,公钥与私钥,我们会使用公钥对网站账号密码等数据进行加密,再用私钥对数据进行解密。这个公钥会发给查看网站的所有人,而私钥是只有网站服务器自己拥有的。

目前常见非对称加密算法:RSA,DSA,DH等。

非对称加密

非对称指加密与解密的密钥为两种密钥。服务器提供公钥,客户端通过公钥对消息进行加密,并由服务器端的私钥对密文进行解密。

优点:安全

缺点

  • 性能低下,CPU 计算资源消耗巨大,一次完全的 TLS
    握手,密钥交换时的非对称加密解密占了整个握手过程的 90%
    以上。而对称加密的计算量只相当于非对称加密的
    0.1%,因此如果对应用层使用非对称加密,性能开销过大,无法承受。
  • 非对称加密对加密内容长度有限制,不能超过公钥的长度。比如现在常用的公钥长度是
    2048 位,意味着被加密消息内容不能超过 256 字节。

HTTPS=数据加密+网站认证+完整性验证+HTTP

通过上文,我们已经知道,HTTPS 就是在 HTTP
传输协议的基础上对网站进行认证,给予它独一无二的身份证明,再对网站数据进行加密,并对传输的数据进行完整性验证。

HTTPS 作为一种加密手段不仅加密了数据,还给了网站一张身份证。

如果让我回到十年前,那么我一定会这样跟我的女朋友传纸条:

先准备一张独一无二的纸条,并在上面签上我的大名,然后用只有我女朋友可以解密的方式进行数据加密,最后写完后,用胶水封起来,防止隔壁桌的小王偷看修改小纸条内容。

 

1 赞 收藏
评论

图片 5

网络通信(握手过程)

此图非常详尽的描述了 HTTPS 在通讯过程中的原理,总共分为 8 步。

图片 6

Https 原理

SSL/TLS

图片 7

TCP/IP协议栈中TLS各子协议和HTTP的关系

HTTPS 可以认为是 HTTP + TLS。TLS 是传输层加密协议TLS 协议本身又是由
record 协议传输的,record 协议的格式如下图

图片 8

general-format-of-all-TLS-records

TLS 协议主要有五种类型 Content Type:
Content types

Hex Dec Type
0x14 20 加密消息确认协议 ChangeCipherSpec
0x15 21 报警协议 Alert
0x16 22 握手协议 Handshake
0x17 23 应用数据层协议 Application
0x18 24 心跳协议 Heartbeat

STEP 8: 客户端解密信息

客户端用之前生成的私钥解密服务段传过来的信息,于是获取了解密后的内容。整个过程第三方即使监听到了数据,也束手无策。

参考资料

[1] Wiki 关于 Transport Layer Security
的介绍,https://en.wikipedia.org/wiki/Transport\_Layer\_Security
[2] 大型网站的 HTTPS 实践(一)—— HTTPS 协议和原理
http://op.baidu.com/2015/04/https-s01a01/
[3] SSL工作原理
https://www.wosign.cn/Basic/howsslwork.htm
[4] SSL/TLS协议运行机制的概述
http://www.ruanyifeng.com/blog/2014/02/ssl\_tls.html
[5]
HTTPS工作原理,猫尾博客,https://cattail.me/tech/2015/11/30/how-https-works.html
[6]
HTTPS那些事(一)HTTPS原理,晓风残月,http://www.guokr.com/post/114121/
[7]
HTTPS证书生成原理和部署细节,小胡子哥,http://www.barretlee.com/blog/2015/10/05/how-to-build-a-https-server/

STEP 1: 客户端发起HTTPS 请求

SSL 连接总是由客户端启动,在 SSL 会话开始时,执行 SSL
握手。用户在浏览器里输入一个https 网址,然后连接到server 的443 端口。
客户端发送以下:

  • 列出客户端密支持的加密方式列表(以客户端首选项顺序排序),如 SSL
    的版本、客户端支持的加密算法和客户端支持的数据压缩方法(Hash 算法)。
  • 包含 28 字节的随机数,client_random

以下是 Wireshark 抓包所得

Transmission Control Protocol, Src Port: 28258 (28258), Dst Port: 443 (443), Seq: 1, Ack: 1, Len: 517
    Source Port: 28258
    Destination Port: 443
    [Stream index: 13]
    [TCP Segment Len: 517]
    ......
Secure Sockets Layer
    TLSv1 Record Layer: Handshake Protocol: Client Hello
        // 握手记录
        Content Type: Handshake (22)
        // 0x0301 可以看出 TLS 是基于 SSL 3.1 构建而来
        Version: TLS 1.0 (0x0301)  
        Length: 512
        Handshake Protocol: Client Hello
            Handshake Type: Client Hello (1)
            Length: 508
            Version: TLS 1.2 (0x0303)
            Random
                GMT Unix Time: Jun 20, 2025 23:30:57.000000000 �й���׼ʱ��
                // 28 字节随机数 client_random
                Random Bytes: 12154d457c935c162fb8c0062572a5f84639b06289c51bf2...
            Session ID Length: 32
            // 可能为空,如果之前登陆过,则可以恢复之前的会话,避免一个完整的握手过程
            Session ID: c958100d8b678c0b071b54e977b456c06a233c08b9e2dd42...    
            Cipher Suites Length: 34
            // 密文族,列举浏览器所支持的加密算法清单
            Cipher Suites (17 suites)    
                Cipher Suite: Unknown (0xcca9)
                Cipher Suite: Unknown (0xcca8)
                Cipher Suite: TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 (0xcc14)
                Cipher Suite: TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 (0xcc13)
                Cipher Suite: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 (0xc02b)
                Cipher Suite: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (0xc02f)
                Cipher Suite: TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 (0xc02c)
                Cipher Suite: TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (0xc030)
                Cipher Suite: TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA (0xc009)
                Cipher Suite: TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA (0xc013)
                // 推荐使用
                Cipher Suite: TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA (0xc00a)    
                Cipher Suite: TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA (0xc014)
                Cipher Suite: TLS_RSA_WITH_AES_128_GCM_SHA256 (0x009c)
                Cipher Suite: TLS_RSA_WITH_AES_256_GCM_SHA384 (0x009d)
                Cipher Suite: TLS_RSA_WITH_AES_128_CBC_SHA (0x002f)
                Cipher Suite: TLS_RSA_WITH_AES_256_CBC_SHA (0x0035)
                Cipher Suite: TLS_RSA_WITH_3DES_EDE_CBC_SHA (0x000a)
            Compression Methods Length: 1
            Compression Methods (1 method)
                Compression Method: null (0)
            Extensions Length: 401
            Extension: renegotiation_info
                Type: renegotiation_info (0xff01)
                Length: 1
                Renegotiation Info extension
                    Renegotiation info extension length: 0
            Extension: server_name
                Type: server_name (0x0000)
                Length: 36
                Server Name Indication extension
                    Server Name list length: 34
                    Server Name Type: host_name (0)
                    Server Name length: 31
                    // 允许服务器对浏览器的请求授予相应的证书。
                    Server Name: images-cn.ssl-images-amazon.com    
            Extension: Extended Master Secret
                Type: Extended Master Secret (0x0017)
                Length: 0
            Extension: SessionTicket TLS
                Type: SessionTicket TLS (0x0023)
                Length: 192
                Data (192 bytes)
            Extension: signature_algorithms
                Type: signature_algorithms (0x000d)
                Length: 18
                Signature Hash Algorithms Length: 16
                // Hash 算法,用于签名
                Signature Hash Algorithms (8 algorithms)    
                    Signature Hash Algorithm: 0x0601
                        Signature Hash Algorithm Hash: SHA512 (6)
                        Signature Hash Algorithm Signature: RSA (1)
                    Signature Hash Algorithm: 0x0603
                        Signature Hash Algorithm Hash: SHA512 (6)
                        Signature Hash Algorithm Signature: ECDSA (3)
                    Signature Hash Algorithm: 0x0501
                        Signature Hash Algorithm Hash: SHA384 (5)
                        Signature Hash Algorithm Signature: RSA (1)
                    Signature Hash Algorithm: 0x0503
                        Signature Hash Algorithm Hash: SHA384 (5)
                        Signature Hash Algorithm Signature: ECDSA (3)
                    Signature Hash Algorithm: 0x0401
                        Signature Hash Algorithm Hash: SHA256 (4)
                        Signature Hash Algorithm Signature: RSA (1)
                    Signature Hash Algorithm: 0x0403
                        Signature Hash Algorithm Hash: SHA256 (4)
                        Signature Hash Algorithm Signature: ECDSA (3)
                    Signature Hash Algorithm: 0x0201
                        Signature Hash Algorithm Hash: SHA1 (2)
                        Signature Hash Algorithm Signature: RSA (1)
                    Signature Hash Algorithm: 0x0203
                        Signature Hash Algorithm Hash: SHA1 (2)
                        Signature Hash Algorithm Signature: ECDSA (3)
            Extension: status_request
                Type: status_request (0x0005)
                Length: 5
                Certificate Status Type: OCSP (1)
                Responder ID list Length: 0
                Request Extensions Length: 0
            Extension: signed_certificate_timestamp
                Type: signed_certificate_timestamp (0x0012)
                Length: 0
                Data (0 bytes)
            Extension: Application Layer Protocol Negotiation
                Type: Application Layer Protocol Negotiation (0x0010)
                Length: 14
                ALPN Extension Length: 12
                ALPN Protocol
                    ALPN string length: 2
                    ALPN Next Protocol: h2
                    ALPN string length: 8
                    ALPN Next Protocol: http/1.1
            Extension: channel_id
                Type: channel_id (0x7550)
                Length: 0
                Data (0 bytes)
            Extension: ec_point_formats
                Type: ec_point_formats (0x000b)
                Length: 2
                EC point formats Length: 1
                Elliptic curves point formats (1)
                    EC point format: uncompressed (0)
            Extension: elliptic_curves
                Type: elliptic_curves (0x000a)
                Length: 8
                Elliptic Curves Length: 6
                Elliptic curves (3 curves)
                    Elliptic curve: Unknown (0x001d)
                    Elliptic curve: secp256r1 (0x0017)
                    Elliptic curve: secp384r1 (0x0018)
            Extension: Padding
                Type: Padding (0x0015)
                Length: 77
                Padding Data: 000000000000000000000000000000000000000000000000...
                    Padding length: 0
                    Padding Data: <MISSING>

HTTPS 下的加密

HTTPS一般使用的加密与HASH算法如下:

  • 非对称加密算法:RSADSA/DSS
  • 对称加密算法:AESRC43DES
  • HASH算法:MD5SHA1SHA256

其中非对称加密算法用于在握手过程中加密生成的密码,对称加密算法用于对真正传输的数据进行加密,而HASH算法用于验证数据的完整性。由于浏览器生成的密码是整个数据加密的关键,因此在传输的时候使用了非对称加密算法对其加密。非对称加密算法会生成公钥和私钥,公钥只能用于加密数据,因此可以随意传输,而网站的私钥用于对数据进行解密,所以网站都会非常小心的保管自己的私钥,防止泄漏。
TLS握手过程中如果有任何错误,都会使加密连接断开,从而阻止了隐私信息的传输。正是由于HTTPS非常的安全,攻击者无法从中找到下手的地方,于是更多的是采用了假证书的手法来欺骗客户端,从而获取明文的信息,但是这些手段都可以被识别出来

相关文章