2

我编写了一个 Web 应用程序,并希望允许其他开发人员从中获取信息。

我正在使用的服务器不是那么糟糕并且无法处理那么多请求,因此我们的想法是生成 API 密钥并将其分配给想要查询我们信息的每个人。使用 Api 密钥,我可以限制每日请求,也许还可以收集一些统计数据,看看哪些信息对其他开发人员真正有用。

问题是,我担心它的安全方面。由于 Api 密钥将被发送到我们的服务器(通过 GET/POST 等),因此有人可以使用 wireshark 嗅探请求并轻松获取开发人员 API 密钥,对吧?

我考虑过生成一个密钥和一个 API 密钥。然后我可以指示其他开发人员将它们连接起来并将其哈希发送到我们的 API。然后我会验证哈希是否有效并允许请求......但是同样的问题会持续存在。黑客仍然可以嗅探该哈希并代表其他开发人员的应用程序发出请求。

所以我的问题是

  • 我怎样才能避免这个问题?
  • 或者更好的是,我的担忧是否有效?这是一个真正的问题吗?
  • 是否有更好、更安全的方式来允许访问我的信息,而不会使其他开发人员过于复杂?

你们有什么感想?

4

3 回答 3

2

关于嗅探,您的问题可以通过服务器上的 HTTPS 解决。

于 2012-05-15T13:58:29.343 回答
2

我认为您正在尝试在这里解决许多不同的问题。

如果您的目标是限制对服务器的请求数量,您应该创建一个限制机制。这很重要,但我会基于 IP 地址而不是许可证密钥 - 单个许可用户可能会用大量请求淹没您的系统。您可以通过 IP 地址进行节流,而无需实施许可机制。

如果你想创建一个许可方案,你需要了解密码学等——这是一个不平凡的问题。例如,您如何阻止合法用户与所有朋友共享他们的许可证密钥?您如何阻止黑客窃取您的密钥并与他的所有朋友共享?

有许多解决方案 - 它们都给您的用户带来了一定程度的痛苦。例如,您可以在 HTTPS 上运行您的服务;这会停止窥探,但会降低性能。您可以为您的服务发行“令牌”,在使用一定次数后过期;获取新令牌需要加密交换(可能会检查您的 IP 地址)。您可能需要“挑战/响应”类型的逻辑(包括 IP 地址验证)。所有这些步骤都让您的用户生活更加困难;他们可能不会非常感谢您为他们必须做的额外工作。

于 2012-05-15T15:56:09.710 回答
1

如果您想限制访问+潜在的一些使用率限制,那么在 API 上进行一些身份验证绝对是有意义的。如果您使用 API 密钥并希望避免嗅探,那么 HTTPS 绝对是最佳选择。如果这不是一个选项,那么您还可以使用像 oAuth 1.0 (http://oauth.net/core/1.0/) 或 Amazon AWS 身份验证这样的散列式身份验证。这些通过向您的 API 用户颁发 ID 和 Secret 来工作。他们通过将秘密插入消息正文、计算哈希并在请求中包含哈希(不是秘密)来使用客户端的秘密。在传入端,您将哈希与对消息内容执行的相同操作进行比较,其中包含特定的秘密。

这意味着您可以验证发件人,而不必通过网络发送密钥(请注意,内容仍然不安全 - 但您避免在每次请求时通过网络传递密钥)。缺点是开发人员实现起来很复杂。即使您使用有库的 oAuth 1.0 模式,也有点开销。

我在 3scale 工作,我们的一些工具也可能会有所帮助 - 我们的系统提供 API 密钥、oAuth 秘密共享以及开箱即用的 API 速率限制(http://www.3scale.net 和 PHP 库在这里:https ://github.com/3scale/3scale_ws_api_for_php)。

于 2012-05-16T15:10:25.577 回答