网络传输与加密

谈到网络,就必然会涉及网络安全。但“安全”这个事情, 一下子就会让人联想到黑客,进而把“安全”这个事情无限放大为各种高大上、神秘莫测、不可知。这不是一个engineer应有的态度(《一次艰难debug的反思》)。

要讨论网络安全,可以从最核心的“加密”谈起。

加密,英文叫encryption。显然,无论中、英文,都不太能够从字面文法上,给人以直观的联想和理解(这是典型的“装X亮词”的特性)。那更接地气的直观说法是什么呢?按我的话来说就是:把信息搞成乱码。

例如,你想要向一位妹纸传达信息“下午3点,不见不散”。可这条信息因为你计算机上的编码问题,被显示成了“绯荤粺绻佸繖,璇风”。这件让人头痛的事情,其实就是高大上的“加密”了。因为信息已经被弄得面目全非,无法识别,成了秘密,也即是为信息加上了“秘密”这层属性。

一般来说,这个被弄成乱码之前的信息,就叫做“明文”,也就是光明正大的、没有任何秘密可言的、谁都看得懂的文字信息。而看不懂的乱码,就被叫做“密文”,因为它到底表示什么意思成了一个秘密。

密码学,从本质上来说就是研究如何把信息“按照一定的要求和限制”搞成乱码。这堆要求和限制大都很奇葩,比如神马:被弄成加密信息的乱码要有办法被恢复成乱码前的样子(也即是密文要能恢复成明文),乱码的长度要保持一致、“几乎不可能”找到两条不同的信息被搞成相同的乱码、原信息仅仅是有微小的改动就会造成加密后的乱码产生巨大的不同,等等。

在这么多的限制条件下,要设计出一套方案(或者说算法)使得信息既能够被搞成乱码、还能够满足特定的约束条件,就变成了一件不平凡的事情。而这一块的内容,通常由数学家来完成,特别的,是由做代数分支的数学家来完成。

理解了“加密”就是“把信息搞成乱码”,再来讨论网络与加密的关系就容易多了。

如《网络概念与快递物流 | 墙与梯子》中所说,网络的基本组成就三部分,起点A、中点B以及连接AB的一根线,如下图

 

 

这个简单的基本模型,不仅适用于网络,更是适合从古到今所有的信息运输方式,如古代的飞鸽传书、快马送战报。很显然,这个信息传输模型中,最脆弱的环节就是中间那根长长的线。你几乎无法控制、也无法预料,在信息被传输的这个过程中,信息是否会被拦截、是否会被更换等等。

那怎么办呢?一个直观的想法便是上面提到的方法——加密,也就是把信息搞成乱码。这里的重点是:你并不是要阻止信息被拦截,而是就算其他人拦截了你的信息也没用,因为看不懂。所以,这是第一个要澄清的关于网络安全中加密部分的理念:并不是有什么黑魔法,使得在网线、光纤中流动的数字信息不被拦截,而是即便是这些信息被拦截了,也无法搞清楚这些信息到底是什么意思。

那么,要完成整个通讯的流程,仅仅是把信息搞成乱码(加密)是不够的,你还必须有办法把乱码恢复成原来的样子(解密),这就涉及到“秘钥”这个概念。顾名思义,“秘钥”就是解开秘密的钥匙,也即是把乱码恢复成以前样子(明文)的工具。这个工具是什么呢?是另一串乱码,可以长成这个样子:“KH2J9-PC326-T44D4-39H6V-TVPBY”。

为什么靠这串乱码就可以恢复呢?这涉及到加密算法的数学理论,我们可以暂时忽略这部分的细节。反正根据一系列的步骤和数学操作,可以使用被称为秘钥的乱码,把加密的信息乱码恢复成原来模样。

解密需要秘钥,这很容易理解,但事实上,加密的过程其实也需要秘钥,你可以把它理解为上锁(搞成乱码)的钥匙。通常,用于加密的钥匙叫公钥,因为它可以被公开散布在各个地方,被用来把信息变成乱码。而解密的钥匙,当然就私密了,不是人人都可以得到的,所以被叫做私钥。

到这里,或许你或许会下意识地认为:有了“加密、解密”,安全领域需要的工具似乎就都齐备了。那你就too young too simple了。事实上,我们还需要立马要介绍的“验证工具”。除了它字面意思被用作验证以外,更重要的是,它能够和加密解密工具组合起来,完成更加高难度的动作!

目前常见的验证工具有MD5和SHA-256,其本质也是一堆算法,也是用于把一堆信息搞成乱码。例如,一个文件“fileT.tar.gz”被MD5算法作用后,会变成字符串“38b8c2c1093dd0fec383a9d9ac940515”。乍一看,这似乎和上面讨论的加密解密没啥区别。可他们的目的,却完全不同。

验证工具的目的,不是为了加上一道锁再打开,而是为了给出一种方案去保证你“实际拿到”的东西确实是你“期望拿到”的东西。如同“加密”,这个验证过程也有一个装X且让人傻傻看不懂的专业术语——签名(signature)。等我们弄清楚了验证过程,再来考察这逼格满满的术语。

既然是“验证”,那么回到生活场景中,便是那个老大难的问题:你怎么证明你是你自己?客观来说,这个问题其实挺难回答的。特别是,如果你要把这个判断标准扔给计算机,你发现你很难找到一个合适的方式去描述你的特性,从而证明你就是你这么一个哲学问题。

那么,密码学是如何处理这个问题的呢?它的想法比较简单,就是考虑用之前提到的加密(搞成乱码)的某个约束条件:即便是原信息(明文)有微小改动,也会造成加密后的信息(乱码)的巨大不同。例如,字符串“hello”被md5作用后,会得到乱码“b1946ac92492d2347c6235b4d2611184”。而仅仅有一字之差的“hello1”被md5作用后却会得到“b52731692f35498bba7e4660142129d2”。

如果跳出来看,我们可以这样理解:任意一个东西A,被md5作用后,它就能够得到一个特性,这个特性由128位的字符表示。而任何另一种东西B(哪怕B和A非常的相似、仅仅只有毫厘之差),被md5作用后,会得到一个非常不同的属性值,即非常不同的128位的字符表示。那么,这个被md5作用后的值,其实就可以被用来判定“A是否还是A”。就像是一个人的签名手法各有不同,所以这个用来判定“你就是你”的128位字符串,就被称作签名。

(当然了,经md5作用后生成出来的签名字符串只有128位。从安全性角度讲,能够暴力破解的几率还是不够小。那么,如果要求更苛刻一点,就可以考虑SHA-256,能够生成256位的签名字符串。SHA-256比起md5可不是多出了一倍,而是2的128次方倍!)

如果经常下载软件的同学,想必早已见过md5。通常,稍微正规的软件下载网站,都会在可以下载的二进制文件(不明白的同学,可以简单粗暴地把它理解为exe文件)旁边,放一个md5码,用于验证。

一个直接的问题是,有这个必要性吗?或者说,需要搞得这么复杂吗?!

我的回答是:太尼玛有必要了啊!

且不说你所在的下载网站是否会提供恶意软件,让我们先暂时假定你所用的下载网站是良心商家运营的,他的本意是为用户提供正当的软件。可是,如果这个下载过程的数据,被恶意劫持、被替换成一个拥有相同功能但却会有一些后门和恶意操作的软件数据。

请问,有什么办法去区别、去确认你所下载的软件就是网站为你提供的软件吗?

回忆刚才我们讲的内容,这不就是让你去证明:A(网站提供的下载软件)就是A吗?那么,根据我们刚才的讨论,用md5就太合适了。你只需要把你下载的软件,让md5函数作用一遍,便能得到一个签名字符串。你只需要去比较“你生成的签名字符串”是否和“网站提供的md5签名字符串”一致。并且,你知道,哪怕这个软件仅仅是被做了微小的改动,这个md5签名字符串也会变得面目全非。

这样你就能够理解md5的强大和实用了。

那么,有了加密工具、有了验证工具,能够玩儿出什么花样呢?

 

 

网络传输与加密 (2)

 

  

 

 

近期回顾

《为什么需要提前撰写Spec文档》
《2018年06月写字总结》
《叫兽的逻辑 | #Metoo》

 

 

 

如果你喜欢我的文章或分享,请长按下面的二维码关注我的微信公众号,谢谢!

 

 

   

更多信息交流和观点分享,可加入知识星球:

转载于:https://www.cnblogs.com/kid551/p/9409861.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/451794.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

21--最小栈

文章目录1.问题描述2. 代码详情1.问题描述 设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。 push(x) —— 将元素 x 推入栈中。 pop() —— 删除栈顶的元素。 top() —— 获取栈顶元素。 getMin() —— 检索栈中的…

22--删除字符串中的所有相邻重复项

文章目录1. 题目要求2.代码详情1. 题目要求 给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。 在 S 上反复执行重复项删除操作,直到无法继续删除。 在完成所有重复项删除操作后返回最终的字符串。答案保…

jQuery上传插件Uploadify使用Demo、本地上传(ssm框架下)

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 效果&#xff1a; 1. jar包导入&#xff1a; <!-- 文件上传组件 --><dependency><groupId>commons-fileupload</g…

11 步教你选择最稳定的 MySQL 版本

MySQL开源数据库有多个重要分支&#xff0c;目前拥有的分支分别为&#xff1a;MySQL Cluster、MySQL 5.1、MySQL 5.5、MySQL 6.2。每个分支都有着同样的的MySQL数据库版本&#xff0c;分别为&#xff1a;Development版本、Alpha版本、Beta版本、RC版本和GA版本。Development版本…

【RabbitMQ】6、rabbitmq生产者的消息确认

2019独角兽企业重金招聘Python工程师标准>>> 通过Publisher Confirms and Returns机制&#xff0c;生产者可以判断消息是否发送到了exchange及queue&#xff0c;而通过消费者确认机制&#xff0c;Rabbitmq可以决定是否重发消息给消费者&#xff0c;以保证消息被处理…

泛型方法

java泛型方法简单介绍

修改jquery文件上传插件uploadify的英文为中文

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 效果&#xff1a; 对于这种样式的问题&#xff0c;我都是简单粗爆的解决&#xff1a; 找到uploadify的js文件&#xff0c;通常不是js&…

24--反转字符串中的单词 III

文章目录1.问题描述2. 代码详情1.问题描述 给定一个字符串&#xff0c;你需要反转字符串中每个单词的字符顺序&#xff0c;同时仍保留空格和单词的初始顺序。 示例 1: 输入: “Let’s take LeetCode contest” 输出: “s’teL ekat edoCteeL tsetnoc” 注意&#xff1a;在字…

Apache Cassandra 1.1.0 稳定版发布

Apache Cassandra团队今天正式推出了1.1分支的首个稳定版1.1.0版本。Apache Cassandra是一套开源的分布式 NoSQL 数据库系统&#xff0c;遵循 Apache Lience 2 协议。它最初由 Facebook 开发&#xff0c;用于储存收件箱等简单格式数据&#xff0c;集 Google BigTable 的数据模型…

25--最后一个单词的长度

文章目录1.问题描述2.代码详情1.问题描述 给定一个仅包含大小写字母和空格 ’ ’ 的字符串 s&#xff0c;返回其最后一个单词的长度。如果字符串从左向右滚动显示&#xff0c;那么最后一个单词就是最后出现的单词。 如果不存在最后一个单词&#xff0c;请返回 0 。 说明&…

MySQL 企业监控器 2.3.10 正式版发布

Oracle于近日发布了 MySQL 企业监控器 2.3.10 正式版。 MySQL企业监控器主要用于实施对数据库进行监控和管理。通过它&#xff0c;数据库管理员不但可以获得高级的数据复制和数据库监控功能&#xff0c;同时还可以简化安装流程。而且&#xff0c;无论是对于MySQL企业版&#xf…

Docker 跨主机网络方案分析

PS&#xff1a;文章首发公众号&#xff0c;欢迎大家关注我的公众号&#xff1a;aCloudDeveloper&#xff0c;专注技术分享&#xff0c;努力打造干货分享平台&#xff0c;二维码在文末可以扫&#xff0c;谢谢大家。 上篇文章介绍了容器网络的单主机网络&#xff0c;本文将进一步…

26-- 转换成小写字母

文章目录1.问题描述2.代码详情1.问题描述 实现函数 ToLowerCase()&#xff0c;该函数接收一个字符串参数 str&#xff0c;并将该字符串中的大写字母转换成小写字母&#xff0c;之后返回新的字符串。 示例 1&#xff1a; 输入: “Hello” 输出: “hello” 示例 2&#xff1a;…

初学duboo+zookeeper

看了很多相关资料&#xff0c;其实都没有自己动手试一次印象更深刻一些。找了很多教程&#xff0c;下工具&#xff0c;花了几个小时终于让程序跑起来了&#xff0c;下面说下步骤&#xff1a;1.java环境也就安装jdk&#xff0c;我使用的是1.7版本&#xff0c;jdk安装就不在这复述…

Fedora 17 Beta 版发布

Fedora团队今天发布了Fedora 17 Beta版本&#xff0c;这是正式版本发布前的最后一个重要的里程碑版本。据该团队介绍&#xff0c;正式版将在今年5月发布&#xff0c;将主要修复Beta版中发现的关键性bug。针对普通用户的桌面改进&#xff1a; 采用GNOME 3.4&#xff0c;提升了用…

[转] 一文弄懂神经网络中的反向传播法——BackPropagation

在看CNN和RNN的相关算法TF实现&#xff0c;总感觉有些细枝末节理解不到位&#xff0c;浮在表面。那么就一点点扣细节吧。 这个作者讲方向传播也是没谁了&#xff0c;666&#xff5e; 原文地址&#xff1a;https://www.cnblogs.com/charlotte77/p/5629865.html 最近在看深度学习…

FreeBSD 8.3 发布

近日&#xff0c;FreeBSD开发团队放出了8.x稳定分支的8.3版本。此次发行的版本将支持amd64、i386、pc98和 sparc64等处理器类型。FreeBSD是一种类UNIX操作系统&#xff0c;但不是真正意义上的 UNIX 操作系统&#xff0c;它是由经过 BSD、386BSD 和 4.4BSD 发展而来的 Unix 的一…

28--仅仅反转字母

文章目录1.问题描述2.代码详情1.问题描述 给定一个字符串 S&#xff0c;返回 “反转后的” 字符串&#xff0c;其中不是字母的字符都保留在原地&#xff0c;而所有字母的位置发生反转。 示例 1&#xff1a; 输入&#xff1a;“ab-cd” 输出&#xff1a;“dc-ba” 示例 2&…