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

关于 HTTPS 我有一个疑问

  •  
  •   zhao1014 · 2020-12-30 21:26:41 +08:00 · 2137 次点击
    这是一个创建于 1206 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近在看《图解 HTTP 》看到了 HTTPS 这一章

    前言:

    SSL 使用混合加密机制,使用公开秘钥加密共享秘钥,在确保交换的共享秘钥是安全的情况下,使用共享秘钥进行通信

    疑问:

    1.每次发送报文时,发送端都会将共享秘钥与被加密的报文一起发送,公开钥保证第一次共享秘钥的交换是安全的,那后续呢?难道每次交换秘钥都要用公开称秘钥加密吗?

    2.共享秘钥由客户端生成还是由服务器端生成?

    3.我对共享秘钥的理解是不是有问题?我理解的是共享秘钥只有一个,每次发送报文时都要随报文一起发送。如果共享秘钥是相同的两个秘钥,由服务器生成,在第一次会话时服务器将其中一个交给客户端,那这样就能解释问题 1 和问题 2 了

    第 1 条附言  ·  2020-12-30 23:16:49 +08:00
    感谢大佬们的解答,我稍微总结一下自己的理解:

    1.共享秘钥并非伴随报文发送,而是客户端和服务器各自计算得出

    2.仅使用共享秘钥时,客户端发起请求,并在请求中附加一个随机字符串,服务器接收该字符串,客户端和服务器各自根据该字符串计算出主秘钥,此时双方均持有相同的主秘钥

    3.之后的会话,消息发送方会生成随机字符串,并通过该字符串和主秘钥配合算出会话秘钥,使用会话秘钥加密,发送报文时,该字符串会随报文一起发送

    4.消息接收方接收到被加密的报文和字符串,使用该字符串和自己的主秘钥配合算出会话秘钥,使用会话秘钥解密

    5.之所以共享秘钥不安全,是因为第一次发送的字符串有可能被截获,如果发送该字符串时是安全的,那么后续即使随机字符串被截获,也不能解密报文,因为没有主秘钥

    6.因此,使用非对称加密保护第一次传输的随机字符串

    (细节应该有不少问题,没有深入研究过,看到大佬讲的盐的概念临时搜了一下才明白什么意思)
    6 条回复    2020-12-31 05:42:57 +08:00
    opengps
        1
    opengps  
       2020-12-30 21:33:35 +08:00   ❤️ 1
    公钥的出发点是公开,所以叫公钥。私钥同理。
    早在 ssl 证书申请的时候,公钥私钥就已经生成好了,你拿到的是一对固定的密钥。
    eason1874
        2
    eason1874  
       2020-12-30 22:09:42 +08:00   ❤️ 1
    共享密钥是算出来的,不是谁发给谁的。据我了解是这样:

    客户端:hello,这是我能使用的版本、密码组合和这次加密用的客户端盐(随机字符串 A )
    服务器:hello,这是我的证书、密码组合和这次加密用的服务器盐(随机字符串 B )

    客户端:收到。这是我用你的证书公钥加密过的密钥盐(随机字符串 C )
    客户端:我决定用算法 1
    客户端:这是我用盐 A 、B 、C 算出来的共享密钥加密的结束信号。

    服务器:收到。这是我用盐 A 、B 、C 算出来的共享密钥加密的结束信号。

    客户端&服务器:共享密钥一致,安全连接已建立。
    Biwood
        3
    Biwood  
       2020-12-30 22:09:45 +08:00   ❤️ 1
    正好最近复习了,共享秘钥准确的说法叫“会话秘钥”,是由客户端和服务端的主密钥 + 同一个随机数各自生成的,一次会话只有一个会话秘钥。

    SSL 握手完成之后,所有的加密和解密都是用这一个会话秘钥,也就是所谓的对称加密,而且这个秘钥是不需要每次都传送的,因为在客户端和服务器都已经算出这个秘钥了。

    其实最关键得是 SSL 最后一步,从预主密钥( pre-master key )到主密钥( master key )这一步,用的是迪菲-赫尔曼密钥交换算法( D-H 算法)。客户端和服务端能够算出一个相同的主密钥,之后的会话秘钥都依赖主密钥而生成。
    fiveelementgid
        4
    fiveelementgid  
       2020-12-30 22:14:16 +08:00 via Android   ❤️ 1
    你可以试试用 curl -v https 网站
    fiveelementgid
        5
    fiveelementgid  
       2020-12-30 22:18:11 +08:00 via Android
    这书看过,你需要注意的是,只有一开始采用非对称加密密钥进行通信,这个主要是用于安全传输临时生成的对称密钥(session key),然后后续通信都是用 session key 加密进行通信(对称加密),主要还是为了节省算力
    webshe11
        6
    webshe11  
       2020-12-31 05:42:57 +08:00 via Android   ❤️ 1
    这都是现代密码学的东西,论坛也不是讲课的地方,回复里也说不清,不如直接推荐一本书,也姓图解,叫《图解密码技术》,全看完就全明白了
    防止思而不学则殆,还是看书好使,加油
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2871 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 14:09 · PVG 22:09 · LAX 07:09 · JFK 10:09
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.