摘要算法的功能与用途

摘要算法的功能与用途

敲得码黛 818 2020-04-18

前言

摘要算法又称哈希算法、散列算法。它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)。

消息摘要算法的主要特征是加密过程不需要密钥,并且经过加密的数据无法被解密,目前可以被解密逆向的只有CRC32算法,只有输入相同的明文数据经过相同的消息摘要算法才能得到相同的密文。消息摘要算法不存在密钥的管理与分发问题,适合于分布式网络上使用。由于其加密计算的工作量相当巨大,所以以前的这种算法通常只用于数据量有限的情况下的加密,例如计算机的口令就是用不可逆加密算法加密的。近年来,随着计算机性能的飞速改善,加密速度不再成为限制这种加密技术发展的桎梏,因而消息摘要算法应用的领域不断增加。

摘要算法是什么(what):

  • 摘要算法:顾名思义,就是从已有数据中抽取出一部分数据片段经过一系列复杂的计算然后糅合在一起形成的密文,摘要算法对输入数据尤其敏感,输入数据发生任何变化都会导致密文的不一致。由于生成的密文只是通过一部分数据片段计算出来的,因此摘要算法是一个不可逆的过程(也就是说不可能从已生成的密文推导出其对应的数据)。

什么时候用摘要算法(When):

  • 数字签名(主要应用于数字签名领域,但是为了担心混淆,所以本文不打算讲解签名算法)
  • 存储用户密码(单独使用摘要算法的场景目前我就想到了这一个)

为什么要用摘要算法(why):

  • 存储用户密码:

    如果直接将用户的明文密码存放到数据库中,会产生极大的安全隐患:

    1、数据库管理员可以看到用户的明文密码,有泄漏风险。

    2、数据库被攻击后,黑客可以获取到所有用户的明文密码

    因此在数据库中一般存放的都是用户密码的摘要信息,当用户登录时,可以通过相同的摘要算法计算出摘要信息,然后再与数据库中的摘要信息进行比对。(同时这也是为什么我们忘记密码后不能直接找回密码而是要重置密码的原因)

    ps:这个时候黑客大兄弟发话了:“这点问题能难倒我?虽然我不能直接获取到你们的明文密码,但是我还有其他办法可以破解你们的用户密码的 ”

    原来这位黑客自己也有一个数据库,他的数据库中保存着我们所有密码的排列组合与摘要的一个对应关系。这样一来他就可以通过用户密码的摘要与自己数据库中的摘要进行匹配。匹配成功后,这串摘要对应的密码就代表着用户的密码。这也就是常说的彩虹表攻击。

    有攻击自然就有防御

    刚才的黑客大兄弟之所以还能够破解用户的密码,无非就是因为他知道了我们具体的摘要算法,然后通过相同的算法,列举出我们所有密码的组合结果并保存在了自己数据库中进行匹配 。

    ok 既然如此,那么我们可以在生成用户密码摘要时放点额外的东西进去,这样一来就可以生成完全不一样的摘要信息。同时为了避免黑客知道我们放了什么东西进去,然后采用相同的手法攻击我们,我们还可以针对每一个用户放不同的东西进去(例如用户id、身份证号、手机号等)。这样一来我们的安全性就有了很高的保证。(放进去的这个东西被称之为“盐(salt)”)

    ps:黑客大兄弟已经哭晕在厕所

怎么用摘要算法(How):

  • MD5

  • SHA1

  • SHA256

  • SHA512

总结:

  • 摘要算法计算的过程不需要密钥(但是可以加盐,也就是把密钥作为数据的一部分进行计算)

  • 摘要算法是一个输入敏感、输出长度固定的不可逆算法

  • 用相同的摘要算法对同一个数据进行两次计算,输出结果必然相同


# 摘要算法