后端如何安全地存储用户密码?加盐!
几乎所有的系统都需要用户进行注册和登录操作,其中最常见的登录方式就是让用户输入用户名和密码。早期的许多系统就仅需要用户名和密码即可登录,但是有一些网站就遭遇了暴力破解、社工破解 和拖库 的攻击。那么后端有哪些方案可以用来保存客户的密码呢?

明文密码
明文的密码是一定不可以存储在数据库中的。
这种存储方法可能只有非常早期的互联网时期才使用过。只要系统需要通过安全测评就不可能使用该方法进行存储。一旦发生拖库等安全事故,后果不堪设想。
哈希值加密
尽可能不要储存密码的哈希值。
这是很多学生在写编程作业的时候常用的方法,使用一些简单的哈希加密算法对密码进行加密之后保存其哈希值,例如:MD5、SHA-1 等。
这种方法的问题在于,虽然 MD5 算法是不可逆的,但是破解起来相对容易。使用碰撞攻击或者彩虹表攻击都有可能破解 MD5。网上甚至有许多在线工具提供 MD5 的解密服务。
加盐
加盐(Salt)是指在对密码做哈希之前向密码中添加一个随机生成的字符串。这个盐值是唯一的,甚至相同的密码每次生成的盐值都是不同的。这可以保证每次系统保存的哈希值也是不同的。

我们在进行密码验证的时候,在数据库中取出当前用户的 Salt,将其与当前用户输入的密码拼接后计算哈希值。最后与数据库中存储的哈希值进行比对,如果一致则说明密码正确。
总结
- 明文密码不要保存。
- 密码的简单哈希值不推荐使用。
- 密码加盐哈希是当前比较通用的方法。每一次保存都需要生成新的随机盐值。
当前许多系统已经抛弃账户密码的登录方式,而采取短信验证或者第三方服务登录,比如:微信登录、支付宝登录等。而 GitHub 则使用的是多因素认证(MFA)登录方式。
这些登录方式要求用户必须持有注册时保留的手机或者绑定的其他公信力平台账户才能登录,一定程度上提高了安全性。因为想要通过这些方式登录通常意味着除了账号之外,还需要获取到用户的手机。
贡献者
更新日志
2025/3/26 01:42
查看所有更新日志
4ca41
-feat(docs): add new articles and cover于