我参加聚会有点晚了,但我想我可以添加一些有用的见解。
有没有办法可以在服务器端验证应用程序的完整性(使用校验和或签名),以确保它没有被篡改。(例如没有在应用程序中植入木马然后重新分发)
为了您的应用程序和 API 服务器之间的最终安全,您应该使用移动应用程序完整性证明服务以及 SafetyNet 解决方案 OAUTH2 服务。同样重要的是使用证书固定来保护 API 服务器和移动应用程序之间的通信通道,如本系列关于移动 API 技术的文章中所述。
移动应用程序完整性证明服务的作用是通过使用集成在您的应用程序中的 SDK 和在云中运行的服务来保证您的应用程序在运行时没有被篡改或没有在有根设备中运行。
成功证明应用程序完整性后,将颁发 JWT 令牌并使用只有您的应用程序的 API 服务器和云中的移动应用程序完整性证明服务知道的秘密进行签名。
如果 App Integrity Attestation 失败,JWT 会使用 API 服务器不知道的秘密进行签名。
现在,应用程序必须在每个 API 调用中发送请求标头中的 JWT 令牌。这将允许 API 服务器仅在可以验证 JWT 令牌中的签名时服务请求,并在验证失败时拒绝它们。
一旦应用程序不知道移动应用程序完整性证明服务使用的秘密,即使应用程序被篡改、在有根设备中运行或通过作为中间人攻击的目标。这就是此类服务与 SafetyNet 解决方案相关的亮点所在。
您可以在 Approov 中找到这样的服务,该服务具有适用于包括 Android 在内的多个平台的 SDK。集成还需要对 API 服务器代码进行小检查,以验证 JWT 令牌,以保护自己免受欺诈性使用。
请记住,并非我的所有客户都通过 google play 下载该应用程序,其中一些使用 3rd 方市场或从其他地方下载 apk。
通过使用像Approov这样的移动 API 完整性证明服务,应用程序的安装位置无关紧要。
我有连接到我的服务器并进行在线交易(通过 Internet/USSD/SMS)的 android 应用程序(移动银行),我想确保这些客户端没有被篡改并且是我分发的原始客户端。
和
对于建议的解决方案:
它们是否可以在所有 3 个通信渠道(SMS/USSD/Internet)上实施,或者解决方案是否为一个/某些渠道专有?
因此,假设您的应用程序直接与第三方服务对话,那么我建议您将该责任委托给 API 服务器,这将防止代表您未经授权使用您的第三方服务,一旦它现在只提供来自移动设备的真实请求通过完整性挑战的应用程序。
安全网
SafetyNet Attestation API 可帮助您评估运行应用的 Android 环境的安全性和兼容性。您可以使用此 API 来分析已安装您的应用的设备。
OAUTH2
OAuth 2.0 授权框架使第三方应用程序能够通过编排资源所有者和 HTTP 服务之间的批准交互来代表资源所有者获得对 HTTP 服务的有限访问权限,或者通过允许第三方应用程序代表自己获得访问权。此规范替换并废弃了 RFC 5849 中描述的 OAuth 1.0 协议。
证书固定
固定是将主机与其预期的 X509 证书或公钥相关联的过程。一旦知道或看到主机的证书或公钥,证书或公钥就与主机相关联或“固定”到主机。如果可以接受多个证书或公钥,则程序会保存一个 pinset(取自 Jon Larimer 和 Kenny Root Google I/O talk)。在这种情况下,广告身份必须与 pinset 中的元素之一匹配。
智威汤逊令牌
基于令牌的身份验证
JSON Web 令牌是一种开放的行业标准 RFC 7519 方法,用于在两方之间安全地表示声明。
免责声明:我在 Approov 工作。