【问题标题】:Security measures for controlling access to web-services/API用于控制对 Web 服务/API 的访问的安全措施
【发布时间】:2011-03-22 17:44:40
【问题描述】:

我有一个 web 应用程序,它具有一些我希望通过 API 或 web 服务访问的功能。我的问题是我想控制可以从哪里访问我的 API,也就是说,我只希望我创建或批准的应用程序可以访问我的 API。 API 将是一个基于 Web 的 REST 服务。我的用户没有登录,所以没有用户身份验证。最可能的用例,也是现在可以使用的,是应用程序将是一个 iOS 应用程序。 API 将使用 django/python 进行编码。

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

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

我的问题是:这听起来像是一种很好的方法吗?如果是的话,是否有任何现有的库可以做这些类型的事情?我现在将在python服务器端和objective-c客户端工作。

【问题讨论】:

    标签: python objective-c security api rsa


    【解决方案1】:

    如果您希望 API 使用者始终从同一个 IP 请求,最简单的解决方案是 IP 白名单。

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

    这就是我的看法。

    【讨论】:

      【解决方案2】:

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

      另外,一个很好的密码学python库是pycrypto

      【讨论】:

        【解决方案3】:

        在第一次请求时,我的 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 应用程序都可以访问相同的 用于生成签名的文件。

        【讨论】:

          猜你喜欢
          • 2010-09-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-01-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多