我以前从未编写过用户身份验证系统,对于这个项目,我需要在安全性和效率之间取得平衡(这意味着我不能花费数百个工时来解决这个安全问题,但我需要保留密码和登录信息安全)。
我将 Node.js 与快速框架和通行证一起用于身份验证和 session 。
到目前为止,我所做的研究显示了三个需要解决的问题。在今天之前,我完全不知道这些问题是否存在任何共同的解决方案,几个小时的随机研究并没有让我对我找到的答案的完整性充满信心。
问题:
不要在数据库中存储未加密的纯文本密码 (可能的答案:在服务器上对密码进行加盐/哈希处理,并将哈希存储在数据库中。)
不要通过不安全的 http 连接传递纯文本密码 (可能的答案:A--仅将 Https 用于身份验证过程。之后使用 http。B--在登录页面向用户发送随机盐,在客户端散列密码,然后取消散列并重新加密数据库存储。)
不要使用 GPU 可以每秒破解 700,000,000 个密码的弱加密方法。 (可能的答案:bcrypt)
这些只是我在 3 小时的研究中找到的最明智的可能答案。我不知道这些是否足够,它们的弱点是什么,或者有哪些替代方案可用。如果有任何进一步的见解,我将不胜感激(另请注意:我什至不确定 - https 是否在传输时充分保护密码?)
最佳答案
安全方面的最佳实践有很多,但其理念基本相同:抱最好的希望,做最坏的打算。这解释了你的三个问题:
- 假设有人获得了对您数据库的访问权限,您不希望密码被泄露的可能性。散列密码保证您无法从散列中获取密码。
- 这是为了避免中间人攻击。当服务器向您的服务器发送请求或从您的服务器发送请求时,服务器可以很容易地监听和记录密码。即使您认为中间人攻击不可能发生,也要抱最好的希望,做好最坏的打算。
- 使用易于内存但他人难以猜到的长密码。更好的是,如果您可以将尝试次数限制为每 5 分钟 3 次,因为这将需要更多的时间来破解。
这三者中的每一个都基于这样的想法,要么有人 破解了您的系统并进行损害控制,要么由于花费的时间太长而几乎不可能破解。性能很重要,但始终安全性不重要。主要使用常识,不要基于假设损害安全性,因为这是在您的安全性中插入错误的最可靠方法。简而言之,抱最好的希望,做最坏的打算。
关于Node.js 和密码安全 : three questions,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12404038/