前端密码安全存储方案:加盐哈希和bcrypt的实战应用
🧑🏫 作者:全栈老李
📅 更新时间:2025 年 5 月
🧑💻 适合人群:前端初学者、进阶开发者
🚀 版权:本文由全栈老李原创,转载请注明出处。
大家好,我是全栈老李。今天咱们聊一个前端开发中容易被忽视但极其重要的知识点——密码安全存储。
你有没有想过,为什么很多网站被拖库(数据库泄露)后,用户的密码依然安全?而有些网站一旦被攻破,用户密码就裸奔了?这背后的关键就是密码存储方案。直接明文存密码是找死,简单MD5也是自欺欺人,今天老李就带大家搞懂真正靠谱的方案:加盐哈希和bcrypt。
一、为什么不能明文存密码?
假设你的数据库里存的是这样的:
用户名: 张三, 密码: zhangsan123
用户名: 李四, 密码: lisi456
黑客一旦拿到这个库,直接就能登录所有账号,甚至还能去其他网站撞库(很多人不同网站用同一套密码)。所以,绝对不能明文存储密码!
二、哈希函数:从MD5到加盐
最早大家用MD5或SHA1哈希密码,比如:
// 不安全的做法!(全栈老李提醒:千万别这么干)
const hashedPassword = md5('mypassword'); // 输出固定值:34819d7beeabb9260a5c854bc85b3e44
问题来了:
- 彩虹表攻击:黑客可以预先计算常见密码的MD5值,直接反查。
- 相同密码哈希值相同:如果两个用户都用
123456
,哈希值一样,泄露一个等于泄露一片。
于是,聪明的人类发明了加盐(Salt)——给每个密码随机撒一把盐:
// 伪代码示例(全栈老李注释:盐值要随机且唯一)
const salt = generateRandomString(16); // 例如:'a1b2c3d4e5f6g7h8'
const hashedPassword = md5(salt + 'mypassword');
这样即使密码相同,哈希值也不同。但MD5速度太快,黑客能用GPU暴力破解,所以我们需要故意很慢的算法——这就是bcrypt
的用武之地。
三、bcrypt:专为密码而生的哈希函数
bcrypt
有三大绝活:
- 内置盐值&#x