从客户端到服务器发送用户名和密码的正确方法

时间:2011-09-26 23:50:31

标签: http login https passwords username

这个问题不是针对特定语言的。 我很好奇如何正确地将用户名和密码从网站登录表单发送到服务器。

我的猜测是散列密码,将用户名/密码放在POST正文中,然后通过HTTPS发送。什么是更好的方式?

为了更好的衡量标准,我会提到一种不太理想的方法:

http://www.somesite.com/login?un=myplaintextusername&pw=myplaintextpassword

3 个答案:

答案 0 :(得分:48)

重要的部分是你在POST主体中传输表单数据(这样它不会在任何地方缓存,也不会存储在任何日志文件中)并使用HTTPS(这样,如果你有一个很好的SSL / TLS证书,没有人可以通过观察您的网络流量来嗅出密码)。如果你这样做,那么散列密码没有什么大的额外好处,至少在传输过程中没有。

为什么人们会谈论哈希密码呢?因为通常您不希望以明文形式将用户密码存储在服务器端数据库中(否则受损服务器的影响甚至会比其他情况更糟)。相反,您通常存储salted / hashed表单,然后将相同的salt / hash应用于通过表单数据接收的密码,以便您可以比较这两者。

有关腌制的更多信息,请参阅http://en.wikipedia.org/wiki/Salt_(cryptography)(及其中的链接)。

答案 1 :(得分:6)

如果您正在使用HTTPS,那么您可以在POST主体中发送名称和密码,这对窃听者来说是安全的(假设您信任SSL)。你不需要哈希密码,如果你这么做,那么密码哈希就像密码本身一样有用,所以它不会给你买任何东西。

更重要的问题是如何在服务器端存储密码。只有使用scrypt等良好算法,才能存储散列密码。但是,这仍然不如SRP等高级协议那么好。

答案 2 :(得分:5)

您应该始终使用HTTPS并避免使用自制代码。 SSL将负责散列和放大加密。这是唯一安全的方法。

还要确保您在服务器端散列密码并存储散列,而不是原始密码。然后比较哈希以检查登录。这样可以防止攻击者直接从您的数据库中读取明文密码,如果它被破坏了。