我制作了一个web应用程序,它增长缓慢,但已经有了一些用户基础,当我第一次创建身份验证和注册系统的代码时,我决定使用环境值来设置密码。今天我开始发现盐是不必要的,因为我使用的是bcrypt,而bcrypt已经有了一个盐系统。所以我想把密码
中的盐去掉我想象的方法是通过迁移到数据库来更新生产代码,为每个用户添加一个isPasswordSalted
列(默认为true),下次他们登录时,将从他们的密码中删除盐(通过比较加盐的密码与哈希,如果相同,将未加盐的清除密码哈希并更新数据库)
"problem"我并不想在表中创建一个只用于记住密码是否加盐的列。这看起来很没必要
所以我想知道以下内容是否安全:
const salted = process.env.SALT + req.body.password;
if (bcrypt.compareSync(salted, user.password) {
// Replacing user.password with unsalted password
user.password = bcrypt.hash(req.body.password, 12);
} else if (bcrypt.compareSync(req.body.password, user.password) {
// Authentification is alreayd ok since req.body.password is already correct
} else {
// Bad authentification
}
或者如果这个代码可能会产生一些问题(像这样创建2次攻击者猜测密码的机会)
从技术角度来看,这样的代码就像允许用户使用单个密码测试两个可能的哈希值,从统计角度来看这是不好的。我明白,使用额外的列来知道密码是否被加了盐似乎是多余的。不过,这样会安全得多。如果你担心该列占用额外的空间,你可以在你的web应用程序中添加一个简单的检查,定期检查是否没有更多的旧盐行,如果有,你可以删除这样的行。