不同的明文通过MD5或SHA1后,可以生成相同的数字摘要,从而导致暴力破解的概率加大,从而造成不安全。

如何存储密码才是安全的?

密码存储有几种方式:

  • 直接存储密码明文m
  • 存储密码明文的哈希值hash(m)
  • 存储密码明文的加盐哈希 hash(m+salt),这里的salt可以是用户名,手机号等,但必须保证每个用户的salt都不一样才是安全的。

如果数据库被入侵。
第一方式,明文存储,无安全性可言。
第二种方式,虽然是入侵者得到的是hash值,但由于彩虹表的存在,也很容易批量还原出密码明文来。
只有第三种方式才是相对安全的。

彩虹表不是 密码-->明文 的简单存储

要从c=hash(m)逆向得到原始明文m,有三种办法:

  • 暴力破解法:时间成本太高。
  • 字典法:提前构建一个“明文->密文”对应关系的一个大型数据库,破解时通过密文直接反查明文。但存储一个这样的数据库,空间成本是惊人的。
  • 构建彩虹表:在字典法的基础上改进,以时间换空间。是现在破解哈希常用的办法。

PHP中提供了password_hash

彩虹表的比喻

如果将哈希后的密文比作一把锁,暴力破解的方法就是现场制作各种各样不同齿形的钥匙,再来尝 试能否开锁,这样耗时无疑很长;我以前错误理解的“彩虹表”,是事先制作好所有齿形的钥匙,全 部拿过来尝试开锁,这样虽然省去了制作钥匙的时间,但是后来发现这些钥匙实在是太多了,没法 全部带在身上。而真正的彩虹表,是将钥匙按照某种规律进行分组,每组钥匙中只需要带最有特点 的一个,当发现某个“特征钥匙”差一点就能开锁了,则当场对该钥匙进行简单的打磨,直到能开锁 为止。这种方法是既省力又省时的。