V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
httpbin - 协议调试工具
httpstatuses - 协议状态码查询
httpie - cURL-like tool for humans
Fiddler
yeyeye
V2EX  ›  HTTP

能不能有人白话文解释下 HTTPS 加密原理。

  •  
  •   yeyeye · 2015-12-29 10:35:36 +08:00 · 5072 次点击
    这是一个创建于 3254 天前的主题,其中的信息可能已经有所发展或是发生改变。
    首先每个电脑都有数字签名颁发机构信任列表这个我懂,其他的我就不懂了。

    主要问题没想明白(原谅我没文化!),明明 HTTPS 的数据包,也和普通的数据包一样在互联网上传输,可以说从数据包的角度考虑,它其实还是明文的,只是在于加密方式,如何加密能让传输不可破解,而且客户端本身也没有独立的加密表(我的意思是,每个电脑都是一样的,服务器也不知道谁是谁啊,又没有特别的标示?而且也没有对应每个计算机生成一个加密表,可以互相对应。)

    所以如何实现的“内容加密”,同时“双方都能解密”,又同时“传输层被截取无法解密”。

    这个问题我想了很多次,每次都觉得除非服务器和客户端互相有对方的“加密表”(绝对不能在网上传输这个表内容),而且要是独立的,才能实现加密,互相可解密,传输层被截取也无法解密和伪造。
    21 条回复    2023-08-01 17:34:02 +08:00
    maemual
        1
    maemual  
       2015-12-29 10:40:46 +08:00   ❤️ 2
    本质上是,传输的数据是经过对称加密的,客户端和服务端都有这个密钥。但是这个密钥是在 HTTPS 的握手阶段生成的,通过非对称加密进行交换的。

    发几篇最近在看的文章。

    https://blog.cloudflare.com/keyless-ssl-the-nitty-gritty-technical-details/

    https://cattail.me/tech/2015/11/30/how-https-works.html

    https://blog.helong.info/blog/2015/09/06/tls-protocol-analysis-and-crypto-protocol-design/
    zjqzxc
        2
    zjqzxc  
       2015-12-29 10:40:50 +08:00   ❤️ 1
    去看看什么是“非对称加密”然后就明白了
    virusdefender
        3
    virusdefender  
       2015-12-29 10:42:18 +08:00   ❤️ 1
    内容加密是采用对称加密的,双方在握手的时候确定了这个密钥,而这个密钥是通过非对称加密来加密的,为了性能。

    浏览器为了确保服务器可信会验证服务器证书,也是非对称加密的一个应用,和加密解密的方向是相反的。
    la0wei
        4
    la0wei  
       2015-12-29 10:46:45 +08:00   ❤️ 1
    "我的意思是,每个电脑都是一样的,服务器也不知道谁是谁啊"
    nopy
        5
    nopy  
       2015-12-29 10:49:14 +08:00 via Android   ❤️ 1
    不是不能解密,是解密的代价太大,可能需要几十年上百年的时间。

    只要知道是安全的就行了。
    wzxjohn
        6
    wzxjohn  
       2015-12-29 10:54:00 +08:00   ❤️ 1
    你需要的不是了解 HTTPS 的原理,而是去简单的看一下密码学,了解一下 非对称加密算法。从你的问题中可以看出你对加解密的理解还停留在 “只有双方都有密码本才能加密” 的 对称加密阶段。如果用这个思路那再白话也说不通 HTTPS 的原理的。
    honeycomb
        7
    honeycomb  
       2015-12-29 11:15:45 +08:00   ❤️ 1
    1 ,验证基于 pki 。 2 ,验证用户后,有密钥交换算法
    SpicyCat
        8
    SpicyCat  
       2015-12-29 11:26:24 +08:00   ❤️ 32
    你和你朋友想聊天。
    最开始你们就是直接聊天,明文传输,所有人都看得到,这是 HTTP.
    然后你们觉得这样太不安全了,没有一点隐私,自然而然的,你们想给聊天内容加密。
    你朋友提议:"咱们约定个密码,用这个密码加密聊天内容吧。"
    你觉得不错,但是马上又发现一个问题,这个密码怎么传输?如果明文传输密码,那加密不就等于形同虚设了吗。
    你朋友又提议:“你设想的是对称加密。对称加密是用一个密码或者密钥加密信息,不管谁只要知道了密钥,都能解开密文。我知道一种加密方式是非对称加密。非对称加密的密钥不是一个,而是一对,称之为公钥和私钥。公钥负责加密,私钥负责解密。用公钥加密的密文,只有对应的私钥能解。私钥在我这里妥善保存,谁都得不到,公钥我公布出去,谁都能拿到。你把我的公钥拿去,把你想的密码用公钥加密一下,然后发给我,我就知道咱们约定的密码了”
    你说:“这是个好主意呀。”
    于是,你先向你的朋友发出聊天邀请,你朋友回复了你,并带上了公钥,你想了个密码,然后用公钥加密,再发给朋友,你朋友用自己的私钥解密,得到了聊天用的密码,好了,现在你和你朋友安全地传输了聊天专用加密密码,你们用这个密码加密聊天信息,谁也看不到了。这叫 HTTPS

    简单来说,传输内容的加密是对称加密,而对称加密用的密码是用非对称加密的形式传输的。
    实际情况比这复杂,比如客户端还要验证服务器端的证书等等,但是大致流程就是这样。
    yeyeye
        9
    yeyeye  
    OP
       2015-12-29 11:51:14 +08:00
    已感谢以上所有……看来还要深入了解非对称加密算法才能了解……
    looyao
        10
    looyao  
       2015-12-29 12:00:39 +08:00   ❤️ 1
    我的简单理解:通过非对称 RSA 算法来交换一个对称加密 AES 或者 RC4 算法的 key ,之后就用 AES 或者 RC4 来发送加密数据了。每次建立的链接的 key 都是随机的。

    http://www.ruanyifeng.com/blog/2014/02/ssl_tls.html
    这篇文章写的不错。
    tanyuxiang
        11
    tanyuxiang  
       2015-12-29 12:03:27 +08:00 via Android   ❤️ 1
    两个问题
    1 你先学会抓包,解析包。
    2 加密简单原理。
    tiancaiamao
        12
    tiancaiamao  
       2015-12-29 12:07:05 +08:00   ❤️ 1
    可以 at 一下阮一峰,这是一个能够把技术解释到非常直白的科普作家
    la0wei
        13
    la0wei  
       2015-12-29 12:09:43 +08:00   ❤️ 1
    http://chuansong.me/n/2096079
    linux 中国微信号看到的,官网反而找不到了,上面链接大概是个聚合网站的。
    maxsec
        14
    maxsec  
       2015-12-29 13:31:07 +08:00   ❤️ 2
    浏览器连接 www.taobao.com>
    > hello, taobao, random tick is 8274
    服务器:
    > hello, random tick is 3122, My certificate which contains public key is in bellow:
    > ----BEGIN CERTIFICATE----
    > ....
    > ----END CERTIFICATE----
    浏览器:
    > hello, random tick is rsa_encrypt(pubkey_from_cert,7461)
    服务器:
    > okay, we've don all ssl handshake progress, let's have a talk...
    浏览器:
    > aes_encryption( 'give me your /images/campaign.jpg', 8274-3122-7461);
    服务器:
    > aes_encryption( file_get_contents('/images/campaign.jpg'));


    .....
    kacong
        15
    kacong  
       2015-12-29 13:48:42 +08:00   ❤️ 1
    学习 crypto 是了解基础的必修课。
    fds
        16
    fds  
       2015-12-29 14:08:16 +08:00   ❤️ 2
    是有 CA 的,你电脑上操作系统预先安装的信任证书里面有 CA 的公钥,你通过公钥跟 CA 通信,获得要访问网站的公钥,然后就可以跟网站秘密通信了。这种情况下浏览器上一般都有个绿色的对勾。
    另外一种是网站自己签名的,这种情况无法验证你连接的服务器确实是你想要的网站,一般浏览器会有红色的警告。
    GavinHao
        17
    GavinHao  
       2015-12-29 14:53:12 +08:00 via Android   ❤️ 1
    @SpicyCat 通俗,给你赞
    ooTwToo
        18
    ooTwToo  
       2015-12-29 14:59:13 +08:00   ❤️ 1
    @SpicyCat 懂了!
    rex1901
        19
    rex1901  
       2015-12-29 15:04:20 +08:00   ❤️ 1
    https://blog.cloudflare.com/keyless-ssl-the-nitty-gritty-technical-details/
    非对称加密的核心在于密钥分发,即握手过程。
    如果懂英文,推荐你看看这篇文章,大多数的中文文章都是在描述 RSA 握手,但是现在基本都采用 ECDH 握手,在这篇文章的下部分有分部解析,有图片,非常容易理解。
    Hardrain
        20
    Hardrain  
       2016-05-23 22:55:42 +08:00
    数据的传输使用对称加密(一般是 AES)然后对称加密的密钥通过 RSA 或 ECDSA(椭圆曲线)等非对称加密的公钥加密后给服务器,服务器有私钥能解密之,得到对称加密密钥,从而双方可知通信内容而传输层无法得知
    P.S. 以上所述仅在有可信任的 CA 或无 CA 也无 MITM(中间人攻击)的情形下
    rabex
        21
    rabex  
       2023-08-01 17:34:02 +08:00
    这个用漫画方式讲解 HTTPS 过程的,也很直观。
    [howhttps.work]( https://www.howhttps.work)
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5628 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 07:08 · PVG 15:08 · LAX 23:08 · JFK 02:08
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.