Node.js 和密码安全 : three questions

标签 node.js express security bcrypt password-encryption

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

我将 Node.js 与快速框架和通行证一起用于身份验证和 session 。

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

问题:

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

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

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

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

最佳答案

安全方面的最佳实践有很多,但其理念基本相同:抱最好的希望,做最坏的打算。这解释了你的三个问题:

  1. 假设有人获得了对您数据库的访问权限,您不希望密码被泄露的可能性。散列密码保证您无法从散列中获取密码。
  2. 这是为了避免中间人攻击。当服务器向您的服务器发送请求或从您的服务器发送请求时,服务器可以很容易地监听和记录密码。即使您认为中间人攻击不可能发生,也要抱最好的希望,做好最坏的打算。
  3. 使用易于内存但他人难以猜到的长密码。更好的是,如果您可以将尝试次数限制为每 5 分钟 3 次,因为这将需要更多的时间来破解。

这三者中的每一个都基于这样的想法,要么有人 破解了您的系统并进行损害控制,要么由于花费的时间太长而几乎不可能破解。性能很重要,但始终安全性不重要。主要使用常识,不要基于假设损害安全性,因为这是在您的安全性中插入错误的最可靠方法。简而言之,抱最好的希望,做最坏的打算。

关于Node.js 和密码安全 : three questions,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12404038/

相关文章:

node.js - Mongoose 错误不支持的投影选项 : sort: { createdAt: -1 }

security - 使用 Rfc2898DeriveBytes 从明文密码创建安全密码时盐的重要性

security - 安全存储 Firefox 插件?

javascript - Node.js/Express - 如何设置响应字符编码?

javascript - 在 D3 中添加 Node 链接

node.js - 在 Netbeans 上调试 Node.js

node.js - Jade 模板传承

javascript - 发出 HTTP 请求并将结果解析为 JSON

javascript - Express js - 数据库连接中的 Promise 待定

Java 7u45 安全警告 : Allow access to the following application from this web site?