1. 在数据库中直接存储纯文本的密码信息,这样所有能入侵数据库的黑客都可以获取到用户的密码信息,所以这样做非常不安全。
2. 在数据库中存储密码的哈希值。通常情况下,当字段经过哈希处理后,会生成一段哈希值,而哈希值一般是无法通过特定算法得到原始字段的。但是某些情况下,比如一个大型的彩虹表(有兴趣的小伙伴可以了解一下),通过在表中搜索该哈希值,很有可能在极短的时间内找到该散列值对应的真实字段内容。
盐(Salt),在密码学中,指在哈希取值之前将内容(例如:密码)的任意固定位置插入的特定字符串。在哈希处理中加入字符串的方式被称为“加盐”。其作用是让加盐后的哈希值和没有加盐的结果不相同,在不同的应用情景中,这个处理可以增加额外的安全性。
加盐的实现过程通常是在需要哈希取值的字段的特定位置增加特定的字符,打乱原始的字符串,使其生成的散列结果产生变化。比如,用户使用了一个密码:
x7faqgjw
经过SHA取值后,可以得出结果:
58ecbf2b3136ceda7fddfd986ba8bd8d59b2d73779691e839f3f176ce2c04b84
但是由于用户密码位数不足,短密码的散列结果很容易被彩虹表破解,因此,在用户的密码末尾添加特定字符串:
x7faqgjwabcdefghijklmnopqrstuvwxyz
因此,加盐后的密码位数更长了,散列的结果也发生了变化:
7b5001a5a8bcdcfa1b64d41f6339cfa7a5c0eca04cca6ff6a6c1d6aad17794cc
以上就是加盐过程的简单描述,在实际使用过程中,还需要通过特定位数插入、倒序或多种方法对原始密码进行固定的加盐处理,使得哈希值更加不容易被破解或轻易得到原始密码,比如:
x7afabqgcjw
根据以上加盐的理论,我们可以在数据库存储 salt 和 hash(password+salt)的方式来安全的存储密码
1)客户端传入 password
2)后端获取数据库中对应的 salt 信息
3)后端将 salt 和传入的 password进行哈希取值,例如结果为h1
4)后端将 h1 与数据库中对应的 hash 值 h2 做比较,如果结果相同,那么密码校验通过
好了以上是一种密码安全存储的方式,小伙伴们还知道其它的方式吗?
媛代码社区微信公众号