我正在开发一个远程客户端需要登录网络服务器的项目。我不是在寻找任何特定语言的例子;只是对所涉及的安全问题的一般概念。
基本问题是:
如何将用户凭据传递到网络服务器以进行验证?
我正在描绘您的典型网站登录信息。一个字段用于用户名,另一个用于密码。您键入两者并单击“登录”。接下来会发生什么?
我可以想象一些场景:
选项#1让我感到虚弱,因为凭据是通过互联网以纯文本形式发送的。
我认为选项#2并不比选项#1好多少。如果有人拦截加密的凭据,他们是否可以再次将这些凭据发送到服务器,并仍然设法登录?
感谢任何见解。
编辑“相关”侧边栏建议使用this question,其中提到客户端/服务器握手时添加了密码的盐。这是正确的方法吗?
答案 0 :(得分:4)
选项1是默认值。通常在登录期间强制执行SSL来克服明文弱点,以便在传输过程中至少加密密码。
编辑:我建议您按照该问题的接受答案。
请勿忘记为您的请求提供nonce。这有助于保护您免受重播攻击。
编辑第二个: Wayne在您散列之前仔细提到您应该salt密码。以下是一些基本提示:
答案 1 :(得分:3)
为什么不通信SSL?能够观察对话让我深入了解您的应用。加密整个通信,而不仅仅是凭据。
编辑:始终使用salt作为本地存储的哈希。 Windows强制本地散列密码,因为它们默认不加盐,因此Windows仍会失败。
答案 2 :(得分:1)
最简单的答案是获取服务器的SSL证书。在这个特定的应用程序中创建自己的加密技术真的没有理由。正如您所指出的,如果连接未加密,则无论客户端或服务器是否正在进行密码加密,您都会对中间人攻击开放。加密连接,您不必担心它。
答案 3 :(得分:0)
在客户端,您只有一个可以呈现HTML并提交表单的浏览器。谁会加密东西?
以纯文本格式发送登录名和密码(如果您有疑虑,请使用SSL)。在服务器端,您可以随意使用它(在将它们存储到数据库之前,最好使用哈希和盐密码)。
答案 4 :(得分:0)
你可能还想考虑使用散列算法的多次迭代,1000次迭代会很好地减慢事情并使彩虹表更难创建