大家好,又见面了,我是你们的朋友全栈君。
当人类面对荒蛮外界时,人身安全是第一需求,人们需要相互传授安全防范的经验和技能。当人类步入信息社会之时,我们不难发现信息安全还是我们的第一需求,而且现在比过去任何时候都更需要普及信息安全的意识和知识。 ——《密码学》序,某不具名的中国科学院成都计算机应用研究所研究员/博导
在不懂计算机的人眼里,黑客们几乎都是离群索居、脾气古怪,在赛博世界中无孔不入无所不能的代名词——这当然不是真的,而且绝大多数要归功于编剧们的奇思妙想。造成这种误差有很大一部分来自人们并不了解这个赛博空间中相当重要的一环:网络安全。 人们总认为黑客的技术晦涩难懂且充满神秘,其实不然(当然,申必代码倒是有)。但是网络通信加解密有什么手段、什么意思、出自哪里呢?今天小编就带大家来了解一下网络通信中常见的两类加密方式:对称加密和非对称加密
既然今天挑了加解密作为我们讨论的重点,那自然要先讲一下Hash了~ Hash,音译叫哈希,也可以叫做散列,是一种生成信息摘要的方式。我们都知道计算机是以二进制储存数据的,而所有的二进制都是一个数字,Hash所做的就是将这样一个数字通过计算,得出一个固定长度的消息摘要,这样的消息摘要大致上具有两个特性:不可逆、低碰撞。不可逆的意思很好理解:用Hash处理过的消息摘要无法再还原至消息本身,也就相当于是一个单向的加密过程(而且几乎无法解密)。低碰撞的意思指的则是两条不同的消息要尽可能地不会得到同一个Hash(不过在这点上,有些Hash算法偏重一点点差距就会造成巨大的差异(但是相应的,两个不同文件碰撞的可能会变大),而另一些算法则侧重于两个不同文件更不可能碰撞)。 Tips:Hash并不是某种特定的算法,而是一类具有相同思想和特性的算法的统称,常见的Hash算法包括MD5、SHA-1等。
指原始的消息,理想状态下只有发送/接收方能看到明文,但这一点很难实现,所以大家多采用传输加密密文的方式来保证安全性,在数据加解密中属于不能暴露的信息。
指加密后的消息,密文最重要的一个特性就是没有秘钥就无法解密,因此网络通信中常见的加解密主要关注于密钥,在数据加解密中属于可以暴露的信息。
指的是一个控制加密/解密过程的标志型信息(数字、字符串和其他信息),根据算法的不同,密钥还有可能分为通用密钥、加密密钥和解密密钥等,,在数据加解密中属于基本不能暴露的信息。
指的是加密/解密的过程,将一段信息通过某个密钥进行演算从而得出,在数据加解密中属于最好不要暴露的信息,但好的加密算法及加密体系应当确保即便算法暴露也无法解密密文。
需要注意的是,无论是何种算法都不能抵挡无敌的穷举法,但我们更期望于尽可能地延长被破解的时间——试想,如果你的手机号需要一千年才能被超算解密,难道这种算法就是不安全的吗?恰恰相反,在实际应用中,我们注重的并非完全的难以破解——这不可能,我们注重的是提高入侵者的攻击成本,从而达到阻止破解的目的。
对称加密可称得上是最古老的加密形式:通过一套加密/解密过程和一把密钥,对密文进行的操作和对明文的进行的操作都可以被复现——就好像你家的门锁,只要有一把钥匙,无论是谁都能将它锁上、无论是谁都能将它打开。 最简单的对称加密当属古老的凯撒密码,将一串字母中的某几位替换成后几个字母(如A变成C,B变成D),解密的时候只要知道向后了几位便可以还原密文——在那个没有计算机的时代,这种密码还算符合军事加密通信的要求,可在计算机性能日新月异的当代,这种密码就不够看了。但最令人头疼的不是该种算法容易被暴力破解——在现代,对称加密技术在密钥不泄漏的情况下可以称是最安全、最高效的加密手段(例如DES、AES乃至3DES等,这里限于篇幅不再展开详细讨论算法)。唯一的问题是,在网络通信中,我们一贯假设通信是被侦听的、甚至有可能被篡改,因此如何安全地传递密钥就变成了一个鸡生蛋还是蛋生鸡的问题。为此,人们又设计出了非对称加密算法。
提及非对称加密,不得不说的就是RSA算法,这是一种典型的非对称加密算法,这类算法最大的特征就是加密密钥和解密的密钥并不是同一把密钥,所以服务器可以公开自己的加密密钥,任何人都可以使用这把钥匙加密数据(我们称公开的密钥为公钥,私有的密钥为私钥),但只有服务器自己可以解密这把公钥加密的数据——即服务器自己持有的私钥并不需要暴露就可以独立进行加密,这就保证了服务器接收到的数据是未被篡改且不会被侦听的。 非对称加密算法的唯一的问题就是他们的速度相较对称加密算法来说要慢上许多——甚至可以说是在高性能要求的场景下不可被接受的延迟。
综上所述,对称加密算法的问题在于密钥不可信,而非对称加密算法的问题在于不能支持大量数据的流动,因此聪明的你肯定马上可以想到:我们可以利用非对称算法传递一个对称密钥,然后如此通信啊! 对,完全没错,这就是端对端通信中的加密手段,客户端首先向服务器请求一个公钥——这不需要加密,因为公钥本来就是暴露的,然后由这把公钥加密自己的对称密钥/加密公钥并传输给服务器,服务器再用自己的私钥进行解密:这就是大名鼎鼎的SSL。 注:SSL在工作流程上还有一些为了防止攻击和保证数据完整性做的额外努力,但大体思路如此。
好的,一切看起来都很完美,但是有一个小问题:如果我们的数据被篡改了怎么办? 假设客户端和服务器中间有一个转发者,他截获了客户端发出的请求并将自己的公钥返回给了客户端,然后再将客户端的请求发给了服务器,客户端用攻击者的密钥加密了自己的对称密钥——但私钥却不在服务器,而是在攻击者手里,很显然这条连接将是一条裸奔的加密连接——而且双方都对此毫不知情,这该怎么办呢? 现代的安全专家们采用了一个非常巧妙的方式来解决这个问题:他们重新构建了另一套非对称密钥(为了方便和上面的连接密钥区分,我们称其为证书密钥),这套非对称密钥中的公钥是解密用的密钥,而私钥(即加密密钥)掌握在服务器自己手里。 这样,当其他人询问的时候,服务器就会将传输密钥、身份信息组合成一个字符串,然后将计算它的哈希并它加密,最后将密文和哈希同时打包发送——这证明了打包者同时知晓原文和密钥,原因如下: 1.因为只有原文才能得出哈希,而哈希本身不可逆,所以得到哈希者必然需要知道原文/哈希中的一条。 2.因为非对称密钥中加密密钥和解密密钥相对应,如果能成功解码消息则起码证明发送密文者知晓密钥和原文。 我们常说“孤证不立”,在密码学中也有类似的说法,即“单一信息无法验证自己是否可信”,读者们可以自己思考一下为什么一定要哈希和密文同时发送才能证明密文发送者是服务器(即一定持有加密用的证书私钥)。 在这种情况下,只要我们确保解密用的解密密钥可信,我们就可以确保和我们通信的一定是这个解密密钥对应的加密密钥——即一定是这台服务器。 但很显然,我们没有办法保证解密密钥的可信,最后解决这个问题的办法是我们提前在计算机里设置一些绝对可信的解密密钥,当我们遇到一个声称“自己安全”的解密密钥时,便去询问这些服务器,由他们来证明这个解密密钥安全。这些密钥、还有一些额外的信息(比如密钥哈希、身份等)一起打个包,就变成了我们熟知的数字证书。
好的,那么这就是小编给大家分享的网络通信加解密有什么手段、什么意思、出自哪里。希望大家看完这篇由小编精心整理的内容后,能对相关知识有所了解,解决你的困惑!(狗头保命)
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/136878.html原文链接:https://javaforall.cn