在应用中实现(安全)API 密钥


Implementing (secure) Api Keys in an app

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

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

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

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

所以我的问题是

  • 如何避免此问题?
  • 或者更好的是,我的担忧是否有效?这是一个真正的问题吗?
  • 有没有更好、更安全的方法允许访问我的信息,而不会让其他开发人员太复杂?

你们怎么看?

我认为您在这里试图解决一堆不同的问题。

如果您的目标是限制对服务器的请求数,则应创建限制机制。这并非易事,但我会将其基于 IP 地址而不是许可证密钥 - 单个许可用户可能会用大量请求淹没您的系统。您可以按 IP 地址进行限制,而无需实施许可证机制。

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

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

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

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

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

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