【问题标题】:Authentication security concerns身份验证安全问题
【发布时间】:2012-11-22 07:44:16
【问题描述】:

我是一名初学者网络开发人员,我对自己开发的 API 的安全性有些怀疑。这是一个简单的网络服务,需要身份验证才能访问/修改数据。

我想知道通过 HTTP 对用户进行身份验证的最佳做法是什么。

目前我的应用是这样工作的:

用户通过需要用户名和密码的 API 请求 (POST) 进行身份验证。响应包含有关用户的信息和一个 TOKEN,它将在未来用于进一步的请求。

我的担忧:我不知道身份验证请求是否应该是 POST。这听起来更像是一个 GET,因为 POST 应该创建一些东西(至少这是 Ruby on Rails 中的约定)。然后,即使使用 POST 或 GET,在信息传输过程中信息仍然是“可见的”。我听说了一些关于 HTTPS 的事情 - 它是如何解决问题的?

令牌在用户创建时生成 - 并且在时间上保持不变。这很糟糕吗?是否应该在“注销”后再次生成令牌?我见过使用 API_KEY 和令牌进行身份验证的 API。它是如何工作的?

我有一些 GET 请求来检索有关某事的信息。通过此请求,我将从身份验证请求中检索到的令牌作为参数传递。这个可以吗?我的意思是令牌是敏感信息。

我在哪里可以找到有关我的这些问题的更多信息(书籍、文章、w/e)?

【问题讨论】:

    标签: api http authentication https security


    【解决方案1】:

    GET 的问题更多是物理安全而不是网络安全 - 我知道我经常在工作场所或家里与其他人一起登录网站 - 我当然不希望将我的凭据作为附加到 URL查询字符串。

    使用 HTTPS (SSL) 将保护您的 postdata,因为信息在通过线路发送之前已被加密。加密算法在生成其解密令牌时使用了一些非常聪明的数学方法,以确保它不会受到中间人攻击。

    【讨论】:

    • 另外 HTTPS 是为了传输安全,但查询参数可以登录,比如说 apache httpd 日志,如果您不将日志视为敏感数据,您可能会受到伤害:)
    【解决方案2】:

    HTTPs 对您网站的所有流量进行加密,因此会隐藏任何获取和发布请求。它要求您购买 HTTPS 证书(便宜),并获得一个非共享 IP 来托管(不那么便宜)。 (如果有人谈论自签名证书 - 好吧,这是可能的,但如果外部人员想与您的服务交谈,则不建议这样做)。

    拥有一个持久的登录令牌可能很糟糕,这取决于您想要什么样的不可否认性。如果有人可以在 2 年前登录,并继续使用令牌,你怎么知道它仍然是原始请求者?令牌应该过期并且可以重新请求。

    API 密钥通常适用于带外交换的共享密钥(通常通过从托管商的网站获取)。使用自定义身份验证方案和标头,并且必须为每个请求计算和检查。这不需要 HTTPS - 共享密钥用于生成身份验证标头,但不与它一起发送,因此该密钥不会随每个请求一起传播。当然,您需要编写此代码,并弄清楚您想要的过程是什么。除非您知道自己在做什么,否则我通常会避免这种情况-您需要对请求进行规范表示,对其进行签名,然后将其用作标头。不复杂,但也不简单。

    【讨论】:

      猜你喜欢
      • 2013-03-15
      • 1970-01-01
      • 1970-01-01
      • 2012-03-22
      • 2021-10-23
      • 1970-01-01
      • 1970-01-01
      • 2012-05-22
      • 1970-01-01
      相关资源
      最近更新 更多