我在试着理解一些事情。当我在服务器和客户机中实现PBKDF2时,我的理解是(对不起,可能大错特错),服务器将加密/散列的密码保存在数据库中,用户通过网络发送他或她的密码,然后服务器检查其有效性。
我好奇的是,我到底该如何防止用户在网络上提交的内容被看到,以及用户的密码被暴露?我是否仅依靠网络库或SSL来保护此信息?
我如何确保通过网络发送的密码是不容易暴露的,但仍然可以被服务器读取以检查哈希?
在密码客户端执行SHA2散列,然后将其发送到服务器,然后根据PBKDF2散列检查sha2是否明智?服务器将永远不会真正知道用户的密码,唯一可能的恢复选项是重置它。这种类型的系统可以接受吗?
这些事情通常是由专业人士做的吗?
发布于 2014-03-21 14:23:29
当我在服务器和客户端实现PBKDF2时,我的理解是服务器将加密/散列的密码保存在数据库中,用户通过网络发送他或她的密码,然后服务器检查其有效性。
这基本上是正确的。设置帐户时,用户向服务器发送user和pass。服务器存储user和PBKDF2(pass),然后丢弃pass。登录时,服务器将查找user列,并将PBKDF2(pass_as_submitted)与设置帐户时存储的值进行比较。如果它们匹配,则对用户进行身份验证。
我是仅仅依靠网络库还是SSL来保护这些信息?
在你所说的那种情况下,是的。
在密码客户端执行SHA2散列,然后将其发送到服务器,然后根据PBKDF2散列检查sha2是否明智?
不是的。这里的问题是,您只是将您保存的内容从用户的密码更改为用户密码的哈希。可以读取数据库的攻击者仍然知道这一点。
(这比知道密码稍微好一些是有原因的,尤其是在密码重用的情况下。然而,这些并不能证明这种方法是合理的。)
同样值得一提的是,SHA2(password)不会与PBKDF2(password)相匹敌。
这些事情通常是由专业人员做的?
首先,使用TLS (也称为SSL)。在客户端和服务器之间建立良好的加密连接是第一要务。对于一个网站,你应该在每个页面上使用TLS,而不仅仅是在发送密码的时候。至少必须在登录页面和接收用户名和密码信息的请求上使用它。
你的TLS连接应该正确设置:如果合适的话,它应该使用HSTS (并且它是一个网站)。它应该避免过时的算法(如果可能,只支持TLS 1.1+ )。它应该使用适当的加密模式。
除此之外,这取决于您的用例。也许实现双因素身份验证是值得的--使用TOTP或SMS代码或类似的方式。也许您应该考虑没有密码的登录,例如使用客户端TLS证书或OAuth2令牌。也许您应该使用现有的身份验证库,如Kerberos。也许您需要查看密码策略,以确保用户设置了正确的密码或口令短语。
这些问题很复杂,并且取决于您的用例。思考它们是大多数人不会迈出的重要的第一步。使用PBKDF2是一个很好的开始,但没有通用的答案。如果可能,请一位专家来做安全分析。如果没有,开源加上一些促销活动通常可以让人们看到它。最坏的情况,阅读有关安全的知识,查看OWASP Top 10,并考虑系统的每个部分。在可能的情况下,使用专家制作的现有库。如果你必须自己做,你可能做错了。
https://stackoverflow.com/questions/22549499
复制相似问题