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

时间:2016-05-04 04:45:41

标签: javascript security hash passwords password-protection

我正在构建一个具有用户登录功能的Web应用程序,我希望尽可能安全。创建新用户时,我使用此javascript函数来散列用户的信息,并最终将输出存储在mySQL数据库中:

admin

数据库包含用户名,随机值和哈希函数的输出,而salt变量是在函数外声明的随机字符串,永远不会更改。

据我所知,通过阅读之前关于密码安全性的一些帖子,这是一种非常安全的做事方式(虽然我会很感激任何建议),但这是我的关注:

如果我认为有人可以访问数据库并获取为某个用户存储的所有信息,并且他可以确切地看到哈希函数的运行方式(因为此代码在浏览器和GitHub中可见)。这个恶意的人不能通过我的函数运行8个字符(最小密码长度)的所有可能组合,看看密码的哪个值创建了正确的哈希值?

这肯定需要一些时间,但最终可能会遇到所有可能性,因此无法访问该帐户。

有没有办法防止这种攻击?

谢谢!

3 个答案:

答案 0 :(得分:4)

旁注:我假设你正在做这个服务器端(nodejs?)。你的实现是非标准的,你的术语是混淆的(正常的术语有" salt"作为每次都改变的值,而" pepper"是固定的服务器端字符串),但它确实有主要概念。我建议您使用标准密码哈希"算法,如scrypt或bcrypt。

关于你的问题" 这个恶意的人不能通过我的函数运行8个字符(最小密码长度)的所有可能组合,看看密码的哪个值创建了正确的哈希? ",答案是肯定的,但是要花很长时间才能做到这一点。这是rehash变量的全部目的:减慢用户速度。有关详细信息,请参阅:Our password hashing has no clothes

答案 1 :(得分:1)

您的威胁模型是“攻击者获得对数据库内容的完全读取权限”,是吗?

解决方案是:

  1. 不要让这种情况发生
  2. 将Web服务器与数据库服务器隔离,并使用Peppering
  3. 这涉及在Web服务器上存储机密(从不在数据库服务器上)。首先用它来HMAC密码。然后将其哈希存储。

    如果数据库服务器受到破坏,则无法轻易破解密码。如果攻击者可以进行SQL注入,这甚至可以工作,但不能获得Web服务器信息

    注意:

    1. 不要使用SHA {anything}进行密码散列。仅使用bcrypt,scrypt或PBKDF2
    2. 不要推出自己的安全系统。使用现有框架
    3. 即使系统是开源的,您的系统也应该是安全的。请参阅https://en.wikipedia.org/wiki/Kerckhoffs%27s_principle
    4. 在您的网络上运行HIDS以及网络上的数据库服务器和NIDS,这样您就可以(希望)检测到违规并通知您的用户,以便他们可以在其他网站上更改密码

答案 2 :(得分:0)

如果您使用的是足够好的散列算法,那么这并不重要。那是因为(强调我的

  

加密散列函数是一种数学算法,它将任意大小的数据映射到固定大小的位串(散列函数),该位串也被设计为单向函数,即,无法转换的功能。

加密哈希被设计为开源的,并且在明文密码存储中使用它们是因为如果数据被破坏,则根密码是不可逆的。 Wiki on this

现在,如果你已经推出自己的,或者试图阻止某人知道你正在使用弱哈希算法,那么你就麻烦了。

此外,你的盐/胡椒,应该只在申请的实例中生活。您当然可以将其加载到github,但我建议您在实时应用程序中更改该配置。

要解决您关于运行每个8个字符的密码的问题,这只是一个rainbow table问题。这就是为什么使用 hunter2 是一个错误的密码。你的盐/胡椒有助于缓解这种情况,但一般来说,猜测是不可行的。 This是对时间安排的良好探索。