如何改进 HTTP 基本身份验证?

Posted

技术标签:

【中文标题】如何改进 HTTP 基本身份验证?【英文标题】:How can I improve HTTP Basic Authentication? 【发布时间】:2011-02-18 07:36:02 【问题描述】:

我目前正在开发一个基于 Zend Framework 的 API 站点。由于 ZF 对 Digest Authentication 的支持不够,现在转移到另一个框架为时已晚,我正在考虑实现 Basic Authentication。

Basic 和 Digest 实际上并不是执行身份验证的理想方式,而 Digest 更好,但不幸的是 Zend 不太支持(正确实现它需要太多工作,需要尽快完成项目)。 Basic auth 的一大问题是密码是以明文形式发送的。我在考虑不是以明文形式发送密码,而是可以使用单向散列算法/ bcrypt 以某种方式对其进行散列以避免以明文形式发送密码吗?但它仍然遭受中间人攻击。

但是,如果将基本身份验证与当前大多数 Web 应用使用的基于表单的身份验证进行比较,它们在将请求传输到服务器时是否都存在相同的安全问题?

【问题讨论】:

【参考方案1】:

保持请求安全的最佳选择是对身份验证请求使用 SSL,以确保信息不会以明文形式发送。

如果您在发送身份验证请求之前尝试在客户端上进行某种散列或加密,您会立即将散列算法和您可能使用的任何盐暴露给恶意用户。这使得他们可以对您的服务器使用字典攻击。

但是如果比较基本 使用当前基于表单的身份验证 大多数网络应用程序使用的身份验证, 他们都共享同一个 传输时的安全问题 对服务器的请求?

绝对是。同样,对于基于表单的身份验证,您最好的选择是使用 SSL。

或者,您可以考虑使用外部身份验证服务,例如 OAuth。

【讨论】:

不幸的是,其他团队成员过于偏执,无法让第三方应用程序处理成员密码。看起来 SSL 是确保安全性的唯一方法。不过感谢有关字典攻击的提示。 很高兴我能帮上忙。不过需要说明的是,OAuth 不会将用户的密码存储在第三方中。它允许用户使用您的用户已经拥有帐户的受信任第三方提供的凭据登录您的系统。例如,如果您的用户有 gmail 或 facebook 帐户,您可以允许他们使用这些帐户登录。一般来说,这些系统已经受到您的用户的信任(因为他们在那里有帐户),并且通常有一个安全策略,它比小型组织能够承受的更强大。 这不是更像openlogin吗?除了术语,我应该将其改写为 - 其他团队成员过于偏执,无法让其他人出于某种未知原因处理 authN 和 authZ。 是的,每个项目的需求都会有所不同,使用 OAuth 肯定有一些缺点。 SSL 设置起来相当容易,而且现在有质量提供商以非常低的成本提供证书。听起来就是这样。【参考方案2】:

嗯,Zend 框架有一个用于身份验证的摘要适配器?

Manual: Zend Digest Authentication

【讨论】:

但是 zend_http 不发送带有摘要认证的请求,此外,适配器没有实现 rfc 2617 的某些部分(随机数跟踪)。【参考方案3】:

您始终可以为 HTTP 身份验证编写自己的 Zend_Auth_Adapter。我实现了Zend_Auth_Adapter_Http_Resolver_Interface,每天都有不同的密码,格式为默认密码+天+月。像魅力一样工作!

【讨论】:

是的,当我有更多时间时需要这样做

以上是关于如何改进 HTTP 基本身份验证?的主要内容,如果未能解决你的问题,请参考以下文章

使用 HTTP 基本身份验证获取 JWT 令牌的安全性如何?

如何使用基本身份验证提供静态文件?

如何在 Swift 中发出 HTTP 请求 + 基本身份验证

如何使用 Guzzle 进行 HTTP 基本身份验证?

如何显示 HTTP 401 基本身份验证对话框

当 HTTP 方法是 Apache .htaccess 上的 OPTIONS 时,如何避免请求基本身份验证?