Node.js和密码安全性:三个问题

我从来没有写过一个用户authentication系统,为了这个项目,我需要平衡安全性和效率(这意味着我不能花费数百个工时来处理安全问题,但是我需要保存密码和login信息安全)。

我正在使用Node.js与expression式框架和护照进行身份validation和会话。

我迄今所做的研究显示了三个要解决的问题。 在今天之前,我几乎不知道如果对这些问题有什么共同的解决scheme,几个小时的随机啄食这些研究并不能使我对我find的答案的完整性有信心。

问题:

  1. 不要在数据库中存储未encryption的纯文本密码(可能的答案:salt /散列在服务器上的密码并将散列存储在数据库中。)

  2. 不要将纯文本密码通过非安全的http连接(可能的答案:A – 只使用Https进行身份validation过程,之后使用http。B – 在login页面向用户发送随机盐,密码客户端,然后取消哈希和重新encryption数据库存储。)

  3. 不要使用GPU以每秒700,000,000个密码破解的弱encryption方法。 (可能的答案:bcrypt)

这些只是我在3个小时的研究中find的最明智的答案。 我不知道这些是否足够,它们的弱点是什么,或者有什么替代scheme。 我很感激任何进一步的洞察力(另外请注意:我甚至不确定 – https传输是否足够保护密码?)

安全的最佳实践有很多,但这个想法基本上是一样的:希望最好,期望最差。 这解释了你的三个问题:

  1. 假设某人获得了对数据库的访问权限,则不希望密码被泄露的可能性。 哈希密码保证你不能从哈希中获得密码。
  2. 这是为了避免中间人的攻击。 服务器可以轻松地收听和logging密码,因为它传递来自服务器的请求。 即使你不认为一个中间人的攻击是可能的,希望最好,并期望最糟糕的。
  3. 使用一个很容易记住但很难让别人猜测的长密码。 更好的是,如果你可以将尝试的次数限制为每5分钟3次,那么这将需要更多的时间来破解。

这三个方面的每一个都意味着有人破解了你的系统,并且做了破坏控制,或者由于需要很长的时间使它几乎不可能破解。 性能是重要的,但始终不如安全重要。 只是主要使用常识,不要基于假设危害安全性,因为这是在您的安全性中插入错误的最可靠方法。 总之,希望最好,期望最差。