怎么正确理解 HTTPS 的加密?

2017-09-28 11:39:48 +08:00
 Geo200

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

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

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

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

6038 次点击
所在节点    程序员
32 条回复
XueSeason
2017-09-28 14:24:04 +08:00
1.账号密码通过 CA 里的公钥加密后传到服务器,但是我的理解是公钥是任何人都能获取到的,那么数据不就跟 HTTP 一样属实明文传输了吗?第三方通过公钥就可以解密你的账号密码,那么这样公钥的加密意义在哪里?

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

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

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

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

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

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

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

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

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

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


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

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


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

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

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


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

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

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

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

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


而混淆加密再举一个例子

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

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

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

后面我们聊天就不用这么麻烦了,因为我们拿到了一个对称加密的密钥 后面的消息过来只需要 decode 就行了 也不用验证是不是对方发过来的 ,因为每次的首次会话 都会改变对称密钥 这样轻松多了。
kuro1
2017-09-28 17:15:42 +08:00
先补完非对称加密。。。都不知道从哪里开始吐槽
Shura
2017-09-28 17:56:55 +08:00
《图解密码技术》
nongmei
2017-09-28 18:02:58 +08:00
楼主需要先理解下“非对称加密”。
非对称(公钥)加密是相对传统的对称密码算法来讲的,“非对称”的意思就是说加密和解密用的不是同一个秘钥。公钥算法中存在一对秘钥:公钥和私钥。使用公钥加密的密文,必须用私钥才能解密。这样就避免了对称加密过程中,秘钥传输过程中带来的风险。
但由于公钥算法的执行效率比较低,所以在 HTTPS 协议中,是先通过基于公钥算法的秘钥交换算法(比如 DH 等)生成对称秘钥,后续传输内容使用对称密码算法加密。
所以楼主所说的前两个问题就不存在了。
qq719779232
2019-04-23 14:15:52 +08:00
https://zhuanlan.zhihu.com/p/62246556
这篇文章可能对你有用,介绍了 HTTPS 整个流程!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/394285

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX