10
头图

首先澄清“加密”概念

维基百科:在密码学中,加密(英语:Encryption)是将明文信息改变为难以读取的密文内容,使之不可读的过程。只有拥有解密方法的对象,经由解密过程,才能将密文还原为正常可读的内容。

百度百科:数据加密的基本过程就是对原来为明文的文件或数据按某种算法进行处理,使其成为不可读的一段代码,通常称为"密文",使其只能在输入相应的密钥之后才能显示出本来内容,通过这样的途径来达到保护数据不被非法人窃取、阅读的目的。

所以,不论从什么角度解释,加密一定是可以解密的。“不可逆加密” 是那些什么都不懂的人捏造出来的概念。他们不知道世上有 “签名算法” 这个词,于是硬要把签名算法当作加密。


作为开发人员,正确使用专业词语是一项基本功,也是表达能力的体现。错误的使用专业术语,可能会让面试官觉得你在不懂装懂,以至于错失心仪职位。

就我个人所见,有三个词最经常被错误使用,特别是初学者。那就是“转码”、“签名”和“加密”。

很多初学者把一段内容从看得懂的格式变为看不懂的格式,统统叫做“加密”,于是出现所谓“MD5加密”、“Base64加密”这类错误说法。本文将介绍“转码”、“签名”和“加密”三个概念的区别,以帮助初学者正确使用这些术语。

转码

转码是指将一段内容从一种编码转换为另一种编码,这种转换是可逆的。转码不会修改原文内容,其目的是为了满足内容传输格式的需要。

例如 Base64 编码,它可以将任何二进制内容转为 ascii 字符串,这样我们就可以在任何只允许传输字符串的协议中使用二进制内容了,传输协议的接收端收到 Base64 编码的内容,可以将其还原成二进制格式。

除此之外,常见的转码还有 URL 编码和 hex 编码等等。他们的共同点是:内容可以根据约定的算法,在不同的格式间独立转换,也就是转换过程不需要借助额外的内容。

加密

上面说的独立转换,也就是转换过程不需要借助额外的内容,是什么意思呢?

加密也同样是一种格式转换,但转换的过程中就需要额外内容,也就是加密密钥。对应的,解密的时候也会需要解密密钥

这就是转码和加密的区别。如果一个人把转码说成是加密,说明这个人在系统安全方面存在错误的理解,让其参与系统设计可能会影响系统的安全性。

签名

转码和加密都是可逆的,它们的目的都是保证内容在格式受到限制的条件下,能够完整的传输或存储。

但是签名就不一样了。签名的作用是用一份简短的内容来检查一份很长的内容是否正确。

例如通过 MD5 算法,可以将一个 1GB 大小的文件生成一个只有 32 字节长的 MD5 签名。一旦这个文件修改了任何一个字节,再次生成的 MD5 签名就会完全不一样。

到这你就能理解,为什么签名算法是不可逆的,你不可能将一个 32 字节的签名重新还原成一个 1GB 的文件。所以不管将签名当作是转码还是加密,都属于非常严重的误解。轻者你可能会只留下签名而删掉原内容,严重情况下,其他程序员会因为你不理解什么是签名而瞧不起你。


捏造的信仰
2.8k 声望272 粉丝

Java 开发人员