本篇文章是,通过 HenCoder Plus 的第二节课 <编码、加密、Hash> 总结加工而来,旨在对课程内容的记忆与理解。

编码

编码是信息从一种形式或格式转换为另一种形式的过程。解码,是编码的逆过程。通过编码的定义我们知道两件事情:第一,是信息形式的转换。就像是把模拟信号转为数字信号,过去的旗语一样,都是把原始信号转换成另一种表达形式,无论是有损的还是无损的。第二,是这个过程应该是唯一可逆的,不然编码就没有意义。

Base64 编码

Base64 就是一种常见的无损编码,旨在将二进制数据转换为由64个字符组成的字符串。这样就可以将二进制数据以 ASCII 码表中的字符显示出来。 其本质是一种增量编码,就是编码后数据会比原始数据要大。其原理是将原始数据每6位做一次转换,其字符转换对应关系参看 wiki,对于 ASCII 码表中的字符转换,由原理的每8位表示一个字符转换为每6位表示一个字符,因此大致每进行一次 Base64 转化后数据长度都会增大原来的 1/3,会影响传输性能。

64个字符是 0-9 a-z A-Z +/ 这些。8的整倍数不一定能被6整除,因此对于不能整除的部分后面进行补0,直到补到24位,可以进行整除在停止,对于最后全是0的数位不进行转换为 A (Base64 中 A 对于 000000),而是将其转换成 = 或者 ==。

Base64 主要的用途是在HTTP环境下传递较长的标识信息进行转换。或者在 Url 中传递二进制信息(POST 方法中使用普通表单可以上传二进制文件)等。注意,标准的 Base64 不能直接用在 URL 中,因为URL编码器会把标准Base64中的/和+字符变为形如%XX的形式。可采用一种用于URL的改进Base64编码,它不在末尾填充=号,并将标准Base64中的+和/分别改成了-和_ 。

结论:使用 Base64 编码不会使得数据更安全,同时还会降低传输性能。因此在非必要的情况下,不要使用 Base64 来对图片进行处理。

加密

加密的名词解释就不说了,这里就说说两类加密方式:对称加密和非对称加密。

对称加密

通信双方使用同一个密钥,使用加密算法配合密钥来进行加密;解密时使用加密的完全逆过程配合密钥来进行解密。

加解密的过程中,相同的是密钥,不同的是解密过程(正好相反)。这种加密方式的痛点在于密钥传输的安全性无法保证。如果密钥泄漏密文就会被破解。 对称加密的经典算法有 DES 和 AES(高级加密标准:Advanced Encryption Standard)不过现在前者已经被弃用了,因为其本身是使用56位密钥,相比较而言比较容易遭受暴力破解,AES 的密钥长度有 128 192 和 256 位,现在某些情况下依然在使用。 对称加密主要用于加密通信,如果拿到一组原文密文对,就可能使用字典来进行破解。

非对称加密

不同于对称加密,加密与解密使用的是同一个密钥。非对称加密,加解密使用的是一对儿密钥。加密密钥称为公钥,解密密钥称为私钥。而且加解密的算法是完全一样的,不存在逆过程。 非对称加密的数学原理在于溢出。例如

原文是 110 ,加密密钥为 4 ,对原文的每一位做加操作,得到密文是 554 ;
解密密钥是 6,对密文的每一位做加操作,溢出的数位直接抛弃得到 110,可以解出原文。

注意密钥的提供者,谁要解密信息,谁就是密钥提供者。

非对称加密原理

上例中,接收方就是密钥的提供者,他提供公钥给别人,别人使用公钥来对信息进行加密,他使用自己私钥(不能泄漏)来进行解密。 注意公钥可以解私钥,私钥可以解公钥。当使用私钥加密,公钥解密时,我们称为这一过程为签名,因为只有“我”有私钥,因此我使用私钥签名后的数据一定只有“我”造的出来,所以他具有唯一性,别人可以通过使用公钥来验证签名。

签名原理

使用非对称加密通信,通常是双方将自己的公钥传给对方。然后使用自己的私钥对数据进行签名来证明:这个数据是“我”发的,然后再使用对方的公钥对数据进行加密来向对方说明:这个东西是我想告诉你的,这两者结合后就能证明:我就是"我",同时这也是我想对你说的话。

常用的经典算法有 RSA 和 DSA,后者主要用在签名当中速度比较块是优势。主要优势是,公钥可以随便传,无论环境安全与否,缺点是性能较差。

翻破解思路同对称加密,破解难度都是使用穷举法来破解,因此二者在破解难度上没啥区别。

密钥和密码的区别在于,密钥是个辅助手段用来帮助加解密数据,密码是用来验证身份的,非用来加解密的。

压缩与序列化

压缩是一种编码,解压缩是一种解码。序列化不是一种编码,只是将内存中的数据对象转换成字节序列的过程。对象在内存的存放是散乱的(放在不同的内存区域,并使用引用来进行连接)。通过序列化可以将内存中的对象转换成一个字节序列,从而进行本地传输或者网络传输。由于序列化只是将内存里的对象(非某种具体格式)进行转换,因此算不上编码。

Hash

MD5 SHA1 SHA256 都是哈希,都是将从数据中进行摘要,获取指纹。注意哈希过程是不可逆的(能从一个人获取他的指纹,但是你不能通过一个人的指纹来反推出这个人),因此哈希既不属于编码,也不属于加密

Hash的实际用途:验证唯一性(指纹),验证数据完整性,快速查找(HashMap),隐私保护(Hash 代替原始数据保存)。一个好的哈希需要具有一个特点:低碰撞性,即数据的 Hash 应尽量保持唯一。 Java 中在重写 equals() 时,也要求会重写 hashCode() 。这部分写到 Java差缺补漏

results matching ""

    No results matching ""