【问题标题】:Is this a safe authentication scheme for my site's API?这是我网站 API 的安全身份验证方案吗?
【发布时间】:2011-10-15 13:16:13
【问题描述】:

我目前正在为我的教会构建一个数据库应用程序,它处理一些相当敏感的数据..

该应用是用 ruby​​ on rails 编写的,

我们还希望通过 iPhone 应用对其进行扩展。

我目前正在尝试寻找验证 iPhone 应用用户身份的最佳解决方案,这是我想出的一个解决方案:

  1. iPhone 应用程序发出一个握手请求(通过 SSL),该请求返回一个 JSON 字符串,其中包含 2 个值:api_key 和 api_secret。

  2. 任何后续请求都附加了 2 个额外的参数 api_key 和 api_signature api_signature 基本上是与用户电子邮件一起散列的 api_secret 以掩盖秘密。

  3. rails 应用程序通过将 api_secret 和用户电子邮件哈希在一起并将其与传入的签名进行比较来验证签名。

  4. 应用获取它的数据 :-)

  5. api_secret 失效并每 2 小时重新创建一次(因此,如果黑客掌握了它,他们将只有 2 小时内的有效密钥..)

和我想的一样聪明.. 我看到了一个非常明显的场景:

如果黑客无论如何都掌握了 api_key 和 api_signature 怎么办..

如果他们将他们的请求附加到他们所在的那些参数中,那么我所有的困惑有什么意义呢?

您将如何更好地实现这一点?

非常感谢!

【问题讨论】:

  • 这个“握手请求”涉及什么?用户最初是如何进行身份验证的?
  • 哪一端发送api_keyapi_secret?只有每个用户的数据是电子邮件地址吗?
  • 基本上只是对我的会话控制器上登录操作的标准 POST 请求...然后生成这两个值(api_key 和 api_secret).. 不完全是如何,可能只会生成一个随机数和使用 MD5 散列它
  • 或者哈希用户的电子邮件时间..也许?
  • 所有请求都可以通过 SSL 进行,还是必须以明文形式传输其中一些请求?如果整个对话是通过 SSL 进行的,那么您可以生成一个会话令牌(它只是一个来回传递的随机值),或者您甚至可以在每个请求中发送用户名和密码(例如 HTTP 基本身份验证) .

标签: objective-c ruby-on-rails api authentication rest


【解决方案1】:

我认为你的问题是静态签名。

如果你 look at how AWS 这样做(如果其他人已经做得很好,我喜欢不要重新发明轮子),他们的签名会从请求的所有参数中进行哈希处理,其中一个是强制执行的成为时间戳。

这很重要,因为这意味着即使对相同数据的重复请求,签名也会迅速变化。强制时间戳还意味着您可以确保请求具有相对较短的有效性,假设客户端和服务器上的时钟相距不太远。我当然不会有长达 2 小时的时间 - 我会将窗口缩短到 15 分钟左右。

把它想象成公钥和私钥。您可以发布公钥(api_key),但私钥必须只有客户端和服务器知道。

私钥不应该在请求中传输,并且传输它的静态哈希也不是很好 - 因此亚马逊采取了这种方法。

如果您确实需要将私钥传输到设备开始,我会觉得在与 api_key 相同的有效负载中传输它非常不舒服,但此时您可能应该听取安全专家的建议我已经超出了我的深度,很高兴承认这一点。

【讨论】:

    【解决方案2】:

    幸运的是,您的问题并非独一无二,因此无需重新发明任何东西。只需使用Digest access authentication。我对 Ruby on Rails 了解不多,但我知道有 support for it。您也可以使用ASIHttpRequest 为 iPhone 实现客户端,因此您不必发明任何安全方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-27
      • 2010-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-24
      • 2014-01-11
      • 1970-01-01
      相关资源
      最近更新 更多