查看原文
其他

来呀,跟你聊透https这玩意儿 ~

脚本之家 2022-09-29

The following article is from 涛歌依旧 Author 点击关注👉👉

 关注
脚本之家
”,与百万开发者在一起

来源丨涛歌依旧(ID:ai_taogeyijiu_2021)

已获得原公众号授权转载

最近自己玩一个项目,要考虑安全方面的问题,需要设计一套比较安全的私有通信协议,打算借鉴https的思路,于是就好好研究了一下https. 
今天,我们来聊一聊https的来龙去脉。https其实就是http + ssl,接下来,我们从最简单的明文通信模型开始,逐渐来理解https的设计思路。

一. AES对称加密

我们知道,tcp提供的是端到端的透明传输,而http是基于tcp的。直接用http明文传输是不安全的,所以需要进行加密处理。
你肯定听说过著名的RSA非对称加密,那直接用RSA加密,行不行呢?当然不好!一是因为RSA慢;二是因为RSA的公钥是公开的,坏人可能对私钥加密后的信息进行解密。
此时,可以考虑使用AES对称加密,加解密的速度更快,是最常用的加密算法之一,来看看加解密的图示:

        

但问题是:C和S两端怎样才能拥有相同的秘钥randomStr呢?可以考虑由C端生成randomStr,然后发送给S端,如下图所示:
      

二. RSA非对称加密

看似解决了问题,但如果发送randomStr时被坏人截获,坏人就能解密C和S的通信内容。
因此,上述方法还需要继续改进,比如C端用公钥pubKey对randomStr进行加密,这样只有S端的私钥priKey才能解密,中间人无可奈何:


如何才能使C端有公钥pubKey, 而S端有私钥priKey呢?可以考虑在S端生成,然后传递给C端,逻辑如下:

三. 公钥认证问题

上述方案可行,S端给C端返回公钥pubKey时,不怕泄露公钥。然而,坏人还是可以从中作恶的。坏人可以自己生成新的公私钥,欺骗C和S.
于是乎,C还以为是在跟S通信,S还以为是在跟C通信,其实,他们的通信内容,已经被坏人劫持了,逻辑如下:

这里的问题在于:C要确认接收到的公钥确实是S的公钥,而不是其他人的公钥,这是个难题。
网上的买家要卖家先发货,卖家要买家先给钱,谁都不信任彼此,无法交易。解决信任问题还是要依赖于第三方,比如淘宝。
同理,在https场景中,S端必须要想办法证明自己就是自己,可以找第三方CA机构来做认证,这样C才能确保自己拿到的公钥确实是S的公钥,逻辑图如下:


如此一来,C端就可以验证获取的pubKey确实来源于S端,而不是中间的坏人H. 要注意,S端每年要向CA认证机构支付认证费用,过期后要续费。
否则,服务S无法正常工作,浏览器C也访问不了网站。大家在实际开发中,可能会遇到https证书过期的问题,导致没法提供服务,需要提前重视。


https不难,关键在于理解其背后的思路,这些思路可以指导我们设计更加安全的系统。

https也是面试的常客,千万别在这些基础问题上歇菜。


<END>

【轻薄款上架】 🕚

  推荐阅读:

终于!我找到程序员爱穿卫衣的原因了

HTTPS 协议到底比 HTTP 协议多些什么?

为了一个HTTPS,浏览器操碎了心···

破玩意 | 用 HTTPS 传纸条

每日打卡赢积分兑换书籍入口

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存