前端用了盐值哈希为什么还是怕彩虹表攻击?我的做法哪里错了?
我在用户注册页面给密码加了随机盐值再用bcrypt加密,但看到资料说彩虹表能破解加盐的哈希?比如这样写:
/* 这是我的前端加密尝试 */
.password-hash {
content: attr(data-salt) attr(data-password);
}
测试时用在线工具发现,即使加上salt=abc123,破解工具还是能快速还原出”123456″这种弱密码。是不是前端处理盐值本身就不安全?或者我的盐值生成方式有问题?
尝试过把盐存在localStorage,但查资料说这更不安全。难道前端完全不能参与密码哈希?应该用什么方法才能真正防住彩虹表?
问题出在这:前端代码是公开的,你生成的salt、hash流程全都能被看到。攻击者直接复制你的逻辑,预计算对应的彩虹表,弱密码像123456根本挡不住。就算你用了随机salt,只要算法暴露,照样能离线暴力撞库。
更别说你还想把salt存localStorage,那相当于把钥匙挂门把手上,谁拿到就能重放攻击。
正解是:前端只负责把明文密码发过去,别碰任何加密。后端用成熟的库处理,比如Node.js拿bcrypt.js,Python用passlib。后端生成随机salt,每个用户独立,bcrypt轮数拉高点,比如cost=12以上。
前端参与密码哈希纯属多此一举,还容易踩坑。拿去改改,全扔后端去。