算法初接触 | 安全算法[哈希函数、共享秘钥加密]

300 阅读5分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第19天

哈希函数

哈希函数可以把给定的数据转换成固定长度的无规律数值。转换后的无规律数值可以作为数据摘要应用于各种各样的场景

图解

01

1.jpg
可以把哈希函数想象成搅拌机

02

2.jpg
输入数据

03

3.jpg
输出固定长度的无规律数值。把哈希函数想像成搅拌数据的搅拌机就很容易理解了。输出的无规律数值就是“哈希值”。哈希值虽然是数字,但多用十六进制来表示

04

4.jpg
计算机会用由0和1这两个数字表示的二进制来管理所有的数据。虽然哈希值是用十六进制表示的,但它也是数据,在计算机内部同样要用二进制来进行管理。也就是说,哈希函数实际上是在计算机内部进行着某种运算的

05

5.jpg
以此为前提,我们再来看看哈希函数的特征。第一个特征是输出的哈希值数据长度不变

06

6.jpg
即使输入了相当大的数据,输出的哈希值的长度也保持不变

07

7.jpg
同样地,不管输入的数据多小,哈希值的长度仍然相同

08

8.jpg
第二个特征是如果输入的数据相同,那么输出的哈希值也必定相同

09

9.jpg
第三个特征是即使输入的数据相似,但哪怕它们只有一比特的差别,那么输出的哈希值也会有很大的差异。输入相似的数据并不会导致输出的哈希值也相似

10

10.jpg
第四个特征是即使输入的两个数据完全不同,输出的哈希值也有可能是相同的,虽然出现这种情况的概率比较低。这种情况叫作“哈希冲突”

11

11.jpg
第五个特征是不可能从哈希值反向推算出原本的数据。输入和输出不可逆这一点和加密有很大不同

12

160ded85928736d72f4b0297c07b716.jpg
最后一个特征是求哈希值的计算相对容易

解说
哈希函数的算法中具有代表性的是MD5、SHA-1和SHA-2等。其中SHA-2是现在应用较为广泛的一个,而MDS和SHA-1存在安全隐患,不推荐使用。
不同算法的计算方式也会有所不同,比如SHA-1需要经过数百次的加法和移位运算才能生成哈希值。
虽然本节中讲过如果输入的数据相同,那么输出的哈希值也必定相同,但这是在使用同一个算法的前提下得出的结论。若使用的算法不同,那么就算输入的数据相同,得到的哈希值也是不同的。

应用示例
将用户输入的密码保存到服务器时也需要用到哈希函数。
如果把密码直接保存到服务器,可能会被第三者窃听,因此需要算出密码的哈希值,并只存储哈希值。当用户输入密码时,先算出该输入密码的哈希值,再把它和服务器中的哈希值进行比对。这样一来,就算保存的哈希值暴露了,鉴于上文中提到的哈希函数的第五个特征(输入输出不可逆),第三者也无法得知原本的密码。
就像这样,使用哈希函数可以更安全地实现基于密码的用户认证。

共享秘钥加密

加密数据的方法可以分为两种:加密和解密都使用相同密钥的“共享密钥加密”和分别使用不同密钥的“公开密钥加密”。以下内容将讲解共享密钥加密的机制及其相关问题

图解

01

1.jpg
共享密钥加密是加密和解密都使用相同密钥的一种加密方式。由于使用的密钥相同,所以这种算法也被称为“对称加密”

02

2.jpg
先从整体上来了解一下共享密钥加密的处理流程。假设A准备通过互联网向B发送数据

03

3.jpg
由于有被窃听的风险,所以需要把想要保密的数据加密后再发送

04

4.jpg
A使用秘钥加密数据

05

5.jpg
A将密文发送给B

06

6.jpg
B收到密文后,使用相同的密钥对其进行解密。这样,B就取得了原本的数据。只要是加密好的数据,就算被第三者恶意窃听也无须担心

07

7.jpg
接下来想一想共享密钥加密中的问题。让我们回到B收到A发送的密文的时候

08

8.jpg
密文可能已经被X窃听了

09

9.jpg
这里假设A和B无法直接沟通,B不知道加密时使用的是什么密钥

10

10.jpg
A需要通过某种手段将密钥交给B。和密文一样,A又在互联网上向B发送了密钥

11

11.jpg
B使用收到的秘钥对密文进行解密

12

118335a5c4bf5ed7415583522fe6586.jpg
但是,该密钥也有可能会被窃听。这样一来,X也可以使用密钥对密文进行解密了

解说
既然密钥有被第三者窃听的风险,那是不是也可以先加密密钥再发送呢?使用这种方式,又会产生如何把加密密钥的密钥发送给对方的问题,还是回到了一开始的问题。
因此需要找到可以把密钥安全送出的方法,这就是“密钥分配问题”。
要想解决这个问题,可以使用“密钥交换协议”和“公开密钥加密”两种方法。