如何安全的保存用户密码
一。什么是散列算法
为了保证密码的安全,我们经常会用到散列算法对密码进行加密。
散列算法的3个特点:
1. 同样的字符串会生成相同的散列值(散列值就是一堆乱七八糟的字符串)。
2. 不同的字符串生成的散列值很有可能不一样。只要对字符串做了一点微小改动,生成的散列值会有天翻地覆的变化。
3. 不能由散列值计算出原始的字符串。
二。如何安全的保存用户密码
1. 将用户密码的散列值保存到数据库。
通常,我们会将用户名和密码保存到数据库的用户表中,但为了防止数据库被黑或者密码被网站内部人员看到,我们不能直接将密码明文保存到数据库。
在用户注册的时候,将用户密码的散列值保存到数据库。用户登录的时候,将用户输入的密码计算出散列值,将计算出的散列值和数据库中保存的散列值做比较,相等就表示登录成功。但这样做,我们的密码就安全了吗?No! 请接着看下面。
2. 一些人可能拥有常用的简单密码和对应散列值的数据库(如下图),所以,只要有人拿到你密码的散列值就可以得到你的原始密码。为了解决这个问题,我们可以引入加盐算法。
在用户注册的时候,随机的生成一段复杂字符串作为盐(如d3!Ab_&),并把盐保存到数据库中,同时在用户注册的密码后拼接上盐再计算生成散列值,即散列值 = MD5(注册Password + Salt)。用户登陆的时候,把MD5(登录Password + Salt)生成的值和数据库已有的散列值做比较,相等就表示登录成功。这样的话,即使有人拿到了你密码的散列值,也无法推算出你的原始密码。这也是QQ只有重置密码的功能而没有发送原始密码功能的原因。