我正在构建一个具有用户登录功能的 Web 应用程序,我希望它尽可能安全。创建新用户时,我使用此 javascript 函数对用户信息进行哈希处理,并最终将输出存储在 mySQL 数据库中:
function hash(user) {
var part1 = mix(user.username, user.password);
var part2 = mix(user.random_value + salt, user.password);
return mix(part1, part2);
function mix(part1, part2) {
var hash = sha3_256(part1 + part2);
var rehash = 10000;
while(rehash--) {
hash = sha3_256(hash + salt + rehash);
}
return hash;
}
}
数据库包含用户名、随机值和散列函数的输出,而 salt 变量是一个随机字符串,在函数外部声明并且永远不会改变。
据我通过阅读以前的一些关于密码安全的帖子所收集的信息,这是一种相当安全的做事方式(尽管我会很感激任何建议),但这是我的担忧:
如果我假设某人可以访问数据库并获取为特定用户存储的所有信息,并且假设他可以准确地看到哈希函数的运行方式(因为此代码在浏览器和 GitHub 上可见)。难道这个恶意的人不能通过我的函数运行 8 个字符(最小密码长度)的所有可能组合,看看什么密码值创建正确的哈希值?
这肯定会花费一些时间,但并非不可能最终遍历所有可能性并因此获得对帐户的访问权。
有什么方法可以防止这种攻击?
谢谢!
最佳答案
旁注:我假设您正在执行此服务器端(nodejs?)。您的实现是非标准的,并且您的术语混杂在一起(正常术语将“salt”作为每次更改的值,而“pepper”是固定的服务器端字符串),但它确实具有主要概念。不过,我建议您使用标准的“密码哈希”算法,例如 scrypt 或 bcrypt。
关于您的问题“这个恶意的人难道不能通过我的函数运行 8 个字符(最小密码长度)的所有可能组合,然后查看什么密码值创建正确的哈希值?” ,答案是肯定的,但他要花很长时间才能做到这一点。这就是您的 rehash
变量的全部目的:减慢用户的速度。请参阅:Our password hashing has no clothes了解更多详情。
关于javascript - 源代码可用时如何正确保护密码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37018683/