提问者:小点点

保护移动应用无需用户身份验证的私有REST API的最佳方法


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

应用程序和webserver之间的通信必须在REST中进行。这些API应该是私有的,并且只有我的应用程序能够调用它们以获得成功的结果。

困难的部分是,我的应用程序中没有用户id和密码要求,所以我不知道在没有基本用户身份验证的情况下如何限制移动应用程序的rest API。

我想的一个解决方案是嵌入某种硬代码字符串,这样当移动应用程序将使用restful url时,它们将以加密格式通过SSL传递。但我知道这似乎是一个很糟糕的解决方案..

请建议在这种情况下最好的解决方案。


共3个答案

匿名用户

看看基于哈希的消息身份验证代码(HMAC)机制。

维基百科链接:http://en.Wikipedia.org/wiki/hash-based_message_authentication_code

您的客户端(移动应用程序)将需要一个标识REST webservice客户端的公共API密钥和一个私有/加密密钥。公共API密钥可以与HTTP请求一起发送。它是公开的,每个人都能看到。但是,私钥不应与请求一起发送,只应由服务器和客户机知道。此键用于生成将发送到服务器的哈希消息。HMAC可以使用SHA1/MD5算法生成,这是一个应该由服务器和客户端都知道的算法生成的消息,最后是私钥。

匿名用户

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

  • 客户端(您的应用程序)将调用所需的API
  • 服务器将拒绝它,但作为响应,它将发送一个包含随机散列(=挑战)的字符串。
  • 客户端将该字符串与某些其他字符串(=密码)(已嵌入到app中)结合使用,以生成新的哈希(=摘要)
  • 客户端将再次调用相同的API,但这次使用新创建的摘要作为身份验证参数。
  • 服务器将验证该摘要并继续

供参考:上述程序是被广泛接受的标准,被称为摘要认证。如果您需要更多帮助,那么只需向谷歌寻求“Android http摘要身份验证”

匿名用户

你确实可以让反向工程师的工作变得更难,但却不能像Nasir所说的那样,通过引入数学上的难题并相应地转换你的硬编码字符串来使它防弹。

这样怎么样。假设在app中硬编码了一个数字a。服务器发送两个数字b&P(P是大素数)。现在,您可以使用(a^b)%p计算将由服务器验证的实际数字。您的应用程序现在使用服务器的公钥加密(a^b)%p的答案。服务器将用它的私钥解密它,验证它,并发出一个有过期时间的令牌(可能是jwt)。那么您的应用程序和服务器就可以使用该令牌进行通信。您可以在应用程序引导时执行一次计算,并存储令牌以供进一步使用。