V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Geo200
V2EX  ›  程序员

怎么正确理解 HTTPS 的加密?

  •  
  •   Geo200 · 2017-09-28 11:39:48 +08:00 · 6193 次点击
    这是一个创建于 2606 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近刚开始学习 HTTPS,了解到 HTTPS 就是在 HTTP 的基础上加上 SSL/TLS 加密,但是我对非对称加密有很大的疑惑,下面是我对 HTTPS 理解(可能有误)引出的问题:以客户端账号密码登录为例

    1.账号密码通过 CA 里的公钥加密后传到服务器,但是我的理解是公钥是任何人都能获取到的,那么数据不就跟 HTTP 一样属实明文传输了吗?第三方通过公钥就可以解密你的账号密码,那么这样公钥的加密意义在哪里?

    2.公钥加密的内容传到服务器后,服务器怎么把私钥传回到客户端?如果还是通过公钥加密私钥,那么第三方还是可以通过公钥破解秘钥,那怎么防止第三方从中间窃取私钥?

    3.题外话,怎么实验 HTTPS 服务器?我有一个树莓派搭建的 HTTP 服务器,但目前不知道怎么拿到合法的 CA 证书去升级。

    第 1 条附言  ·  2017-09-28 18:11:25 +08:00
    经过一天的科普,楼主大概了解了“非对称加密”的原理,之前提出的问题也基本上是对“非对称加密”的理解有误引起,接下来我会继续深入了解 HTTPS,很感谢不少 V 友在楼下的耐心回答:D
    32 条回复    2019-04-23 14:15:52 +08:00
    crayygy
        1
    crayygy  
       2017-09-28 11:42:36 +08:00 via iPhone
    先协商,再加密
    tuzhenyu
        2
    tuzhenyu  
       2017-09-28 11:45:08 +08:00
    公匙加密私匙解密
    xiaoc19
        3
    xiaoc19  
       2017-09-28 11:45:37 +08:00
    说实话 看到你用公钥解密这句话 我只想说 还是先学会 Google 吧
    xiaoc19
        4
    xiaoc19  
       2017-09-28 11:47:00 +08:00
    我顿了下,看到你的第二个问题,我吓得准备把浏览器关了。。。
    mikulch
        5
    mikulch  
       2017-09-28 11:52:01 +08:00   ❤️ 1
    reus
        6
    reus  
       2017-09-28 11:53:05 +08:00
    公钥加密的,只能私钥解密
    私钥加密的,只能公钥解密
    janxin
        7
    janxin  
       2017-09-28 11:53:09 +08:00
    公私钥体系可以线研究下
    Geo200
        8
    Geo200  
    OP
       2017-09-28 11:58:51 +08:00
    @xiaoc19 哈哈,我知道我的理解肯定是有问题的,只是不知道需要这个 HTTPS 牵扯到什么知识点才来发帖的,现在按 7 楼的建议先看下公私钥体系
    wizardoz
        9
    wizardoz  
       2017-09-28 11:59:35 +08:00
    非对称加密的重点是 公钥加密的信息只能私钥解密,私钥加密的信息只能公钥解密。
    所以不存在发送在网络上发送私钥一说。
    你自己随机生成一个对称加密算法的密钥,用公钥加密发送给对方,只有对方用自己的私钥解密才能得到你发送给它的密钥。然后对方可以用你的密钥加密信息发送给你。

    当然,SSL实际上比这个稍微复杂一点,但就是这个原理。
    clino
        10
    clino  
       2017-09-28 11:59:58 +08:00
    Geo200
        11
    Geo200  
    OP
       2017-09-28 12:00:09 +08:00
    @mikulch 谢干货,我再仔细研究下加密的过程
    crab
        12
    crab  
       2017-09-28 12:13:53 +08:00
    服务器没发私钥啊。发的是公钥,在证书。
    系统用内置已被信任证书公钥来验证你这个证书,取出公钥。
    对称加密的密钥用公钥加密后再发给服务器,服务器私钥解密得到密钥。
    后面通信就是用这个密钥了。
    crab
        13
    crab  
       2017-09-28 12:15:09 +08:00
    smileawei
        14
    smileawei  
       2017-09-28 12:18:12 +08:00
    你自己都说了“非对称加密” 既然能知道这个词。为啥不百度下呢。https://baike.baidu.com/item/%E9%9D%9E%E5%AF%B9%E7%A7%B0%E5%8A%A0%E5%AF%86/9874417?fr=aladdin
    Cat73
        15
    Cat73  
       2017-09-28 12:49:09 +08:00
    证书可以用免费证书,可以参考我的文章: https://blog.cat73.org/2017/07/16/https/
    timothyye
        16
    timothyye  
       2017-09-28 12:53:05 +08:00 via Android
    私钥是绝对不能传给客户端的…… 客户端是不允许获取到私钥的。
    shuangguanQuail
        17
    shuangguanQuail  
       2017-09-28 13:22:12 +08:00
    建议看看 https://www.cnblogs.com/zhuqil/archive/2012/07/23/2604572.html
    非对称加密过程只是为了生成一个对称加密的密钥,然后之后的通信过程都是用的对称加密算法
    0TSH60F7J2rVkg8t
        18
    0TSH60F7J2rVkg8t  
       2017-09-28 13:38:44 +08:00   ❤️ 2
    强烈建议楼主看这篇文章,整个 https 的协商过程写的很详细:
    http://www.ruanyifeng.com/blog/2014/09/illustration-ssl.html
    pljhonglu
        19
    pljhonglu  
       2017-09-28 14:18:14 +08:00
    等楼主学习完 https 再来看这里。
    sdpfoue
        20
    sdpfoue  
       2017-09-28 14:22:22 +08:00
    1. 公钥加密的东西只能私钥才能解,所以叫非对称加密;这个过程并不(加密)传输用户的任何信息(用户名,密码),这个过程只是用非对称加密协商出一个对称加密算法的临时密钥。
    2. 私钥只有服务器有,不需要回传。
    3. 自己 google 去吧
    补充一点: https 方法怕中间人攻击,所以不能随便向系统中添加信任证书,浏览器提出有风险的网站要重视不能直接点『继续访问』。去了解一下证书的信任链原理。
    XueSeason
        21
    XueSeason  
       2017-09-28 14:24:04 +08:00   ❤️ 2
    1.账号密码通过 CA 里的公钥加密后传到服务器,但是我的理解是公钥是任何人都能获取到的,那么数据不就跟 HTTP 一样属实明文传输了吗?第三方通过公钥就可以解密你的账号密码,那么这样公钥的加密意义在哪里?

    服务器传数据给客户端时,服务器端使用私钥对数据进行签名(私钥是唯一的,可以防止他人冒充身份),客户端的公钥用于对签名的数据进行认证,验证数据的完整性,防止传输过程中被人拦截篡改数据。所以 HTTPS 主要目的是为了保证数据传输过程的完整性,防止数据在两端之间的传输过程中被窃听篡改(常见的就是运营商劫持,插入广告)。明文是相对于客户端而言,整个过程对于用户是无感的,加密是对于第三方监听者而言,监听者是监听到的只能是一堆密文,而无从下手。

    你的账号和密码是通过公钥加密后,传给服务端,服务端用私钥解密才能看到真正的数据。由于是非对称加密技术,只能公钥进行加密,私钥进行解密,反之不行。所以不存在第三方通过公钥来解密你的账号和密码。

    2.公钥加密的内容传到服务器后,服务器怎么把私钥传回到客户端?如果还是通过公钥加密私钥,那么第三方还是可以通过公钥破解秘钥,那怎么防止第三方从中间窃取私钥?

    服务器是不可能把私钥传给客户端的,客户端只能持有公钥。后半句没怎么看懂,我猜楼主说的是中间人攻击吧( MITM
    )。所谓中间人攻击就是,中间人相对于服务端而言,扮演着客户端的角色,相对于真正客户端而言,扮演着服务端的角色。中间人此时拥有服务端授权的公钥和自签名的私钥,可以做到对客户端的数据用私钥进行解密后再用公钥加密发送给服务端,对服务端的数据用公钥认证后,重新用私钥签名发送给客户端。这个过程对于客户端和服务端之间是无感的,然而数据却全部暴露给了中间人。为了防范中间人攻击,就出现了 CA 认证,客户端可以拿着自己手中的公钥,去 CA 机构认证合法性,保证公钥不是中间人自签名颁发的。

    3.题外话,怎么实验 HTTPS 服务器?我有一个树莓派搭建的 HTTP 服务器,但目前不知道怎么拿到合法的 CA 证书去升级。

    CA 证书网上大部分是收费的,不过免费的好像也有。比如 Let's Encrypt。大部分 Web 服务器都是支持 HTTPS 的,针对具体服务器网上有很多教程,就不多说了。
    cloudop
        22
    cloudop  
       2017-09-28 14:36:13 +08:00
    原理很简单,通信双方先用非对称加密方式通信,待双方协商一个临时 token 出来之后,往后的通信都变为对称加密的形式,为什么这样做呢,因为非对称加解密比较慢,而对称加解密速度较快。即解决了安全(非对称比对称安全)问题,又解决了速度(对称比非对称快)问题。
    Geo200
        23
    Geo200  
    OP
       2017-09-28 14:49:12 +08:00
    @XueSeason thx,说的很详细,也 get 到了之前理解错误的一些点,之前我提到的“公钥解密”这个理解是错误的
    yxwzaxns
        24
    yxwzaxns  
       2017-09-28 14:53:11 +08:00 via iPhone
    公钥加密的并不是你的密码等信息,而是对称密码的种子密码,而所有传输的信息用这个种子密码做对称加密
    juneszh
        25
    juneszh  
       2017-09-28 14:53:19 +08:00
    HTTPS 其实就是一套水到渠成的通讯加密的方案,要理解只需思考 3 个问题:

    1、通讯数据应该使用对称加密还是非对称加密?
    对称加密,比非对称加密效率高。

    2、如何让客户端获得对称加密的密钥?能否将密钥直接储存在客户端?
    通过非对称加密通讯实时生成;
    不能,反编译技术可获得密钥。

    3、如何通过非对称加密生成对称加密密钥?如何防止公钥被伪造,实现中间人攻击?
    客户端获得公钥,与服务器进行 3 次握手,生成 3 个随机数,通过随机数生成;
    使用可信机构的证书,判断公钥的来源。
    iawes
        26
    iawes  
       2017-09-28 16:30:20 +08:00
    先去看一下对称加密和非对称加密
    Jackeriss
        27
    Jackeriss  
       2017-09-28 16:35:35 +08:00
    看看 RSA 加密原理
    kanshan
        28
    kanshan  
       2017-09-28 17:08:34 +08:00   ❤️ 1
    私钥不会传送 证书里面包含了 另外 HTTPS 也并不是完全非对称加密方式 它是混合加密 ,在建立起 HTTPS 之后 会采用对称加密算法 这样速度比较快 。

    要记住 私钥和公钥都能够来加密


    **公钥加密私钥解密是加密**
    **私钥加密公钥解密是认证**

    你说的问题我举几个例子 :


    我生成了一套密钥,并把公钥写在了我的网站上。(公钥公开 私钥保留)

    你现在想给我发送邮件,但是想加密邮件的内容 所以就使用了我的公钥加密了邮件的内容 并且给我发了过来

    我收到邮件后发现是一串密文,我尝试用我的私钥解密 发现解开了 这个时候我就知道有人用我的公钥给我发送了邮件


    而浏览器是如何知道有没有被中间人攻击? 那就是认证来干的事情了 举例

    我发布了一篇文章,这个时候如何证明文章是我本人发的?我会在文章最底部留下一串密文

    这个密文是通过文章内容 MD5 之后的密文 然后再通过我的私钥加密的
    pricate_key.encode(MD5.encode(article.content));

    大家因为都有我的公钥,所以去尝试解密 如果这里解密失败 不用想了 不是我发的,如果解密成功发现得到了一串 MD5 然后自己加密文章内容 看一看出来的结果是不是我给的 MD5 如果正确就代表这篇文章确实是我本人发的 如果不正确就是被中间人修改了。

    这个就是数字证书的作用: 确保数据不被中间人修改。


    而混淆加密再举一个例子

    我和一个小伙伴使用加密的方式聊天,比如使用微信

    但是我发现每次都要用私钥解密 公钥加密就太麻烦了呀!

    所以我们规定 在第一次发送消息的时候 我们采用非对称加密的方式,然后把对称加密方式的密钥放进来(比如 DES)

    后面我们聊天就不用这么麻烦了,因为我们拿到了一个对称加密的密钥 后面的消息过来只需要 decode 就行了 也不用验证是不是对方发过来的 ,因为每次的首次会话 都会改变对称密钥 这样轻松多了。
    kuro1
        29
    kuro1  
       2017-09-28 17:15:42 +08:00
    先补完非对称加密。。。都不知道从哪里开始吐槽
    Shura
        30
    Shura  
       2017-09-28 17:56:55 +08:00 via Android
    《图解密码技术》
    nongmei
        31
    nongmei  
       2017-09-28 18:02:58 +08:00
    楼主需要先理解下“非对称加密”。
    非对称(公钥)加密是相对传统的对称密码算法来讲的,“非对称”的意思就是说加密和解密用的不是同一个秘钥。公钥算法中存在一对秘钥:公钥和私钥。使用公钥加密的密文,必须用私钥才能解密。这样就避免了对称加密过程中,秘钥传输过程中带来的风险。
    但由于公钥算法的执行效率比较低,所以在 HTTPS 协议中,是先通过基于公钥算法的秘钥交换算法(比如 DH 等)生成对称秘钥,后续传输内容使用对称密码算法加密。
    所以楼主所说的前两个问题就不存在了。
    qq719779232
        32
    qq719779232  
       2019-04-23 14:15:52 +08:00
    https://zhuanlan.zhihu.com/p/62246556
    这篇文章可能对你有用,介绍了 HTTPS 整个流程!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1361 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 17:53 · PVG 01:53 · LAX 09:53 · JFK 12:53
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.