热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

HTTPS:用故事告诉你我的“前世今生”

引言现在由于人们的安全意识越来越强了,对于互联网这个尤其走在时代前列的新宠来说,加密工作势在必行,现在很多公司和单位都在使用HTTPS,当然这个要看业务的具体情况。说到HTTP

引言

现在由于人们的安全意识越来越强了,对于互联网这个尤其走在时代前列的新宠来说,加密工作势在必行,现在很多公司和单位都在使用HTTPS,当然这个要看业务的具体情况。说到HTTPS,我们肯定就会提到加密算法,这个在本文的后面会做一个简单的阐述,本篇文章我会分为两个部分来讲解,第一个部分通过一个简单生动的故事来让门外汉都能理解HTTPS加密是什么以及重要性;第二个部门对HTTP和HTTPS做一个比较,加深一下理解;

HTTPS的故事

1 愉快的玩耍时光

故事的主人公我们称作露西和莉莉吧,露西和莉莉是好朋友,几乎无话不谈,大学毕业后就异地相隔,不在一个城市,但是每天都会通过网络聊天,聊着各自身边发生的搞笑故事,互相分享着学习和工作,就这样愉快的时光一天一天的过去了,一切都是这么的美好

2 聊天隐私被泄露的隐患->对称加密

愉快的时光总是很短暂的,马上她们发现了问题。

有一天网络聊天,露西对莉莉说,咱们两个聊天的内容犹如在大街上,我向你大声说话一样谁都能听到,一点安全性都没有,这样咱们俩的一些私密话题岂不是被人发现了,很尴尬的,上次还让你帮我买…呢,太尴尬了,怎么办才好呢,以后的聊天我可不想还这么裸奔式的被别人看到。

露西相了想说,要不咱们两个商量一个加密的方式,每次聊天的时候使用这种方式进行加密,你发给我之后,我再使用相同的方式进行解密,这样就算别人看到了,因为没有秘钥,也不知道是什么意思不就好了吗,perfect。但是问题又来了,露西说:”我要怎么将这个秘钥给你呢,我现在发给你的话,别人也会截取到的啊,最后不还是白白浪费功夫?”,这时候莉莉提议说:”我这几天会去你所在的北京出趟差,到时候咱们俩见面的时候你将秘钥给我,这样的话秘钥别人就不知道了,也就保证了咱们俩聊天内容传输的安全性能了”,还是这么的完美,简直太聪明了,就这样露西和莉莉以后的聊天果然就安全多了,没有被一双眼睛盯着看一样。这个过程类似于下图:
这里写图片描述

但是,因为露西的朋友是在是太多了,秘钥又是双方都得知道的,不可能每个朋友都要去所在的城市给她一个秘钥吧?这样不太方便也不太现实,看来还得想新的解决办法啊。

3 RSA非对称加密算法

有一天,露西突然在网上看到了RSA加密算法,就深入研究了一下,这个RSA加密算法就比较有意思了,它是由一对儿钥匙组成的,其中一个是公钥,就是对所有人都公开的,另外一个是私钥,就是严格保密的,只有自己知道,泄露的话就会有信息泄露的风险。这里公钥加密的数据只有私钥可以解开,私钥加密的数据只有公钥能够解开。
这里写图片描述
这样的话当莉莉给露西发消息的时候就使用露西的公钥对消息加密,因为公钥是公开的,等到露西收到消息的时候,就使用仅仅自己知道的私钥去解密即可得到消息,简直不要太完美。
这里写图片描述
当露西要给莉莉发消息的时候相反的,使用莉莉的公钥加密,当莉莉接到消息后就使用自己的私钥进行解密即可得到消息内容,这样的话就解决了消息被窥探的风险。

4 RSA非对称加密算法+对称加密算法

过了一段时间,露西发现使用RSA加密传输数据是在是太慢了,效率比起对称加密来说慢了可不止一点半点啊,要不是因为安全性高的话,早就放弃这个加密方式了,突然一个念头出现在她的脑海里,可不可以将两种加密方式结合一下,取其精华,剔除糟粕,完美的结合一下,简单来说是这样的,首先我生成一个对称加密的秘钥,使用RSA的方式发送给莉莉;然后就摒弃这种传输方式使用刚才传输的秘钥使用对称加密的方式进行加密传输,这样即安全还快速。露西赶紧把这个想法告诉了莉莉,然后莉莉对露西的想法连连称赞,这样的话不仅解决了RSA传输慢的问题,还解决了对称秘钥的传输问题,一举两得。使用这样的方式之后果然效率大大的提高了。

5 RSA公钥泄露

经过了一段时间之后,有一天露西又发现问题了,露西可真是学无止境啊。

露西告诉莉莉说:“我给你发公钥的时候,如果有一个中间人劫持了我给你发的公钥,也劫持了你给我发的公钥,都替换成了自己的公钥,这个是完全可能的,那么我使用莉莉你的公钥加密消息发送给你的时候,其实是使用的这个中间人的公钥加密的消息,那么这个人就可以使用自己的私钥解密消息,然后再使用你的公钥加密消息发送给你,当你收到消息的时候使用自己的私钥解密消息,一切看似正常,但是实际上你却不知不觉中被人玩弄于鼓掌之中,消息还是照样泄露了,太可怕了,反过来你给我发消息也一样”。莉莉听完手心直出汗,怎么到处都是窥探狂啊,真的是快抓狂了。
这里写图片描述
其实说了这么久,好像还是回到了最原始的位置,类似于聊天内容被泄露一样,真的是让人痛不欲生啊。公钥虽然公开,但是不代表就是安全的,看来还需要做点什么加密措施才行啊。

6 RSA公钥泄露之解决方法

下面讲一个小故事作为插曲,更加深刻的理解接下来要讲解的数字签名和数字证书等内容。

假如有两个公司,分别是A公司和B公司(这两家公司关系很好,有业务往来),有一天A公司的小张要去B公司办事,但是B公司的人都不认识小张,这怎么办呢?就用我们最常用的方法,A公司开一封介绍信盖上公章让小张带去到B公司,这样的话B公司的接待人员看到小张带来的介绍信有A公司的公章(前提是这个公章是真的,并且接待人员认识这个公章)就会明白小张是我们合作伙伴A公司的人,就会热情款待,事情办理起来就会很好办理。

但是问题也来了如果有别的公司也和这个B公司有业务往来,而且是很多公司,那么这个时候B公司的接待人员不可能都记得每个去B公司办事的人的公司的公章,因为有的人可能盖的公章是假的,这就会给坏人以可乘之机,这个时候如何是好呢?这个时候就会想到,生活中经常使用的方法,找一个权威的第三方大家都信任的平台比如说是C公司,让C公司出面给你办理一个证明,比如说给A公司办理一个证明文件也就是后面要说到的数字证书,数字证书里面包含的东西是A公司的公章和最重要的C公司的公章。OK

以后A公司的办事人员去B公司办事的时候带的东西就会增加一样,除了之前的一份介绍信盖有A公司的公章之外,还得带一份类似于数字证书的文件,这个文件包含了A公司的公章和C公司的公章,那么大家看起来可能会说这不是更加复杂了吗,文件也增多了一份,是的,表面看确实是复杂了点,但是逻辑简单了,也更加安全了,这样的话以后B前台的接待人员只需要核对两样东西即可,第一样看是否带有公信度比较强的C公司的公章,第二样核对A公司的两个公章是否一样即可,为什么呢?因为带有C公司公章的那个A公司的公章肯定是真的,只需要看仅仅盖有A公司的章的那份介绍信的公章是否和上面的盖有A和C两家公司的公章的A公司的公章一样即可,这样不仅安全,还大大减少了B公司接待人员的工作量。

说到这里,我们回过头来看看上面的问题,露西和莉莉的公钥被中间人劫持,这不就是公钥的泄漏问题吗,我们可以按照上面的故事,找一个第三方认证度比较高的中心(其实就是CA,是Certificate Authority的缩写,也叫“证书授权中心”)做一个公正,开具一个证书(比如给露西办理一个证书),证明里面包含了露西的基本个人信息,最重要的还包含露西的公钥,只要拿到露西的证书就能得到露西的公钥,但是怎么保证证书传递的过程中不会被篡改呢?这里我们有一个方法就是使用数字签名

数字签名是非对称密钥加密技术与数字摘要技术的应用,这里的数字摘要算法百度百科是这么说的:将任意长度的消息变成固定长度的短消息,它类似于一个自变量是消息的函数,也就是Hash函数。数字摘要就是采用单向Hash函数将需要加密的明文“摘要”成一串固定长度的密文这一串密文又称为数字指纹,它有固定的长度,而且不同的明文摘要成密文,其结果总是不同的,而同样的明文其摘要必定一致。

这种加密方式具有三个特点,(1)唯一性:指的是一段固定的数据,它使用Hash算法加密后的生成的摘要是唯一的;(2)伪随机性:指的是看似生成的摘要是随机的十六进制数据,但是如果数据源有一丁点变化,生成的摘要就会有千差万别,正所谓失之毫厘谬以千里;(3)不可逆转性:这个算法是不能逆转破解的,最起码到将来的一段时间之内是无法破解的。一般来说最常用的MD5加密算法,生成的摘要有32位的,也有16位的,区别很简单,16位是32位取中间9-24位构成的,所以说起来16位还比32多了一个操作步骤呢。

接着上面的说,使用了消息摘要算法后,我们将包含露西的基本信息和公钥的文件进行消息摘要后生成一个不可逆转的唯一摘要,然后对这个摘要使用使用CA的私钥加密生成一个数字签名,得到数字证书:
数字证书生成

这样的话当露西给莉莉发送证书,当莉莉得到证书的时候,莉莉需要做两步骤进行验证,(1)对证书使用消息摘要算法生成摘要摘要A(2)使用CA公钥将对数字签名进行解密,生成一个摘要B,将这两个摘要进行比较,一模一样的话就证明露西的公钥没问题了。其实上面的C公司就相当于这里的CA机构了,C公司给A公司开具的证明就是数字证书啦。

但是这里还有一个问题,怎么保证CA的公钥不会被上面类似于中间人截取呢?这个问题就得看你自己了,我们要通过安全的通道获取CA的公钥,还有就是要信任这个CA即可。这里我们简单讲解一下根证书和证书之间的信任关系和信任链,这里可以把上面故事中讲到的C公司的当做根证书,因为根证书是被信任的,那么下面的子证书A公司的证书也是被信任的,这就是证书之间的信任关系和信任链,这里根证书是最重要的,如果根证书不被信任,那么一切就无从谈起了。

下面看一下谷歌浏览器的数字证书
这里写图片描述



这里写图片描述
上面的图就解释了根证书和证书信任链。
如果一个网站不受信任的,那么就会有如下提示:
这里写图片描述
这里写图片描述
这个时候你就要警惕点了,小心钓鱼网站哦。

7 HTTPS
下面用一张图来简单解释网络中的安全通信
这里写图片描述

相信看完图就很明白了,原理和上面说的是一样的。

HTTP和HTTPS比较

  • 我们都知道开放系统互连参考模型 (Open System Interconnect 简称OSI)百度百科解释是国际标准化组织(ISO)和国际电报电话咨询委员会(CCITT)联合制定的开放系统互连参考模型,为开放式互连信息系统提供了一种功能结构的框架。它从低到高分别是:物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。

  • https和https的区别从技术层面来说是在传输层和应用层之间加了一层安全层SSL(Secure Sockets Layer 安全套接层)或者是TLS层(Transport Layer Security,TLS),SSL协议提供的安全通道具有以下特性,(1)机密性:SSL协议使用密钥加密通信数据;(2)可靠性:服务器和客户都会被认证,客户的认证是可选的;(3)完整性:SSL协议会对传送的数据进行完整性检查。;从安全性上来看,因为https加上了SSL协议所以不仅保证了传输的准确性,还保证了安全性和完整性;从表现形式上来看https请求的时候会加上一个绿色的小锁,表明是安全的,而http没有;
    这里写图片描述
    这里写图片描述

今天的内容就写到这里了(完)


推荐阅读
  • POJ 2482 星空中的星星:利用线段树与扫描线算法解决
    在《POJ 2482 星空中的星星》问题中,通过运用线段树和扫描线算法,可以高效地解决星星在窗口内的计数问题。该方法不仅能够快速处理大规模数据,还能确保时间复杂度的最优性,适用于各种复杂的星空模拟场景。 ... [详细]
  • Keepalived 提供了多种强大且灵活的后端健康检查机制,包括 HTTP_GET、SSL_GET、TCP_CHECK、SMTP_CHECK 和 MISC_CHECK 等多种检测方法。这些健康检查功能确保了高可用性环境中的服务稳定性和可靠性。通过合理配置这些检查方式,可以有效监测后端服务器的状态,及时发现并处理故障,从而提高系统的整体性能和可用性。 ... [详细]
  • 为了确保iOS应用能够安全地访问网站数据,本文介绍了如何在Nginx服务器上轻松配置CertBot以实现SSL证书的自动化管理。通过这一过程,可以确保应用始终使用HTTPS协议,从而提升数据传输的安全性和可靠性。文章详细阐述了配置步骤和常见问题的解决方法,帮助读者快速上手并成功部署SSL证书。 ... [详细]
  • 在分析和解决 Keepalived VIP 漂移故障的过程中,我们发现主备节点配置如下:主节点 IP 为 172.16.30.31,备份节点 IP 为 172.16.30.32,虚拟 IP 为 172.16.30.10。故障表现为监控系统显示 Keepalived 主节点状态异常,导致 VIP 漂移到备份节点。通过详细检查配置文件和日志,我们发现主节点上的 Keepalived 进程未能正常运行,最终通过优化配置和重启服务解决了该问题。此外,我们还增加了健康检查机制,以提高系统的稳定性和可靠性。 ... [详细]
  • 本文介绍了在 Java 编程中遇到的一个常见错误:对象无法转换为 long 类型,并提供了详细的解决方案。 ... [详细]
  • 本文回顾了作者初次接触Unicode编码时的经历,并详细探讨了ASCII、ANSI、GB2312、UNICODE以及UTF-8和UTF-16编码的区别和应用场景。通过实例分析,帮助读者更好地理解和使用这些编码。 ... [详细]
  • javascript分页类支持页码格式
    前端时间因为项目需要,要对一个产品下所有的附属图片进行分页显示,没考虑ajax一张张请求,所以干脆一次性全部把图片out,然 ... [详细]
  • 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4277。作者:Bob Lee,日期:2012年9月15日。题目描述:给定n个木棍,求可以组成的不同三角形的数量,最多15根木棍。 ... [详细]
  • 全面解析二叉树与递归算法:基于LeetCode实战案例(题目编号114、297、449、1008、450)
    递归作为一种强大的问题求解工具,在程序设计中占据着重要地位。它不仅能够帮助编写简洁明了的代码,还能显著提升程序的整体质量。在解决复杂问题时,递归函数的应用尤为广泛,如深度优先搜索(DFS)、回溯算法和动态规划等。本文通过LeetCode上的经典题目(编号114、297、449、1008、450),详细解析了二叉树与递归算法的结合应用,为读者提供了丰富的实战案例和深入的技术分析。 ... [详细]
  • 近期在研究逆向工程,因此尝试了一些CTF题目。通过合天网络安全实验室的CTF实战演练平台(http://www.hetianlab.com/CTFrace.html),我对Linux逆向工程的掌握还不够深入,因此暂时跳过了RE300题目。首先从逆向100开始,将文件后缀名修改为.apk进行初步分析。这一过程不仅帮助我熟悉了基本的逆向技巧,还加深了对Android应用结构的理解。 ... [详细]
  • 本文是Java并发编程系列的开篇之作,将详细解析Java 1.5及以上版本中提供的并发工具。文章假设读者已经具备同步和易失性关键字的基本知识,重点介绍信号量机制的内部工作原理及其在实际开发中的应用。 ... [详细]
  • 深入探索HTTP协议的学习与实践
    在初次访问某个网站时,由于本地没有缓存,服务器会返回一个200状态码的响应,并在响应头中设置Etag和Last-Modified等缓存控制字段。这些字段用于后续请求时验证资源是否已更新,从而提高页面加载速度和减少带宽消耗。本文将深入探讨HTTP缓存机制及其在实际应用中的优化策略,帮助读者更好地理解和运用HTTP协议。 ... [详细]
  • 在Ubuntu系统中安装Android SDK的详细步骤及解决“Failed to fetch URL https://dlssl.google.com/”错误的方法
    在Ubuntu 11.10 x64系统中安装Android SDK的详细步骤,包括配置环境变量和解决“Failed to fetch URL https://dlssl.google.com/”错误的方法。本文详细介绍了如何在该系统上顺利安装并配置Android SDK,确保开发环境的稳定性和高效性。此外,还提供了解决网络连接问题的实用技巧,帮助用户克服常见的安装障碍。 ... [详细]
  • 本文详细介绍了在Linux系统上编译安装MySQL 5.5源码的步骤。首先,通过Yum安装必要的依赖软件包,如GCC、GCC-C++等,确保编译环境的完备。接着,下载并解压MySQL 5.5的源码包,配置编译选项,进行编译和安装。最后,完成安装后,进行基本的配置和启动测试,确保MySQL服务正常运行。 ... [详细]
  • Java中不同类型的常量池(字符串常量池、Class常量池和运行时常量池)的对比与关联分析
    在研究Java虚拟机的过程中,笔者发现存在多种类型的常量池,包括字符串常量池、Class常量池和运行时常量池。通过查阅CSDN、博客园等相关资料,对这些常量池的特性、用途及其相互关系进行了详细探讨。本文将深入分析这三种常量池的差异与联系,帮助读者更好地理解Java虚拟机的内部机制。 ... [详细]
author-avatar
书友70030711
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有