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

Bri*_*tar 5 security bcrypt password-encryption node.js express

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

我正在使用带有快速框架和通行证的Node.js进行身份验证和会话.

到目前为止,我所做的研究显示了需要解决的三个问题.在今天之前,我几乎不知道如果这些问题存在任何常见的解决方案,并且几个小时的随机啄掉研究并不能让我对我找到的答案的完整性有信心.

问题:

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

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

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

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

Nei*_*eil 2

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

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

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