确保Web API安全的最佳做法是什么?


15

我需要为我们的移动应用程序构建一个Web服务API,以便与我们的服务器和数据库进行交互(在ASP.Net MVC 4中,但这无关紧要)。虽然大多数操作不需要用户注册我们的服务,但我们只想限制我们应用程序用户的访问。

有什么方法可以确保拒绝从其他地方(例如,需要我们的所有数据或构建非官方应用程序的人)进行的调用?

我最初的想法是让设备向服务器请求令牌,该令牌是随机生成并按原样发送的。所有其他方法将检查请求标头是否包含特定的标头,该标头将是咸化令牌的md5哈希。服务器知道令牌和盐,并且能够计算哈希并将其与发送的哈希进行比较。另外,令牌的使用寿命有限,并且设备必须每隔一小时获得另一个令牌。

这似乎很容易实现,尽管可能不是100%证明,但这似乎是一个好主意。你怎么看?

Answers:


15

释放应用程序后,它可能会进行反向工程。这意味着,如果将相同的应用程序(相同的二进制文件,相同的设置)分发给所有用户,那么您将无可奈何地得到100%的保护。

如果您可以为每个用户自定义应用程序,那么您就有机会不禁止其他应用程序使用您的API,但至少可以通过它可以对API发出的请求数来限制此应用程序。

想象一下以下架构:

  1. 客户端连接并发送其唯一标识符(用户一个标识符)。
  2. 服务器通过发送使用公钥加密的质询来答复。该公共密钥与先前发送的唯一标识符相关联。
  3. 客户端通过使用私钥解密数据来解决挑战,并将解密后的秘密以无格式方式发送回服务器。
  4. 服务器验证提交的机密是否与最初生成的机密相对应。

能够入侵您的应用程序并成功获取私钥的开发人员将能够从自己的应用程序中使用您的API,但是他将作为您服务器的标识符。

如果同一个用户每天可以向您的API发出1万个请求,并且平均而言,一个活跃用户每天可以发出2 000个请求,则意味着该开发人员可以自己使用其应用程序,也可以将其发送给他的朋友,但是他无法将它卖给成千上万的人,因为它只能在早上工作几分钟。

虽然这样做有帮助,但也不是100%证明。如果黑客在设备上安装了自己的应用程序后找到了从您的应用程序中提取私钥的方法,该怎么办?


附注不回答你的问题,但仍可能是有用的:不要去想一个API作为一个工具,为您的初级产品(移动应用)。可以将其视为一流的产品本身,即可以付费的产品。亚马逊和Google多年来一直使用相同的模型,微软,Azure等也开始积极使用该模型。

一旦您认为API不是作为新的移动应用程序的次要工具而沦为奴隶制,而是与用户实际看到的任何应用程序处于同一水平的实际产品,您便开始思考如何保护API免受侵害。其他应用的使用情况,以及有关API本身的获利的更多信息。此类API可由您的客户应用程序或任何人免费开发的任何其他应用程序使用。这有几个好处:

  • 制作一个仅由您的应用程序使用的API 既困难又昂贵。这段时间和金钱可以用于更有用的事情。

  • 向公众开放您的API可以为您和整个世界带来巨大利益。假设您是一位出色的架构师和一位出色的开发人员,因此您创建了一个非常出色的API,但是您的视觉设计师技能却很糟糕,您对交互设计等一无所知。如果您隐藏了API,那么唯一的人们会知道的是,您已经创建了一个无法使用且丑陋的移动应用程序。如果您的API是公开的,其他开发人员将被其质量吸引,并为其编写出色的应用程序,从而为您带来很多收益。

  • 您从未想象过其他人会如何使用您的API。这就是Kinect发生的情况。最初,微软为游戏创建Kinect。当Microsoft向公众开放该API时,他们从未想到过几年后科学应用程序,卫生部门等会使用该API。WebAPI与此类似:更多的开发人员正在使用它,想法会更加广泛。


非常有趣的答案。我们可能需要考虑如何使API公开。另外,作为参考,在法国,反向工程和拆卸是非法的目标市场,因此我们应该对此过多关注。
Antoine 2013年

2
@Antoine:只要许可证禁止,严格的工程在任何国家都是非法的。但是,这是非法的事实并不意味着没有人会崇拜您的应用程序。
2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.