我是浏览器,每次夜深人静的时候,楼主打开我开始学习。为了不让别人看到浏览记录,店主选择了“隐身模式”。但是网络上总是有很多坏人。他们通过抓包的方式拦截我和服务器之间的通信。他们知道所有者做了什么以及请求了哪些数据!无非是窃听,而且他们经常篡改内容。插入有吸引力的小广告太可惜了!为了保护主人的隐私,给他一个干净的上网环境,我决定加密通讯!第一个版本:直接简单加密,很简单,将要发送的原始数据加密,然后发送到服务器。当然,为了安全起见,密钥不能固定,必须为每次通信随机生成。但后来我遇到了一个问题。我应该如何告诉服务器密钥?没有密钥,服务器无法解密,所以它不知道我在请求什么资源。不能直接创建一个字段告诉服务器密钥,让别人拿到,就跟没加密一样。我想了想,决定把密钥藏在数据的前几个字节里。只要我私下和服务器约定好,他会用前几个字节作为解密的密钥,就能解开我发送的数据。数据。别告诉我,这个方法真的管用。我开始偷偷和服务器通信。后来越来越多的服务器要求我使用这种方式进行通信。后来这件事在圈子里传开了,大家都知道数据的前几个字节是密钥,任何人都可以解密。看来这个方法不行,得重新考虑加密方法了。版本二:非对称加密服务器告诉我,我们之前使用的加密算法叫做对称加密算法,即加密和解密使用同一个秘钥。还有一种非对称加密算法。该算法有两把秘钥,一把公钥称为公钥,另一把私钥称为私钥。最重要的是,用公钥加密后,只能用私钥解密,反之亦然。只要服务器在正式传输数据之前告诉我他的公钥,我就用它来加密数据。即使别人抓到了数据包,他也无法解密,因为只有拥有私钥的服务器才能解密。不得不说,这个非对称加密真是个好东西!但是这样一来,就只能单向加密了。服务器可以解密我发的东西,但是我不能解密他发给我的东西,我也不能让他用私钥加密,我是用公钥解密的,因为公钥是公开的,谁收到都可以解密,不安全。没办法,我也得到了一对秘钥。在通信之前,我们双方交换彼此的公钥,这样我们就可以双向加密和解密了!虽然有点麻烦,但是为了数据安全,还是忍忍吧!第三版:非对称加密和对称加密的结合,不过看了几天没办法。这个非对称加密算法不错,但是加密和解密太费时间,导致我渲染一个网页的时间很长,而且卡不了。本来打算和服务员商量一下,没想到服务员比我还头疼。他要服务很多浏览器,每一个都需要这样加密解密,这让他很累。所以我们决定使用原来的对称加密算法,速度要快很多。但是在开始的时候,可以使用非对称加密算法来传输后面要使用的秘钥,结合了两种算法的优点。这样我只需要用服务器公钥加密后面要用到的秘钥发给他就行了,省了很多麻烦。第四版:密钥计??算有一天,服务器告诉我,我们现在的密钥是一个随机数,而这个随机数并不是真正随机的,有可能被预测到,所以我们要提高这个密钥的安全性。一个随机数不够,所以多拿几个!一端容易猜到,所以两端一起生成!我们决定生成一个随机数发送给对方,我再加密传输一个额外的随机数给服务器,我们双方都有3个随机数,然后双方用这3个随机数计算出真正的秘钥,比简单的随机数安全多了。但是,为了验证双方计算出的秘钥是否相同,我们需要在正式数据传输前进行测试。现在的流程变成了这样:我们的方案很快就得到了大家的认可,圈内很多浏览器和服务器都采用了这个方案。第五版:数字证书本以为这个方案万无一失,没想到我和服务器的通信还是被泄露了……原来是一个家伙冒充服务器和我通信,然后假装是我。没有转发,我们俩都被蒙在鼓里。这是中间人攻击。好像缺少认证机制!我需要知道我是否在与真实服务器通信。经过大家的讨论,圈内服务器选择了一位德高望重的前辈作为公证人,并让公证人准备了一对非对称加密密钥,并将公钥在圈内公开。记下公钥。服务器要先去公证处注册,并上报自己的公钥、名字等信息。公证人得到信息后,计算出一个Hash值,然后用公证人的私钥对Hash值进行加密。最后的结果就是数字签名。证书签发结束后,公证人将注册信息与数字签名结合,封装一个新文件发送给服务器,注册完成,新文件即为数字证书。服务器拿到证书后,要妥善保管,因为在通信的时候,服务器需要将自己的证书发送给我们的浏览器进行验证。证书验证我们的浏览器在拿到证书后,也会计算出证书中信息的Hash,然后用事先记录的公证人的公钥对证书中的数字签名进行解密,得到公证人计算出的Hash。对比一下就可以知道证书是不是公证人出具的,有没有被篡改过!验证成功后才能继续后面的流程,否则就是冒充!这样终于解决了中间人冒充的问题,除非中间人盗取了公证人的私钥,否则无法伪造证书。除了加密数据,非对称加密还可以用来验证身份。真的很YYDS!第六版:信任链。服务器越来越多。毕竟,没有人希望自己的网站被插入小广告。但是原来的公证人有点忙不过来,所以大家开始选更多的公证人,公证人的数量开始增加,不仅增加了,而且形成了产业链。原来的公证人变成了第一公证人,第一公证人可以给新的公证人出证,新的公证人变成第二、第三公证人,搞得好像传销一样。当只有一个公证人时,每个人都只是保存他的公钥。现在公证人越来越多,我们没有办法保存所有公证人的公钥。即使我们可以保存它们,我们也无法在新的公证人出现时实时更新它们。所以大家一致同意让所有的第一代公证人给自己颁发一个证书,叫做根证书,安装在我们的操作系统中。以后验证网站服务器的证书时,首先要验证证书的颁发者,然后在上层继续验证颁发者,直到验证最终的颁发者是否在根证书列表中。只要最终颁发者在系统的根证书列表中,在这条链上签名的证书都是可信的,否则我们会弹窗提醒用户:现在,这个方案已经扩展到全世界了。使用该方案的网站服务器,我们的浏览器会在地址栏加一个小锁,表示该网站是安全的,同时也会把URL地址从HTTP改为HTTPS...PS:本文用故事的形式描述HTTPS是如何工作的,但仅作为介绍,省略了很多细节。实际情况远比这复杂,比如对称加密密钥的计算方法、密钥的交换算法(RSA、DH、ECDH还是有区别的)、测试秘钥正确性的方法双方都没有体现,有机会再写一篇认真的技术文章抓包,详细分析HTTPS的详细过程。希望这篇文章能帮助你理解HTTPS机制,让你在阅读其他专业介绍时不再纠结。本文转载自微信公众号“编程技术宇宙”,可通过以下二维码关注。转载本文请联系编程技术宇宙公众号。
