保护私有REST API的最佳方式,无需用户身份validation移动应用程序

我正在为我的移动应用程序制作一些Restful API。

APP和networking服务器之间的通信必须在REST中完成。 这些apis应该是私人的,只有我的应用程序应该能够称他们为成功的结果。

困难的是,我的应用程序中没有用户名和密码,所以我不知道如何限制与移动应用程序的其余API没有基本的用户身份validation。

我认为的一个解决scheme是embedded某种硬编码string,所以当移动应用程序使用宁静的URL时,他们将通过SSL以encryption格式传递。 但我知道这似乎是非常糟糕的解决scheme..

请提出在这种情况下最好的解决办法。

Solutions Collecting From Web of "保护私有REST API的最佳方式,无需用户身份validation移动应用程序"

看看基于哈希的消息authentication码(HMAC)机制。

维基百科链接: http : //en.wikipedia.org/wiki/Hash-based_message_authentication_code

您的客户端(移动应用程序)将需要一个公共 API密钥来标识REST Web服务客户端和私钥 /密钥。 公共API密钥可以随HTTP请求一起发送。 它是公开的,每个人都可以看到它。 但是,私钥不应该随请求一起发送,而只应由服务器和客户端知道。 此密钥用于生成散列消息,而不是将其发送到服务器。 HMAC可以使用SHA1 / MD5algorithm生成,消息应该由服务器和客户端都知道的algorithm生成,最后是私钥。

你是对的,embedded密钥的应用程序可以很容易地通过数据包嗅探器或其他各种技术来检索。 您可以使用以下说明来解决此问题。

  • 客户端(您的应用程序)将调用所需的API
  • 服务器将拒绝它,但作为响应,它将发送一个包含随机散列(= 挑战 )的string。
  • 客户端使用该string结合其他string(= 密码 )(已经embedded在应用程序中)来生成一个新的散列(= 摘要
  • 客户端将再次调用相同的API,但是这次使用新创build的摘要作为身份validation参数。
  • 服务器将validation该摘要,并将继续

仅供参考:上述程序被接受为标准并被称为摘要式authentication 。 如果你需要更多的帮助,那么只要问Google“android http digest authentication”

我会build议在应用程序中创build一个复杂的令牌,由时间戳+ appId +可以在服务器上复制的任何其他值构成,并使用这些值在每个请求的头部进行身份validation。

例如,您可以在您的数据库中创build一个虚拟的“用户”,并在其中存储deviceToken并将其用于您的algorithm。

我个人保留一个API请求公开,这是时间戳getter,它返回300秒内使用服务器的时间戳。

所以在每个请求之前,获取时间戳,并发送您创build的令牌,将其复制到服务器上,从而validation请求。

一个平庸的黑客可以逆向工程的应用程序,然后复制你的代币