我正在构建一个具有用户登录功能的Web应用程序,我希望尽可能安全。创建新用户时,我使用此javascript函数来散列用户的信息,并最终将输出存储在mySQL数据库中:
admin
数据库包含用户名,随机值和哈希函数的输出,而salt变量是在函数外声明的随机字符串,永远不会更改。
据我所知,通过阅读之前关于密码安全性的一些帖子,这是一种非常安全的做事方式(虽然我会很感激任何建议),但这是我的关注:
如果我认为有人可以访问数据库并获取为某个用户存储的所有信息,并且他可以确切地看到哈希函数的运行方式(因为此代码在浏览器和GitHub中可见)。这个恶意的人不能通过我的函数运行8个字符(最小密码长度)的所有可能组合,看看密码的哪个值创建了正确的哈希值?
这肯定需要一些时间,但最终可能会遇到所有可能性,因此无法访问该帐户。
有没有办法防止这种攻击?
谢谢!
答案 0 :(得分:4)
旁注:我假设你正在做这个服务器端(nodejs?)。你的实现是非标准的,你的术语是混淆的(正常的术语有" salt"作为每次都改变的值,而" pepper"是固定的服务器端字符串),但它确实有主要概念。我建议您使用标准密码哈希"算法,如scrypt或bcrypt。
关于你的问题" 这个恶意的人不能通过我的函数运行8个字符(最小密码长度)的所有可能组合,看看密码的哪个值创建了正确的哈希? ",答案是肯定的,但是要花很长时间才能做到这一点。这是rehash
变量的全部目的:减慢用户速度。有关详细信息,请参阅:Our password hashing has no clothes。
答案 1 :(得分:1)
您的威胁模型是“攻击者获得对数据库内容的完全读取权限”,是吗?
解决方案是:
这涉及在Web服务器上存储机密(从不在数据库服务器上)。首先用它来HMAC密码。然后将其哈希存储。
如果数据库服务器受到破坏,则无法轻易破解密码。如果攻击者可以进行SQL注入,这甚至可以工作,但不能获得Web服务器信息
注意:
答案 2 :(得分:0)
如果您使用的是足够好的散列算法,那么这并不重要。那是因为(强调我的)
加密散列函数是一种数学算法,它将任意大小的数据映射到固定大小的位串(散列函数),该位串也被设计为单向函数,即,无法转换的功能。
加密哈希被设计为开源的,并且在明文密码存储中使用它们是因为如果数据被破坏,则根密码是不可逆的。 Wiki on this
现在,如果你已经推出自己的,或者试图阻止某人知道你正在使用弱哈希算法,那么你就麻烦了。
此外,你的盐/胡椒,应该只在申请的实例中生活。您当然可以将其加载到github,但我建议您在实时应用程序中更改该配置。
要解决您关于运行每个8个字符的密码的问题,这只是一个rainbow table问题。这就是为什么使用 hunter2 是一个错误的密码。你的盐/胡椒有助于缓解这种情况,但一般来说,猜测是不可行的。 This是对时间安排的良好探索。