网络传输与加密

谈到网络,就必然会涉及网络安全。但“安全”这个事情, 一下子就会让人联想到黑客,进而把“安全”这个事情无限放大为各种高大上、神秘莫测、不可知。这不是一个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的强大和实用了。

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

近期回顾

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

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

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

原文地址:https://www.cnblogs.com/kid551/p/9409861.html

时间: 2024-08-29 03:41:15

网络传输与加密的相关文章

网络传输的加密与解密(不是很难理解的一个版本)

--网络传输的加密与解密--    由于互联网早期并没有考虑到数据报文安全的问题,早期的理念都是基于进行通信的.现在随着网络兴起,互联网上慢慢有很多"犯罪团体",用较低的犯罪成本通常是基于一个网络通信协议的一个小的漏洞来完成窃取.篡改.重播其他人的数据报文. 而往往计算机网络安全维护者和那些恶意攻击者玩的就是一个类似猫鼠游戏,网络安全维护者处处考虑对计算机的安全负责,而恶意攻击者处处找安全的漏洞.而对于那些恶意攻击方式大体分两种. 一种叫被动攻击,大体上来说就是窃听,攻击者获得传输信息

网络传输与加密 (2)

网络传输与加密 让我们先回顾一下上次的验证过程,如下图 有了"原信息"和它对应的"md5签名字符串",我们就可以做最基本的信息验证:通过md5签名字符串的一致性,来保障我们收到的信息没有受到更改. P.S.:由于签名signature在后续文章中会另有所指,为区分md5签名字符串,我们将md5签名字符串的叫法,更改为md5指纹字符串.意思同签名是一样的,就是A之所以是A的证据.特征,可以用签名来表示,也可以用指纹来表示.这里,我们开始将md5字符串对应的这个特征,称

Oracle网络传输的加密和完整性验证

转自 http://blog.itpub.net/24052272/viewspace-2129175/ 测试环境: 11.2.0.4 winodows  单机 应用场景: 对oracle服务器和客户端之间的网络传输数据进行加密和完整性校验. 默认是使用明文方式传输数据,举例可以通过wireshark.sniffer等网络抓包工具抓取到传输的具体信息. 对于敏感信息是很不安全的. 举例: 对于汉字可以通过很多在线转换工具将HEX编码转换成可读汉字. 对于了解业务的人来说,这些信息是很有价值的.

Android 密钥保护和 C/S 网络传输安全理论指南

注:本文将着重讲解 Android KeyStore.so 库保护 app key / secret.HTTPS 原理及其防中间人***措施. 谈到 Android 安全性话题,Android Developers 官方网站给出了许多很好的建议和讲解,涵盖了存储数据.权限.网络.处理凭据.输入验证.处理用户数据.加密等方方面面,甚至对于动态加载代码也提供了建议,具体可以看看 training 的?security tips?章节.而今天,我想特别来讲一讲在 Android 密钥保护和 C/S 网

使用加密解密技术和CA认证解决网络传输中的安全隐患

服务端:xuegod63.cn   IP:192.168.1.63 客户端:xuegod64.cn   IP:192.168.1.64   网络安全: 网络传输中的安全隐患-.   中间人攻击 全隐患:        解决方法 1.窃听-- >  加密 2.篡改 ->  哈西算法:MD5,sha1 (检查数据完整性) 3.伪装(钩鱼网站,伪装WIFI)  ->  身份认证(用户名/密码.数字证书) 4.网络中断 (内网冒冲网关,DDOS )  –>绑定静态arp地址: 加大服务器和

Android网络传输中必用的两个加密算法:MD5 和 RSA (附java完成测试代码)

MD5和RSA是网络传输中最常用的两个算法,了解这两个算法原理后就能大致知道加密是怎么一回事了.但这两种算法使用环境有差异,刚好互补. 一.MD5算法 首先MD5是不可逆的,只能加密而不能解密.比如明文是yanzi1225627,得到MD5加密后的字符串是:14F2AE15259E2C276A095E7394DA0CA9  但不能由后面一大串倒推出yanzi1225627.因此可以用来存储用户输入的密码在服务器上.现在下载文件校验文件是否中途被篡改也是用的它,原理参见:http://blog.c

APP安全--网络传输安全 AES/RSA/ECC/MD5/SHA

移动端App安全如果按CS结构来划分的话,主要涉及客户端本身数据安全,Client到Server网络传输的安全,客户端本身安全又包括代码安全和数据存储安全.所以当我们谈论App安全问题的时候一般来说在以下三类范畴当中. App代码安全,包括代码混淆,加密或者app加壳. App数据存储安全,主要指在磁盘做数据持久化的时候所做的加密. App网络传输安全,指对数据从客户端传输到Server中间过程的加密,防止网络世界当中其他节点对数据的窃听. 这一篇我们先聊下网络传输的安全. 安全相关的基础概念

大文件/数据网络传输方法总结(转载)

网络编程中不免会遇到需要传输大数据.大文件的情况,而由于socket本身缓冲区的限制,大概一次只能发送4K左右的数据,所以在传输大数据时客户端就需要进行分包,在目的地重新组包.而实际上已有一些消息/通讯中间件对此进行了封装,提供了直接发送大数据/文件的接口:除此之外,利用共享目录,ftp,ssh等系统命令来实现大文件/数据也不失为一种好的方法. 1.基础的基于socket进行传输 基础的基于socket进行传输关键在于控制,需要自己行分包和组包. ////////////////////////

App安全之网络传输安全

移动端App安全如果按CS结构来划分的话,主要涉及客户端本身数据安全,Client到Server网络传输的安全,客户端本身安全又包括代码安全和数据存储安全.所以当我们谈论App安全问题的时候一般来说在以下三类范畴当中. App代码安全,包括代码混淆,加密或者app加壳. App数据存储安全,主要指在磁盘做数据持久化的时候所做的加密. App网络传输安全,指对数据从客户端传输到Server中间过程的加密,防止网络世界当中其他节点对数据的窃听. 这一篇我们先聊下网络传输的安全. 安全相关的基础概念