在应用程序中实现(安全)Api密钥

时间:2012-05-15 13:49:26

标签: php security web-applications sniffing api-key

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

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

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

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

所以我的问题是

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

你们有什么想法?

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

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

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

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

有很多解决方案 - 它们都会给用户带来一定程度的痛苦。例如,您可以在HTTPS上运行您的服务;这会阻止窥探,但会降低性能。您可以为您的服务颁发“令牌”,该服务在一定数量的使用后到期;获取新令牌需要加密交换(可能会检查您的IP地址)。您可能需要“质询/响应”类型的逻辑(包括IP地址验证)。所有这些步骤都会让您的用户更加努力;他们可能不会因为他们必须做的额外工作而感谢你。

答案 2 :(得分:1)

如果你想限制访问+潜在的一些使用率限制,那么在API上进行一些身份验证肯定是有意义的。如果您使用API​​密钥并希望避免嗅探,那么HTTPS肯定是要走的路。如果这不是一个选项,那么你也可以使用像oAuth 1.0(http://oauth.net/core/1.0/)或亚马逊AWS身份验证这样的哈希风格的身份验证。这些工作通过向您的API用户发放ID和密钥来实现。他们在客户端使用秘密,将其插入到消息体中,计算哈希并在请求中包含哈希(而不是秘密)。在传入方面,您将哈希与在消息内容上执行的相同操作与其包含的特定秘密进行比较。

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

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