javascript - 源代码可用时如何正确保护密码?

标签 javascript security hash passwords password-protection

我正在构建一个具有用户登录功能的 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/

相关文章:

javascript - react 路由器 : TypeError: Cannot read property 'getCurrentLocation' of undefined

c# - OAuth 不记名 token 身份验证未通过签名验证

python - 如何使用密码保护 Google App Engine 应用程序?

ruby - 如何合并多个哈希?

javascript - 使用 jQuery 将事件附加到动态创建的选定选择

javascript - Protractor 函数助手生成相同的东西

javascript - 带有图像和长文本的 Bootstrap 下拉菜单

amazon-web-services - 负载均衡器后面的 HTTPS->HTTP 是否被认为是安全的?

javascript - 在 Javascript 中按值对哈希/数组进行排序

java - 将可迭代作为方法参数传递?