如何通过 HTTP 执行安全身份验证?

信息安全 http
2021-08-22 19:34:09

我必须登录 HTTP 网站。

有一个登录表单,其中包含用户名和密码的输入以及 sessionId 作为隐藏输入。我正在创建一个应用程序,我必须在其中访问资源,如果您在此网站上登录就可以访问这些资源,因此我在我的应用程序中提供用户名和密码输入以登录。

我现在看了 HTTP 请求,发送登录数据的 HTTP POST 请求有参数密码和用户名,所以我可以在Fiddler中看到我的用户名和密码未加密,但我不想发送我的数据不受保护。

如果像 Fiddler 这样的工具可以清楚地看到 HTTP POST 请求的参数,这是否意味着我的数据在没有任何加密的情况下发送到服务器?或者是否有任何类型的加密对我来说是不可见的?

4个回答

各种普通的 HTTP 都是未加密的。如果您想保护您的数据,则必须通过 HTTPS 发送。

有一种机制允许在没有 SSL 或 TLS 的情况下通过 HTTP 进行安全身份验证,但它很少使用,而且它仍然不如 HTTPS。基本上,这是一种历史意义的半安全措施,从未流行过,无论如何你真的应该只使用 HTTPS。但是既然你问了……

HTTP 协议支持两种身份验证机制:基本和摘要访问身份验证,两者都在RFC 2617 中描述这些机制会导致您的浏览器本身显示一个身份验证对话框,而不是嵌入到页面内容中。有时使用的基本身份验证并不比明文传输好多少。

然而,摘要机制是一个挑战-响应协议。服务器发出一个包含随机数(一些随机字符串)的质询。客户端必须使用随机数和密码(但不是密码本身)的哈希函数的响应重新发出请求。

有一些重要的警告:

  • 服务器通常存储明文密码(或它的明文等效版本),以便能够验证质询。这是不可取的,因为最佳实践规定只应存储加盐密码哈希。(@user2829759 指出服务器还可以存储(username:realm:password)的 MD5 哈希
  • Digest 机制使用 MD5,这在当今被认为是一种不安全的哈希算法。与 SSL/TLS 不同,客户端和服务器之间没有算法协商。
  • 没有验证服务器的身份。欺骗是可能的,中间人攻击也是如此。Digest Authentication 唯一擅长保护的是密码本身——它并没有人们想象的那么有用。

在 Apache 中,摘要式身份验证支持由mod_auth_digest提供。


从这个琐事中可以得出的一个教训是,基于 JavaScript 的加密黑客可能会遭受同样的弱点。如果您需要安全性,只需使用 HTTPS!

回答您提出的问题:是的,凭证很可能以明文形式发送。

Fiddler 唯一一次能够看到凭证的明文,而凭证被加密发送,是如果您在 Fiddler 中启用 SSL 代理并将客户端设备配置为信任 Fiddler 根 CA 或忽略证书错误。如果你这样做了,你可能会知道。

记录在案:信任 Fiddler 根 CA应用于测试目的,编写忽略证书错误的应用程序本身就是一个安全漏洞。

由于您正在编写一个将对第三方服务进行身份验证的应用程序,该服务可能您无法控制,因此您实际上无法采取任何措施来增强此登录过程的安全性。

如果网站(和您的应用程序)实现了SRP 协议(安全远程密码),您的应用程序就有可能通过 HTTP 安全地进行身份验证。

请注意,它只对实现 SRP 协议的应用程序是安全的,而不是对使用浏览器访问网站的用户,因为如果使 SRP 工作所需的 JavaScript 代码是通过 HTTP 发送的,它可能会被篡改。

现在,由于您正在使用的网站不太可能实现 SRP 协议(​​因为如果他们关心安全性,他们至少会使用 HTTPS),因此您无法做任何事情来保护登录过程。

此外,仅切换到 HTTPS 比实现 SRP 协议更容易。