给哈希加点盐

又一篇学习笔记,这篇比较水,相当于是把原文给简化了一下,如果想要深入了解的话推荐还是看看原文加盐hash保存密码的正确方式.

基于 Kerckhoffs’s principle,我们需要一种没有人能“看懂”但是又可以被验证的密码系统,听起来非常矛盾,但是哈希算法恰好满足了这个要求,于是通过加盐 hash 保存密码的方式应该是市面上比较稳妥的做法了。
在说明加盐是什么之前,先来看看它所使用到的 Hash 的作用和一些常见的密码破解手段,相信看完之后,”为什么要加盐”这个问题也就自然而然的解决了。

Hash

Hash 算法是一种单向的函数,它可以把任意数量的数据转换成固定长度的 指纹,这个过程是不可逆的,而且只要输入的数据中有一丝改变,结果的 hash 值也会有很大的不同。
这里的 Hash 算法跟数据结构上的 hash 函数不完全相同,根据不同的使用场景,需要使用具有不同特性的 hash 函数。实现 hash 表的函数具有快速的特点,而加密 hash 函数是用来进行密码加密的,所以必须要确保安全性,比如 SHA256、SHA512、RipeMD、WHIRLPOOL。

一些常见的破解手段

字典&暴力破解

基本上一切密码都可以用这种途径来破解,只是时间长短的问题了。

  • 字典破解:根据所有能找到的常用密码,生成一个密码字典,然后遍历字典中的值,一个个去尝试
  • 暴力破解:对于给定长度的密码,尝试每一种可能的字符组合。

既然没有办法阻止这种破解方式,那么只能让这种方式变得低效,从而达到花费时间不可接受的地步,让破解者主动放弃。

查表破解

其实就是密码破解的进阶版。将密码字典中的每一个密码的 hash 值预先计算出来,放到另一张表里,这样做可以加快配对的速度。缺点是建立这个 hash 表需要耗费比较长的时间。

反向查表破解

这一招是针对同时破解大量用户的时候用的。
一般的密码破解的本质是:对同一个用户名,用不同的密码去试,看看哪个是正确的。
而反向查表的本质是:用一个密码去试所有用户,看看谁在用这个密码,一直换密码直到表里面所有的密码都试过了。

这里用的表还是查表破解里经过了 hash 加密的密码表。

彩虹表

一种用时间换取了空间的表,牺牲了一些破解时间,以求表内包含的密码更全面。目前已经可以破解8位长度的任意 MD5 hash 。

加盐

各种查表的方法之所以有效,是因为 hash 函数的特性导致的,只要用户的密码相同,得到的 hash 值也一定相同。但是如果给每个人的密码加上一个随机的字符串再进行加密,那么即使两个用户使用了同一个密码,他们的密码存在数据库中的 hash 值也是不同的。
这个随机的字符串就是盐(salt)。

盐本身不需要保密,因为它的作用只是为了让各种表没那么容易生成。如果每次都要针对特定用户生成一个特定的表,那这个加盐的效果就达到了。

参考资料