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

Sun*_*day 36 passwords https login http username

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

我的猜测是散列密码,将用户名/密码放在POST主体中并发送过来HTTPS.什么是更好的方式?

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

http://www.somesite.com/login?un=myplaintextusername&pw=myplaintextpassword
Run Code Online (Sandbox Code Playgroud)

Jan*_*ger 53

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

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

有关盐析的更多信息,请参阅http://en.wikipedia.org/wiki/Salt_ ( cryptography)(以及那里的链接).

  • ^来自开发人员,我希望有人能像您过去一样用同样的语言来表达……当我过去第一次学习开发应用程序时。优秀!:) (2认同)
  • @OmarOmeiri 这可能有用,但我一般不建议对这种事情使用 GET 请求,尤其是因为任何代理可能决定向客户端提供响应的缓存副本,并且从不实际将请求发送到您的服务器,在客户端本身也可能存在缓存。所有这些都可以在一定程度上得到控制,但它增加了很多麻烦,却没有真正的好处。更一般地说,出于类似的原因,使用 GET 请求在服务器端执行状态更改(例如数据库更新)是不好的做法。 (2认同)

Gre*_*ill 7

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

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


Dav*_*e L 5

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

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

  • 所以你是说这个星球上没有人能想到比 IETF 的家伙们提出的 TLS 更安全的加密/散列技术? (2认同)