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

问题描述:

我编写了一个Web应用程序,我希望允许其他开发人员从中获取信息。在应用程序中实现(安全)Api密钥

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

事情是,我关心它的安全方面。由于Api密钥将被发送到我们的服务器(通过GET/POST等),有人可以通过wireshark嗅探请求并获得开发人员API密钥,没有太多的努力,对吧?

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

所以我的问题是

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

你们认为什么?

+0

我已经倒下了这个意外(我甚至不记得有读过这个)。我该如何解决这个问题。 – Gellweiler

我想你正试图解决一堆不同的问题。

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

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

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

+0

你完全正确。感谢您的帮助! – mpratt

关于嗅探,您的问题可以通过服务器上的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)。