可信应用程序的安全Rest API

3

我已经为我的Android应用程序创建了REST API。所有API都使用OAuth2(密码grant_type)进行保护。

用户提供用户名和密码,服务器验证凭据并发出访问令牌和刷新令牌,然后可用于调用API。

现在问题在于API是公开的,对所有人开放。如何验证只有从我的应用程序生成的调用会被接受。

情景: XYZ是我的应用程序的用户,也是一个非常优秀的开发者。他很好奇地想弄清楚我的应用程序和API如何交互。现在他也有点野心(我猜)并决定创建自己的Android应用程序(类似于我的应用程序)并使用我的REST API。我该如何保护我的API免受此类使用?

我查看了一些其他帖子,但没有找到任何有用的方法来保护我的API免受这种使用。


如果你的服务器已经按照所说实现了oauth2,那么任何应用程序都需要一个客户端ID和客户端密钥才能访问你的API。 - ashkhn
由于我不允许他人基于我的API创建应用程序,因此我的应用程序将具有客户端ID,并且该ID将用于验证应用程序。但是,如果有人将我的apk反编译为源代码,则可以发现该客户端ID。现在,如果有人发现了客户端ID,则可以创建一个执行与我的应用程序相同操作的应用程序。 - behinddwalls
无法使您的客户端不可破解,但您可以参考以下几种方法,使其更加困难:https://dev59.com/AWUq5IYBdhLWcg3wV_Ii - ashkhn
1个回答

2
你试图做的事情从工程角度来看是不可能的。你可以使用各种工具来混淆存储在应用程序中的秘密(例如ProGuard),但最终,无论你使用什么机制来混淆你的秘密,它们都必须对使用它们的设备可访问。你还可以采取其他措施,增加反向工程应用程序所需的时间,例如经常更改你的 API 以方式,这些方式可能会破坏反向工程客户端,或者推送强制更新以更改秘密和用于混淆这些秘密的机制。
然而,无论你做什么,只要有足够动力的用户,就能获取你在应用程序中分发的任何秘密。
“从法律上讲,你有更多的选择。通过使用适当的最终用户许可协议(EULA),你可能能够使未经授权的应用程序无法合法地访问你的API;参见Blizzard v BnetD。如果你拥有你的服务所提供数据的版权,你可能能够防止第三方在未经你的许可下将其复制到其他地方,或者向他们收取费用。还有可能有其他的法律选择;你需要咨询一位律师。”
“但是为什么要麻烦呢?在开始这条路之前,也许你应该问问自己,为什么要防止其他应用程序首先访问你的API。如果用户发现你的服务有价值,但对你提供的客户端不满意,以至于他们愿意安装第三方应用程序来访问你的服务,也许你应该专注于改进你自己的客户端,而不是强迫你的用户使用他们明显不喜欢的客户端。”

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接