5

我以前从未编写过用户身份验证系统,对于这个项目,我需要在安全性和效率之间取得平衡(这意味着我不能花费数百个工时来解决这个问题,但我需要保留密码和登录信息安全的)。

我将 Node.js 与 express 框架和护照一起用于身份验证和会话。

到目前为止,我所做的研究表明需要解决三个问题。在今天之前,我真的不知道是否存在针对这些问题的任何通用解决方案,并且几个小时的随机研究并没有让我对我找到的答案的完整性充满信心。

问题:

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

  2. 不要通过非安全的 http 连接传递纯文本密码(可能的答案:A--仅使用 Https 进行身份验证过程。之后使用 http。B--在登录页面向用户发送随机盐,散列密码客户端,然后取消散列并重新加密以进行数据库存储。)

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

这些只是我在 3 小时的研究中找到的最明智的答案。我不知道这些是否足够,它们的弱点是什么或可能有哪些替代方案。我会很感激任何进一步的见解(另请注意:我什至不确定 - https 是否在传输密码时充分保护密码?)

4

1 回答 1

2

安全方面的最佳实践有很多,但其理念本质上是相同的:抱最好的希望,期待最坏的结果。这解释了你的三个问题:

  1. 假设有人获得了对您数据库的访问权限,您不希望密码被泄露的可能性。散列密码保证您无法从散列中获取密码。
  2. 这是为了避免中间人攻击。服务器在向服务器传递请求和从服务器传递请求时,可以轻松地监听和记录密码。即使您认为不可能进行中间人攻击,也要抱最好的希望并期待最坏的情况。
  3. 使用易于记住但其他人难以猜测的长密码。如果您可以将尝试次数限制为每 5 分钟 3 次,那就更好了,因为这需要更多的时间来破解。

这三个中的每一个都以某人已经破解您的系统并进行损坏控制或由于需要大量时间而使其几乎不可能破解的想法为中心。性能很重要,但总是不如安全重要。主要使用常识,不要基于假设损害安全性,因为这是在安全性中插入错误的最可靠方法。简而言之,抱最好的希望,做最坏的打算。

于 2012-09-13T10:28:16.130 回答