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

时间:2012-09-13 10:17:01

标签: node.js express security bcrypt password-encryption

我从未在此项目之前编写用户身份验证系统我需要在安全性和效率之间取得平衡(这意味着我无法花费数百个工时来处理安全性问题,但是我需要保持密码和登录信息安全。)

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

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

问题:

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

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

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

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

1 个答案:

答案 0 :(得分:2)

安全性的最佳实践很多,但这个想法基本相同:希望最好,期望最坏。这解释了你的三个问题:

  1. 假设某人获得了对您数据库的访问权限,您不希望密码被泄露。散列密码可确保您无法从散列中获取密码。
  2. 这是为了避免中间人的攻击。服务器在向服务器传递请求时可以轻松地监听和记录密码。即使你不认为中间人的攻击是可能的,也希望最好,并期待最坏的情况。
  3. 使用易于记忆的长密码,但其他人难以猜测。更好的是,如果你可以将每5分钟的尝试次数限制为3次,那么这将需要更多的时间来破解。
  4. 这三个中的每一个都认为某人已经破解了你的系统并进行了损害控制,或者由于它需要花费的时间使其几乎无法破解。性能很重要但总是 比安全更重要。仅仅使用常识并且不会基于假设来破坏安全性,因为这是在您的安全性中插入错误的最可靠方法。总之,希望是最好的,期待最坏的。