我正在为我的移动应用程序制作一些Restful API。
APP和网络服务器之间的通信必须在REST中进行。这些apis应该是私有的,只有我的应用程序才能调用它们以获得成功的结果。
困难的部分是,我的应用程序中不需要用户ID和密码,因此我不知道如何在没有基本用户身份验证的情况下使用移动应用程序限制rest API。
我认为一种解决方案是嵌入某种硬编码字符串,因此当移动应用程序使用restful url时,他们将通过ssl以加密格式传递。但我知道这似乎是非常糟糕的解决方案..
请在这种情况下建议什么是最佳解决方案。
答案 0 :(得分:6)
查看基于哈希的消息身份验证代码(HMAC)机制。
维基百科链接:http://en.wikipedia.org/wiki/Hash-based_message_authentication_code
您的客户端(移动应用)需要一个公共 API密钥,用于标识REST Web服务客户端和私有 / 加密密钥。公共API密钥可以与HTTP请求一起发送。它是公开的,每个人都可以看到它。但是,私钥永远不应与请求一起发送,并且只应由服务器和客户端知道。此密钥用于生成散列消息,而不是将其发送到服务器。可以使用SHA1 / MD5算法生成HMAC,该算法应该由服务器和客户端都知道的算法生成,最后是私钥。
答案 1 :(得分:4)
您是对的,应用程序中的嵌入式密钥可以通过数据包嗅探器或其他各种技术轻松检索。您可以使用以下说明来解决此问题。
仅供参考:上述程序是广泛接受的标准,被称为Digest Authentication。如果您需要更多帮助,请向Google询问" android http摘要认证"
答案 2 :(得分:1)
您确实可以通过引入数学上的难题并相应地转换您的硬编码字符串来使逆向工程师的工作更加艰巨,但不能像Nasir那样使它变得防弹。
如何?假设一个数字A
在应用程序中进行了硬编码。服务器发送两个数字B
和P
(P是大质数)。现在,您可以使用(A^B) % P
计算服务器将验证的实际数字。您的应用现在使用(A^B)%P
加密了Server's Public Key
的答案。服务器将使用其私钥对其进行解密,对其进行验证,然后将发布一个带有到期时间的令牌(可能是jwt)。然后,您的应用程序和服务器可以使用该令牌进行通信。应用启动时,您可以执行一次计算,并存储令牌以备将来使用。
答案 3 :(得分:0)
我建议在app中创建一个复杂的令牌,由时间戳+ appId +可以在服务器上复制的任何其他值组成,并使用这些值在每个请求的标头中进行身份验证。
例如,您可以创建一个虚拟"用户"在您的数据库中并在其中存储deviceToken并将其用于您的算法。
我个人公开一个API请求,即时间戳getter,它返回300秒内要使用的服务器的时间戳。
所以在每个请求之前,获取时间戳,并发送您创建的令牌,在服务器上复制它,从而验证请求。
平庸的黑客可以对应用程序进行逆向工程并复制您的令牌