开发者社区> 天真的蓝> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

【JAVA秒会技术之秒懂HTTPS】白话图解HTTPS原理

简介: 白话图解HTTPS原理         【前言】最近看过几篇文章,内容是关于“全民HTTPS”的。为什么HTTPS,突然会受到如此多业内人士的青睐呢?HTTPS究竟是什么呢?它与HTTP又有怎样的区别呢?     带着这个问题,我查看了很多网上的资料,但是太多的专业词汇,让我感到头疼,很难理解。按我个人的认知,这个世界上根本不存在任何高深的道理,尤其是西方讲究科学性的思维,再高深,也
+关注继续查看

白话图解HTTPS原理

 

      【前言】最近看过几篇文章,内容是关于“全民HTTPS”的。为什么HTTPS,突然会受到如此多业内人士的青睐呢?HTTPS究竟是什么呢?它与HTTP又有怎样的区别呢?

    带着这个问题,我查看了很多网上的资料,但是太多的专业词汇,让我感到头疼,很难理解。按我个人的认知,这个世界上根本不存在任何高深的道理,尤其是西方讲究科学性的思维,再高深,也不可能高深过中国传统思想中的八个字“只可意会,不可言传”,完全不该诉你,让你自己去领悟,这多难啊。

        所以,我又耐着性子,参照翟志军的《也许,这样理解HTTPS更容易》一文,以及百度词条的相关定义,用类比的方法,追根溯源,重新梳理一下,才恍然大悟。本着分享的精神,我就把自己所感所悟的过程记录下来,希望大家读罢此文,也能有所感悟!

       【思考一:为什么HTTPS会突然受到青睐?

    答案就四个字——HTTP劫持

       【思考二:什么是HTTP劫持?

        官方解释:什么是HTTP劫持呢,大多数情况是运营商HTTP劫持,当我们使用HTTP请求请求一个网站页面的时候,网络运营商会在正常的数据流中插入精心设计的网络数据报文,让客户端(通常是浏览器)展示“错误”的数据,通常是一些弹窗,宣传性广告或者直接显示某网站的内容。

        通俗解释你预定了某类军事杂志类比“客户端向服务器发送了一条请求,访问军事网站”,此时黑心快递员类比“不要脸的运行商或黑客”拆封了你的快递类比“劫持了你的正常数据流”,然后在军事杂志的每一页,都贴上了“包小姐”的小广告类比精心设计的网络数据报文,再送行打包送给你,获得额外盈利。

       【引申:什么是DNS劫持?

        官方解释DNS劫持就是通过劫持了DNS服务器,通过某些手段取得某域名的解析记录控制权,进而修改此域名的解析结果,导致对该域名的访问由原IP地址转入到修改后的指定IP,其结果就是对特定的网址不能访问或访问的是假网址,从而实现窃取资料或者破坏原有正常服务或诈骗钱财的目的。

        通俗解释高考填报考时,你在志愿书上填写了“北大”类比“正常请求”,但是你的前任偷走了你的志愿书类比“劫持了DNS服务器”,把他改成了“北大某鸟”。最后的结果就是,你以690分的成绩考入了北大某鸟类比“最终访问了假网址”,然后还伪装北大招生办,让你往某银行卡打入5千元学费(类比“后续诈骗钱财”)。

       【一句话概括:HTTP劫持与DNS劫持的区别?

        HTTP劫持:你打开的是人民日报的官方网站,右下角却弹出了蓝翔的挖掘机广告。

        DNS劫持:你在地址栏输入的是人民日报的网页地址,却打开了淘宝特卖的钓鱼网站。

       【思考三:HTTP为什么会被劫持?

         一句话:HTTP在传输的过程中使用的是明文

通俗解释你在快递东西的时候,快递员是可以看到你的物品的,这样,他就可以随意更换篡改你的东西。

       【思考四:如何避免HTTP明文的不良影响呢?(推演HTTPS协议的前世今生)

        1.最先想到的就是对明文进行加密,比如各种对称加密(DES);

         

    安全成立的条件:S足够安全,且只有A和B知道;

    但是这样就可以了吗?——远没想象那么简单!

    如果服务器端B对所有的客户端通信A都使用同样的对称加密算法S,那么,这是不是就可以轻易破解,也就无异于没有加密了呢?

          

         2.如何即能使用对称加密算法,又不公开密钥?

    答:Web服务器与每个客户端使用不同的对称加密算法:

          

         3.服务器端B怎么告诉客户端A该使用哪种对称加密算法S呢?

         答:通过协商。

          

    但是,这样就安全了吗?——依然没有,因为这个协商过程,本身又是裸露的,依然可以被获知,那么怎么办呢?

有人说继续对“协商内容”进行加密,那么,此时你有没有发现,已经陷入一个死循环了呢?

          

         4.如何解决这种对称加密的死循环呢?

    答:用非对称加密(常用RSA)。

         5.什么是非对称加密?

         官方解释对称加密算法在加密和解密时使用的是同一个秘钥;而非对称加密算法需要两个密钥来进行加密和解密,这两个秘钥是公开密钥(public key,简称公钥)和私有密钥(private key,简称私钥)。

         通俗解释政府的财政收入(类比“私钥加密后的密文”),只要是公民,都有权知道(类比“只要是公钥,都可以解密”);但是公民个人的收入(类比“公钥加密后的密文”),除了自己,只有政府才可以知道,其他人不行(类比“只有私钥可以解密”)。中国政府只有一个,但公民是有很多的(类比“私钥只有一个人有,而公钥可以发给所有的人”)。

          

        此时你应该明白了:HTTPS同时需要对称加密算法和非对称加密算法

        6.要达到Web服务器针对每个客户端使用不同的对称加密算法,同时,我们也不能让第三者知道这个对称加密算法是什么,怎么办?

        答:使用随机数。就是使用随机数来生成对称加密算法。这样就可以做到服务器和客户端每次交互都是新的加密算法、只有在交互的那一该才确定加密算法。

    此时,你明白为什么HTTPS协议握手阶段会有这么多的随机数了吧。

        7.如何让客户端安全地得到公钥呢?

        答:两种假设:

        ①让服务器端将公钥放到一个远程服务器,客户端可以请求得到;

        ②让服务器端将公钥发送给每一个客户端;

    先看假设①,将公钥放到一个远程服务器,客户端又需要发送请求才能得到。注意,一旦有请求,又有明文,又回到那个死循环了。显然不可以!

    再看假设②,仍然有一个问题:如果服务器端发送公钥给客户端时,被中间人调包了,怎么办?显然不可以!

为了方便能理解,请看下图:

         

        8.如何解决公钥被调包的隐患呢?

        公钥被调包的问题出现,是因为我们的客户端无法分辨返回公钥的人到底是中间人,还是真的服务器。这其实就是密码学中提的身份验证问题。

        问题的关键在于:我们选择直接将公钥传递给客户端的方案,我们始终无法解决公钥传递被中间人调包的问题。

所以,我们不能直接将服务器的公钥传递给客户端,而是第三方机构使用它的私钥对我们的公钥进行加密后,再传给客户端。客户端再使用第三方机构的公钥进行解密,这样就引出了数字证书的概念。

        9.什么是数字证书?

        官方解释:数字证书是一个经证书授权中心数字签名的包含公开密钥拥有者信息以及公开密钥的文件。最简单的证书包含一个公开密钥、名称以及证书授权中心的数字签名。数字证书还有一个重要的特征就是只在特定的时间段内有效。数字证书是一种权威性的电子文档,可以由权威公正的第三方机构,即CA(例如中国各地方的CA公司)中心签发的证书,也可以由企业级CA系统进行签发。

         

        说明:证书中只有服务器交给第三方机构的公钥,而且这个公钥被第三方机构的私钥加密了。如果能解密,就说明这个公钥没有被中间人调包。因为如果中间人使用自己的私钥加密后的东西传给客户端,客户端是无法使用第三方的公钥进行解密的。

        但是第三方机构不可能只给你一家公司制作证书,它也可能会给中间人这样有坏心思的公司发放证书。这样的,中间人就有机会对你的证书进行调包,客户端在这种情况下是无法分辨出是接收的是你的证书,还是中间人的。因为不论中间人,还是你的证书,都能使用第三方机构的公钥进行解密。

        这样,又出现了不安全因素,像下面这样:

         

        10.如何解决同一机构颁发的不同证书被篡改的问题呢?

    要解决这个问题,我们首先要想清楚11和12这两个问题:

        11.谁来负责辨别同一机构下不同证书呢?

        答:客户端。客户端在拿到证书后,自己就有能力分辨证书是否被篡改了。

        12.如何才能拥有分辨证书是否被篡改的能力呢?

        答:使用数字证书。我们从现实中找灵感。比如你是HR,你手上拿到候选人的学历证书,证书上写了持证人,颁发机构,颁发时间等等,同时证书上,还写有一个最重要的:证书编号!我们怎么鉴别这张证书是的真伪呢?只要拿着这个证书编号上相关机构去查,如果证书上的持证人与现实的这个候选人一致,同时证书编号也能对应上,那么就说明这个证书是真实的。

       13.客户端本地怎么验证证书呢?

    让证书本身写上“如何根据证书的内容生成证书编号”。也就是:客户端拿到证书后,根据证书上的方法自己生成一个证书编号,如果自己生成的证书编号与证书上的证书编号相同,那么说明这个证书是真实的。同时,为避免证书编号本身又被调包,所以使用第三方的私钥进行加密。

        这地方有些抽象,我们来个图帮助理解:

        

        当客户端拿到证书后,开始对证书中的内容进行验证,如果客户端计算出来的证书编号与证书中的证书编号相同,则验证通过。

        14.这么多机器,第三方机构的公钥怎么跑到了客户端的机器中呢?

        其实呢,现实中,浏览器和操作系统都会维护一个权威的第三方机构列表(包括它们的公钥)。因为客户端接收到的证书中会写有颁发机构,客户端就根据这个颁发机构的值在本地找相应的公钥。

       【类比总结

        上边例子中:

        所提到的证书,其实就是HTTPS中的数字证书

        所提到的证书编号就是HTTPS中的数字签名

        所提到的第三方机构就是指数字证书签发机构(CA)

       【一句话总结HTTPS的原理

        HTTPS要使客户端与服务器端的通信过程得到安全保证,必须使用的对称加密算法,但是协商对称加密算法的过程,需要使用非对称加密算法来保证安全,然而直接使用非对称加密的过程本身也不安全,会有中间人篡改公钥的可能性,所以客户端与服务器不直接使用公钥,而是使用数字证书签发机构(CA)颁发的证书来保证非对称加密过程本身的安全,为了保证证书不被篡改,引入数字签名,客户端使用相同的对称加密算法,来验证证书的真实性,如此,最终解决了客户端与服务器端之间的通信安全问题。

        


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
【Java】【Javaweb】不用点技术活能找到npy?❤️来看这篇邮件发送❤️(1024属于程序员的节日)(下)
4.5 注册servlet 4.6 utils工具类 4.7 有可能报错这个问题: 4.8 测试结果 5. 在springboot中实现
31 0
【Java】【Javaweb】不用点技术活能找到npy?❤️来看这篇邮件发送❤️(1024属于程序员的节日)(上)
以qq邮箱为例 邮件收发 1. 给QQ邮箱发邮件 1.1 导包 1.2 在邮箱中配置 1.3 MailDemo01 1.4 运行查看结果 2. 发送复杂内容 2.1 图片地址 2.2 发送带图片的Mail 2.3 测试结果
37 0
java定时任务实现的几种方式
   在开发测试工具的应用后台,经常听到同事说要做个定时任务把做日志处理,或者数据清理,包括做些复杂的业务计算逻辑,在选择定时任务的时候,怎么能够快速实现,并且选择一种更适合自己的方式呢? 我这里把定时任务的实现收集整理了一些方法,希望可以帮到刚开始做定时任务的同学,写得不对的地方请指正。 一 
19452 0
Mac环境下用Java(Sikuli+Robot)实现页游自动化
转载请注明出自天外归云的博客园:http://www.cnblogs.com/LanTianYou/ Sikulix(以前叫Sikuli)在Mac电脑的环境配置步骤如下: 1、从官网上下载Sikulix最新版本(目前为1.
1956 0
Java反序列化漏洞执行命令回显实现及Exploit下载
原文地址:http://www.freebuf.com/tools/88908.html   本文原创作者:rebeyond 文中提及的部分技术、工具可能带有一定攻击性,仅供安全学习和教学用途,禁止非法使用! 0×00 前言 前段时间java 的反序列化漏洞吵得沸沸扬扬,从刚开始国外某牛的一个可以执行OS命令的payload生成器,到后来的通过URLClassLoader来加载远程类来反弹shell。
1469 0
最大熵的Java实现
这是一个最大熵的简明Java实现,提供训练与预测接口。训练采用GIS训练算法,附带示例训练集。本文旨在介绍最大熵的原理、分类和实现,不涉及公式推导或其他训练算法,请放心食用。 最大熵理论 简介 最大熵属于辨识模型,能够满足所有已知的约束, 对未知的信息不做任何过分的假设。
992 0
Java 实现的各种经典的排序算法小Demo
由于有上机作业,所以就对数据结构中常用的各种排序算法都写了个Demo,有如下几个: 直接插入排序 折半插入排序 希尔排序 冒泡排序 快速排序 选择排序 桶排序 Demo下载地址 下面谈一谈我对这几个排序算法的理解: 插入类算法 对于直接插入排序:(按从小到大的...
1392 0
Java---计算机贷款支付额计算(用对话框实现)
本例演示如何编写程序来计算贷款支付问题。 下面是编写程序的步骤: 1.提示用户输入年利率、年数和贷款总额 2.利用年利率算出月利率 3.通过前面的公式计算月支付额。 4.计算总支付额,它是月支付额乘以12再乘以年数。
799 0
Java 并发专题 :FutureTask 实现预加载数据 在线看电子书、浏览器浏览网页等
转自:http://blog.csdn.net/lmj623565791/article/details/26817403  继续并发专题~ FutureTask 有点类似Runnable,都可以通过Thread来启动,不过FutureTask可以返回执行完毕的数据,并且FutureTask的get方法支持阻塞。 由于:FutureTask可以返回执行完毕的数据,
909 0
+关注
天真的蓝
java,架构方面专家
56
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载