从入门到熟悉 HTTPS 的 9 个问题!


BS:使用对称加密技术

对称加密可以理解为对原始数据的可逆变换。比如Hello 可以变换成Ifmmp, 规则就是每个字母变成它在字母表上的后一个字母,这里的秘钥就是1,另一方拿到lfmmp就可以还原成原来的信息Hello了。

引入对称加密后,HTTPS的握手流程就会多了两步,用来传递对称加密的秘钥:

1、客户端:你好,我需要发起一个HTTPS请求

1、服务器:好的,你的秘钥是1。

提到了对称加密,那么自然还有非对称加密。它的思想很简单,计算两个质数的乘积很容易,但反过来分解成两个质数的乘积就很难,要经过极为复杂的运算。非对称加密有两个秘钥,一个是公钥,一个是私钥。公钥加密的内容只有私钥可以解密,私钥加密的内容只有公钥可以解密。一般我们把服务器自己留着,不对外公布的密钥称为私钥,所有人都可以获取的称为公钥。

使用对称加密一般要比非对称加密快得多,对服务器的运算压力也小得多。

Q5:对称秘钥如何传输


服务器直接返回明文的对称加密密钥是不是不安全。如果有监听者拿到这个密钥,不就知道客户端和服务器后续的通信内容了么?

BS:利用非对称加密

是这样,所以不能明文传递对称秘钥,而且也不能用一个新的对称加密算法来加密原来的对称秘钥,否则新的对称秘钥同样无法传输,这就是鸡生蛋、蛋生鸡的悖论。

这里我们引入非对称加密的方式,非对称加密的特性决定了服务器用私钥加密的内容并不是真正的加密,因为公钥所有人都有,所以服务器的密文能被所有人解析。但私钥只掌握在服务器手上,这就带来了两个巨大的优势:

1、服务器下发的内容不可能被伪造,因为别人都没有私钥,所以无法加密。强行加密的后果是客户端用公钥无法解开。

2、任何人用公钥加密的内容都是绝对安全的,因为私钥只有服务器有,也就是只有真正的服务器可以看到被加密的原文。

所以传输对称秘钥的问题就迎刃而解了:秘钥不是由服务器下发,而是由客户端生成并且主动告诉服务器。

所以当引入非对称加密后,HTTPS的握手流程依然是两步,不过细节略有变化:

客户端:你好,我需要发起一个HTTPS请求,这是我的(用公钥加密后的)秘钥。

服务器:好的,我知道你的秘钥了,后续就用它传输。

Q5:公钥怎么传输


你好像还是没有解决鸡生蛋,蛋生鸡的问题。你说客户端发送请求时要用公钥加密对称秘钥,那公钥怎么传输呢?

BS:对公钥加密就行了

每一个使用HTTPS 的服务器都必须去专门的证书机构注册一个证书, 证书中存储了用权威机构私钥加密的公钥。这样客户端用

权威机构的公钥解密就可以了。

现在HTTPS协议的握手阶段变成了四步:

1、客户端:你好,我要发起一个HTTPS请求,请给我公钥

2、服务器:好的,这是我的证书,里面有加密后的公钥

3、客户端:解密成功以后告诉服务器:这是我的(用公钥加密后的)对称秘钥。

4、服务器:好的,我知道你的秘钥了,后续就用它传输。

Q6:那权威机构的公钥又怎么传输?


BS:存在电脑里

这个公钥不用传输,会直接内置在各大操作系统(或者浏览器)的出厂设置里。之所以不把每个服务器的公钥内置在电脑里,一方面是因为服务器太多,存不过来。另一方面操作系统也不信任你,凭什么你说你这个就是百度/淘宝的证书呢?

所以各个公司要先去权威机构认证,申请证书,然后操作系统只会存储权威机构的公钥。因为权威机构数量有限,所以操作系统厂商相对来说容易管理。如果这个权威机构不够权威,XJB发证书,就会取消他的资格,比如可怜的沃通。。。

Q7:怎么知道证书有没有被篡改?


你说服务器第一次会返回证书, 也就是加密以后的公钥,那我怎么知道这个证书是可靠的?

BS:将信息hash值随情信息一起传递

我们都知道哈希算法的特点,它可以压缩数据,如果从函数角度来看,不管多复杂的数据(定义域可以非常大)经过哈希算法都会得到一个值,而且这个值处在某个特定(远小于定义域的范围)值域内。相同数据的哈希结果一定相同, 不相同数据的哈希结果一般不同,不过也有小概率会重复,这叫哈希冲突。

为了确保原始证书没有被篡改,我们可以在传递证书的同时传递证书的哈希值。由于第三者无法解析数据,只能XJB改,那么修改后的数据在解密后,就不可能通过哈希。

Q8:这样可以防止第三方冒充服务器么


BS:也许可以

首先真正的服务器下发的内容,无法被别人篡改。他们有权威机构的公钥,所以可以解密,但是因为没有私钥,所以解密以后的信息无法加密。没有加密或者错误加密的信息被客户端用公钥解密以后,必然无法通过哈希校验。

但是,如果你一开始请求的就不是真的服务器,而是一个攻击者,此时的他完全有机会进行中间人攻击。我们知道第一次握手的时候服务器会下发用于证明自己身份的证书,这个证书会用预设在设备上的公钥来解密。所以要么是经过认证的证书用权威机构的私钥加密,再用权威机构解密,要么是用非权威机构的私钥加密,然后找不到公钥解密。

所以如果不小心安装过非权威机构的根证书,比如黑客提供的恶意证书,这时候设备上就多了一个预设的公钥,那么用恶意私钥加密的证书就能被正常解析出来。所以千万不要随便装根证书,这等于是为那些恶意证书留了一扇门。

当然,凡是都有两面性。我们知道Charles可以调试HTTPS通信,它的原理就是需要用户安装Charles的根证书,然后我们的请求会被代理到Charles服务器,它下发的Charles证书才能被正确解析。另一方面, Charles会作为客户端,从真正的服务器哪里拿到正确的https 证书并用于后续通信。幸好Charles 不是流氓软件,或者它的私钥一旦泄露,对用户都会造成很大的影响。

我可以举一个例子, 证书有多个种类,最贵的叫EV (Extended Validation), 它需要公司营业执照等多个文件才能申请人工审核,好处也很明显,可以在浏览器地址栏左侧准确显示公司名称,比如Bitbucket的官网:

在这里插入图片描述

代理模式下无法显示

Q9: HTTPS握手会影响性能么


TCP有三次握手,再加上HTTPS的四次握手,会不会影响性能?

BS:影响肯定有,但是可以接受

首先,HTTPS肯定会更慢一点,时间主要花费在两组SSL之间的耗时和证书的读取验证上,对称算法的加解密时间几乎可以忽

略不计。

而且如果不是首次握手,后续的请求并不需要完整的握手过程。客户端可以把上次的加密情况直接发送给服务器从而快速恢复,

具体细节可以点击查看图解https的认证过程详情。

除此以外, SSL握手的时间并不是只能用来传递加密信息,还可以承担起客户端和服务器沟通HTTP2兼容情况的任务。因此从

HTTPS切换到HTTP2.0不会有任何性能上的开销,反倒是得益于HTTP2.0的多路复用等技术,后续可以节约大量时间。

如果把HTTPS2.0当做目标,那么HTTPS的性能损耗就更小了,远远比不上它带来的安全性提升。

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!**

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值