2011-03-22 134 views
2

我有一个Web应用程序,我想通过API或Web服务访问某些功能。我的问题是我想控制我的API可以从哪里访问,也就是说,我只想让我创建或批准的应用程序可以访问我的API。该API将是一个基于Web的REST服务。我的用户不会登录,因此没有用户身份验证。最有可能的用例和现在使用的用例是应用程序将是iOS应用程序。 API将用django/python编码。控制访问Web服务/ API的安全措施

鉴于无法查看iOS应用程序的源代码(我认为,纠正我,如果我错了),我最初的想法是,我可以只是有一些秘密密钥传入API的参数。然而,任何听到连接的人都能看到这个键,并从世界其他任何地方使用它。

我的下一个虽然是我可以添加一个先前的步骤。在应用程序使用API​​之前,它必须通过挑战。在第一次请求时,我的API将创建一个随机短语并使用某个密钥(RSA?)对其进行加密。原始未加密的短语将被发送到应用程序,该应用程序还必须使用相同的密钥对短语进行加密,并将加密的文本与其请求一起发回。如果加密匹配,应用程序可以访问,但如果不是,他们不会。

我的问题是:这听起来像一个很好的方法,如果有的话,是否有任何现有的库可以做这些类型的东西?我现在将在Python服务器端和客户端客户端工作。

回答

2

如果您希望API消费者始终在同一个IP上请求,最简单的解决方案应该是IP白名单。

如果你想支持从任何地方'验证'的能力,那么你在正确的轨道上;共享加密方法然后请求用户发送具有加密的api消费者句柄/密码/请求日期的请求会容易得多。您的服务器解码加密值,根据您控制的白名单检查句柄/密码,然后验证请求日期是否在某个有效的时间范围内;也就是说,如果请求日期不在1分钟之前,请拒绝请求(这样,有人截取加密值,它仅在1分钟内有效)。由于请求时间不断变化,加密值不断变化,因此认证密钥不断变化。

这是我的反正。

0

除了Tejs的回答,一种已知的方法是将操作系统的产品ID(或客户端机器的另一个唯一ID)与用户已知但未存储在应用程序中的特定密码绑定,并使用它们来加密/解密消息。例如,当你得到独特的号码。从用户那里给你提供密码,这样他们就可以完成对方,为RC4创建一个种子X,并将其用于加密/解密。这个种子X也是服务器所知道的,并且它也用它来加密/解密。我不会告诉你,这当然是最好的方式,但假设你信任最终用户(但不一定能够访问此计算机的任何人),这似乎就足够了。

另外,加密一个良好的Python库pycrypto

0

在第一个请求,我的API将创建一个随机的短语,并与一些秘密密钥进行加密(RSA?)

阅读起来在http://en.wikipedia.org/wiki/Digital_signature看到这种握手背后的故事。

然后阅读了关于

http://en.wikipedia.org/wiki/Lamport_signature

而且它的表妹

http://en.wikipedia.org/wiki/Hash_tree

的想法是,签名可以使用一次。在iOS代码中签名的妥协并不重要,因为它是一次性使用密钥。

如果您使用哈希树,您可以通过在iOS二进制文件本身上构建哈希树来获取许多有效签名。服务器和iOS应用程序都可以访问用于生成签名的相同 文件。