我已经从Android Studio(Java)开发了一个包含Admob(Google)Ads的android应用程序。
我担心的是,下载我的应用程序的任何用户都可以通过使用Lucky Patcher等mod轻松地禁用所有广告,或者通过使用ShowJava之类的应用程序打开它来编辑我的APK。
如何通过更改内容(例如删除广告)来识别我们的应用是否被篡改或非法使用?
答案 0 :(得分:1)
如何通过更改内容(例如删除广告)来识别我们的应用是否被篡改或非法使用?
是的,它存在并且被称为“移动应用证明”,并且仅适用于与您控制下的API服务器进行通信的移动应用。
在继续之前,我想澄清 WHO 和访问的内容之间的区别。
WHO 是移动应用程序的用户,您可以通过多种方式(例如使用OpenID或OAUTH2流)进行身份验证,授权和标识。
现在,您需要一种方法来识别正在调用API服务器的什么,这比大多数开发人员想象的要棘手得多。 什么是向API服务器发出请求的东西,是真的是您真正的移动应用程序,还是机器人,自动脚本或攻击者使用诸如Postman之类的工具手动在您的API服务器上乱逛?
可以识别什么的开发人员倾向于使用API密钥,这些密钥通常会在其移动应用程序的代码中进行硬编码,有些则花了很多功夫并在运行时计算移动应用程序因此成为动态的秘密,与以前的方法相反,后者是嵌入代码中的静态秘密。
使用移动应用证明解决方案将使API服务器能够知道什么正在发送请求,从而仅响应来自真实移动应用的请求,而拒绝来自不安全应用的所有其他请求来源。
我担心的是,下载我的应用程序的任何用户都可以通过使用Lucky Patcher等mod轻松地禁用所有广告,或者通过使用ShowJava之类的应用程序打开它来编辑我的APK。
移动应用程序证明服务的作用是在运行时通过在后台运行将与云中运行的服务进行通信的SDK来确保您的移动应用程序未被篡改或未在有根设备中运行证明移动应用程序和设备正在运行的完整性。在这里,您将获得针对LuckyPatcher和ShowJava应用程序的保护,一旦它们篡改了您的原始apk,则该应用程序将不再通过云服务的完整性检查,从而使您的API服务器可以拒绝来自被篡改的移动应用程序的请求
在成功证明移动应用程序完整性之后,将发布并使用一个秘密的短期生存JWT令牌进行签名,该秘密只有云中的API服务器和移动应用程序证明服务可以识别。如果移动应用程序证明失败,则会使用API服务器不知道的秘密对JWT令牌进行签名。
现在,应用程序必须随每个API一起发送,并在请求的标头中调用JWT令牌。这将允许API服务器仅在可以验证JWT令牌中的签名和到期时间时才处理请求,而在验证失败时拒绝它们。
一旦移动应用程序不知道移动应用程序证明服务使用的机密,即使在应用程序被篡改,在有根设备上运行或通过连接进行通信时,也无法在运行时对其进行反向工程成为中间攻击中一名男子的目标。
因此,该解决方案可在没有误报的积极检测模型中工作,因此不会阻止合法用户,同时又阻止了坏人。
移动应用程序认证服务已经作为Approov上的SAAS解决方案存在(我在这里工作),该服务提供了多个平台的SDK,包括iOS,Android,React Native等。集成还需要在API服务器代码中进行少量检查,以验证由云服务发出的JWT令牌。对于API服务器来说,必须进行此检查才能决定要处理的请求和拒绝的请求。