尽管两者拥有一定的相似性,但加密和散列有着不同的函数。
你想知道加密和散列的区别吗?你知道什么是加盐吗?你想知道吗?这些都是一些反问句,但不管怎样,我最终还是会告诉你答案的。
加密和散列有时容易相互混淆,而加盐就没有那么容易混淆了。但是看一看这三个概念,因此我们可以更多地从整体上理解加密,这是很值得的。
什么是加密?
将信息聚集在一起,使之只能用对应的密钥解密从而阅读它,这就叫做加密。加密是一个双向函数,当你对某物进行加密时,那么之后你就会想要解密它。
这就是加密和散列关键的区别。
为了加密数据,你会使用名为密码的某个东西,它也是一个算法——一系列可以按流程进行遵照的、定义得很好的步骤。算法这个词有一种令人生畏的内涵,因为高中、大学的经历已经让我们心有余悸。但正如你将看到的,算法只不过是一系列规则罢了——事实上它们可以是非常简单的。
加密有着悠久的历史。它至少可以追溯到公元前1900年,当时人们发现了一堵墓墙,墙上雕刻着一些非标准的象形文字。自那以后,历史上就有无数关于加密的例子。
古埃及人使用了一种简单的加密方法。恺撒也是如此,他的密码是历史上最重要的加密例子之一。恺撒使用了一种原始的移位密码,可以在字母表中将字母向前移动几个位置来改变周围的字母。不过,这种方法非常有用,它使得凯撒的对手所截获的所有信息实际上毫无用处。
几千年后,当其消息遭到拦截和解密之后,苏格兰女王人头落地,一群阴谋家也因此丧身,这全都是因为一个命名者密码——一种替换密码,可以互换符号来避免名为频率分析的解密技巧。
让我们来看看使用简单密码的加密。在这种情况下,我将使用一个单字母的移位密码来加密 “不要成为一个混蛋(Don’t be a jerk)”这个句子,方法是将每个字母替换成一个位置在它前面三个位置的字母。
明文: Don’t be a jerk
变为了:
密文: Grqwehdmhun
为了简单起见,我省略了标点符号,但为了避免错误和隐藏单词边界,密文通常在传输过程中并没有空格或标点符号。因此,使用相应的密钥,其他人就可以解密该消息并读取它。显然,我们在数字加密中使用的密码要复杂得多,但你大体上已经了解了这背后的概念。
历史上的加密算法
让我们先来复习一些不同类型的密码,然后我们会学习当前加密所使用的现代算法。
- 移位密码——如同我们在上面讨论的例子一样,双方在1-25之间确定一个数字,然后在字母表中将字母移动这么多位。移动位数关键。
- 替换密码——这些密码使用固定系统的算法将明文替换为密码文本。密钥是显示固定系统的文档,该系统可用于反向工程加密。
- 置换密码——该算法使用了一组规则来作为密钥,以便将文本的顺序更改为不同的排列,然后便可以对其进行加密。常见的例子是铁路围栏(Rail Fence)和线路密码(Route ciphers)。
- 多字母密码——这是一种替代密码,可以使用多个字母来进一步复杂化未经授权的密文的解密。
- 命名密码——一种替代密码,可以用符号代替普通的明文,以试图摆脱特定形式的密码分析。
密码学是研究密码系统的一门学科,旨在发现其中的弱点。密码分析最常见的一种形式叫做频率分析,它可以追溯到一位生活在公元800年左右的阿拉伯数学家Al-Kindi。它可以检查密文中是否有重复的符号或字符串,并将它们与解密消息中出现频率较高的单词交叉引用。所以,举个例子,如果你正在给拿破仑写信,你会多次提到他的名字,这是合乎逻辑的。通过将密文版本与他的名字相匹配,可以帮助你开始映射密钥并解密消息。
与传统密码相比,多字母密码和命名密码更适合经受频率分析。一直以来,人们就在使用多字母密码,直到第二次世界大战Enigna密码机被破解。
现代加密
在我们讨论现代加密密码之前,我们需要先谈谈公钥和私钥,以及数字革命是如何变革加密的。我们刚才所列举的所有例子都是我们所说的私钥密码学。加密是完全依赖于私钥的,为了进行解密,私钥必须进行物理交换。如果你对私钥有所了解,你就知道私钥是神圣不可侵犯的,因为如果你的私钥被泄露,就有可能带来灾难性的后果。因此,必须亲自携带并传递它只会让风险更大。纵观历史,实际上因密钥被盗已经丧失了诸多生命。
今天,多亏了计算机技术和因特网,我们现在已经可以实践公钥密码学了。对于公钥加密,一个公钥用于加密,另一个私钥用于解密。在SSL握手过程中可以看到这一点,通过使用公开可用的密钥来加密对称会话密钥并将其发送回服务器,然后由其私钥解密,解决了物理密钥交换的历史风险问题。嗯,你并没有真正看到这一过程,但你明白我的意思。
当下,最常见的加密形式是:
非对称加密——这是我们刚刚给出的公钥示例。一个密钥负责加密,另一个密钥负责解密。加密只有一种方式。就是这一概念构成了PKI(公钥基础设施)的基础,而PKI是加强SSL/TLS的信任模型。
对称加密——这更接近于私钥加密的一种形式。每一方都有自己的密钥,可以加密也可以解密。正如我们在上面的示例中所讨论的,在SSL握手中发生了非对称加密之后,浏览器和服务器就会使用传递的对称会话密钥来通信。
在这两者之间,非对称加密由于其单向的特性而变得更加强大。
当你购买SSL证书时,看到到处都是“2048位”,这指的是私钥的长度。当你看到提及“256位”时,这指的是在实际通信中使用的对称会话密钥的大小。这并不意味着对称加密不安全,超级计算机仍需要数千年的时间才能解密256位的加密。
人们使用对称256位加密用于通信的原因是它更快速,这意味着更好的性能。
现代加密算法
我们已经讨论了对称加密和非对称加密,我们还可以再讨论一些现代的加密算法。
AES – AES是高级加密标准的缩写,最初被称为Rijndael,它是美国国家标准与技术协会(NIST)在2001年发布的加密规范。它将明文通过一系列由密钥大小决定的“转换轮”,每个轮由几个处理步骤组成。让我们不要在这个问题上纠缠太久,只需要知道AES是一种常见的SSL/TLS算法,它取代了在1977年创建的日期加密标准(DES)。
RSA – RSA是Rivest-Shamir-Adlemen的缩写,以其创建者的名字命名。它是一种公钥加密算法(非对称),自1978年以来一直被广泛使用。它利用质数的因数分解来对明文进行译码。[有趣的事实:不幸的是,克利福德·考克斯(Clifford Cocks),一位受雇于英国情报机构GCHQ的数学家,早在5年前的1973年就发明了一种类似的系统,但直到1997年才得以解密。]
ECC – ECC代表椭圆曲线密码学,它依赖于椭圆曲线在有限域上的代数结构。虽然ECC从1985年左右就问世了,但直到2004年才开始使用。ECC相对RSA有明显的优势,在未来的SSL/TLS中可能会扮演更加突出的角色。
PGP – PGP有着非常好的隐私性,它是由Phil Zimmerman在1991年创建的。它实际上是一系列算法的集合,而不是只有一个算法,所有算法都用于散列、数据压缩以及公钥和私钥密码学。每一步都使用 了不同的算法。PGP因可用性差、缺乏普遍性和密钥的长度而广受批评。
什么时候应该使用加密?
正如我们之前讨论的,加密是一个双向函数。你加密信息的目的是稍后解密它。因此,在与某人在线通信、保护你的云数据或传输金融数据时都可以使用加密。
关键是加密是可逆的,而散列是不可逆的。
什么是散列?
使用算法将任意大小的数据映射到固定长度,这种做法就是散列。这称为散列值(有时称为散列代码或散列和)。加密是双向函数,而散列是单向函数。虽然从技术上来讲,反向散列是可能的,但所需的计算能力使其是不可行的。散列是单向的。
现在,加密是为了保护传输中的数据,而散列是为了验证文件或数据片段没有遭到篡改——它是真实可信的。
散列的工作原理是这样的,每个散列算法以固定的长度输出。例如,你可能听说过SHA-256,这意味着算法将输出一个256位的散列值,这通常是由一个64位的十六进制字符串(h/t Matthew Haslett)来表示的。
每个散列值都是唯一的。如果两个不同的文件产生了相同的唯一散列值,这就称为冲突,它使得算法基本上无用。去年,为了证明它的脆弱性,谷歌创建了一个SHA-1散列算法冲突。因此,SHA-1在2016年初被正式淘汰,取而代之的是SHA-2。但谷歌设定了一个时间点,因此它投入了两年的资金、工时和人才,与阿姆斯特丹的一个实验室合作,以便在那个时间点之前将抽象的东西变为现实。证明一个观点有很长的路要走,但谷歌做到了。
不管怎样,这里有一个散列的例子,假设你想对一个软件进行数字签名,并让它可以在你的网站上下载。要做到这一点,你就需要创建一个你正在签名的脚本或可执行文件的散列,然后在添加了数字签名之后,你也需要对其进行散列。接下来,由于整个东西都加密了,就可以进行下载了。
当客户下载软件时,他们的浏览器将会解密文件,然后检查两个惟一的散列值。然后,浏览器就将运行使用了相同算法的相同函数,并再次对文件和签名进行散列。如果浏览器生成了相同的散列值,那么它就知道签名和文件都是真实的——它们没有遭到篡改。
如果不是,浏览器就会发出警告。
请记住,没有两个文件可以创建出相同的散列值,因此任何更改——即使是最微小的更改——都会产生不同的值。
常见的散列算法
就像我们讨论加密的方式一样,让我们先来看看目前使用的一些最常见的散列算法。
MD4 – MD4是一个自憎散列算法,创建于1990年,即使是它的创建者Ronald Rivest也承认它存在安全问题。虽然128位散列算法造成了影响,但它的影响在WMD5、WRIPEMD和WHSA家族等最新的算法中才可以感受到。
MD5 – MD5是Ray Rivest开发的另一种散列算法,它也存在漏洞。它是作为MD4的继承者于1992年创建的。目前MD6算法正在使用中,但是截止2009年,Rivest已经将其从美国国家标准技术研究院(NIST)对SHA-3的考虑中移除了。
SHA – SHA代表安全散列算法,它最广为人知的可能是大多数SSL/TLS密码套件中所使用的散列算法。密码套件是一系列用于SSL/TLS连接的密码和算法的集合。SHA处理的是散列方面的问题。正如我们之前所提到的,SHA-1现在已经被弃用了,SHA-2现在是强制性的了。有时SHA-2已知有SHA-256,但也可以使用具有更长位长的变体。
RIPEMD – 密码散列算法的一个家族,长度有128位、160位、256位和320位。1996年,汉斯•多伯丁(Hans Dobbertin)和一群学者基于欧盟(EU)的Project Ripe的框架开发了该项目。其256位和320位变体实际上并没有增加任何额外的安全性,它们只是降低了碰撞的可能性。2004年,有报道称RIPEMD-128发生了冲突,这意味着RIPEMD-160是这个家族中唯一值得推荐的算法。
WHIRLPOOL – 由Victor Rijmen(我们前面讨论过的AES算法的共同创建者)和Paulo Barreto在2000年设计。从那以后,它经过了两次更正。它能够产生512位散列,通常表示为128位的十六进制数字。
Tiger – 一个相当新的算法,正开始在文件共享网络和种子网站上引起关注。在目前已知的攻击中,没有一个能够是有效攻破其24轮变体的。
什么是加盐?
加盐是一个通常与密码散列相关的概念。本质上,它是一个惟一的值,可以添加到密码的末尾,以创建不同的散列值。这为散列过程增加了一层安全性,特别是针对蛮力攻击。蛮力攻击是指计算机或僵尸网络尝试所有可能的字母和数字组合,直到找到密码。
不管怎样,当加盐时,额外的值被称为“盐”。
其想法是这样的,通过在密码的末尾加盐,然后对它进行散列,你基本上就可以复杂化密码的破解过程了。
让我们看一个简单的例子。
假设我想为其加盐的密码是这样的:
7X57CKG72JVNSSS9
你的盐就是SALT这个单词
在进行散列之前,你在数据末尾添加了SALT。因此,它看起来是这样的:
7X57CKG72JVNSSS9SALT
散列值与普通的无盐密码的散列值不同。记住,即使是被散列的数据的最小变化也会导致不同的惟一散列值。通过盐化密码,你实际上是通过添加额外的数据位并更改它来隐藏其真正的散列值。
现在,如果一个蛮力攻击者知道你的盐,这在本质上是没有价值的。他们可以把它添加到其试图尝试的每一个密码变体的末尾,并最终找到它。
我们可以写一整篇关于密码安全的文章,以及它是否仍然是一种有用的保护措施——未来的某个时候我们会这样做——但现在这应该是一个还说得过去的加盐的定义。
总结
我们今天讨论了以下内容:
- 加密是一种双向函数,信息以某种方式被打乱,以便之后能够恢复回原状。
- 散列是一种单向函数,其中数据会被映射到固定长度的值。散列主要用于身份验证。
- 加盐是散列期间的一个附加步骤,通常与散列密码相关联,它能够在密码的末尾添加一个附加值,从而更改生成的散列值。