网站登录:如何将用户凭据发送到服务器进行验证?

时间:2009-05-19 20:46:36

标签: security encryption login passwords

我正在开发一个远程客户端需要登录网络服务器的项目。我不是在寻找任何特定语言的例子;只是对所涉及的安全问题的一般概念。

基本问题是:
如何将用户凭据传递到网络服务器以进行验证?

我正在描绘您的典型网站登录信息。一个字段用于用户名,另一个用于密码。您键入两者并单击“登录”。接下来会发生什么?

我可以想象一些场景:

  1. 凭据以纯文本形式发送到服务器。服务器端脚本创建密码的哈希值,并将其与用户存储的哈希值进行比较。
  2. 凭据在本地加密,结果将发送到服务器。服务器解密凭证并继续,如#1
  3. 我还没有想到的东西?我是新手。放轻松我!
  4. 选项#1让我感到虚弱,因为凭据是通过互联网以纯文本形式发送的。

    我认为选项#2并不比选项#1好多少。如果有人拦截加密的凭据,他们是否可以再次将这些凭据发送到服务器,并仍然设法登录?

    感谢任何见解。

    编辑“相关”侧边栏建议使用this question,其中提到客户端/服务器握手时添加了密码的盐。这是正确的方法吗?

5 个答案:

答案 0 :(得分:4)

选项1是默认值。通常在登录期间强制执行SSL来克服明文弱点,以便在传输过程中至少加密密码。

编辑:我建议您按照该问题的接受答案。

请勿忘记为您的请求提供nonce。这有助于保护您免受重播攻击。

编辑第二个: Wayne在您散列之前仔细提到您应该salt密码。以下是一些基本提示:

  1. 如果您的salt是前缀,后缀或中缀
  2. ,则无关紧要
  3. 你的盐应该是大的,随机的,复杂的。
  4. 根据盐的价值,你的盐应该是独一无二的。盐本身不需要加密。

答案 1 :(得分:3)

为什么不通信SSL?能够观察对话让我深入了解您的应用。加密整个通信,而不仅仅是凭据。

编辑:始终使用salt作为本地存储的哈希。 Windows强制本地散列密码,因为它们默认不加盐,因此Windows仍会失败。

答案 2 :(得分:1)

最简单的答案是获取服务器的SSL证书。在这个特定的应用程序中创建自己的加密技术真的没有理由。正如您所指出的,如果连接未加密,则无论客户端或服务器是否正在进行密码加密,您都会对中间人攻击开放。加密连接,您不必担心它。

答案 3 :(得分:0)

在客户端,您只有一个可以呈现HTML并提交表单的浏览器。谁会加密东西?

以纯文本格式发送登录名和密码(如果您有疑虑,请使用SSL)。在服务器端,您可以随意使用它(在将它们存储到数据库之前,最好使用哈希和盐密码)。

答案 4 :(得分:0)

你可能还想考虑使用散列算法的多次迭代,1000次迭代会很好地减慢事情并使彩虹表更难创建