任何只在手机端运行的安全检查,都能在手机端被修补绕过。针对这一困境,Codename One App Shield 将最终裁决权移回你的服务器:它为受保护的请求附加一个短期、经服务器验证的证明令牌。

首先简单介绍一下 Codename One。它是一个开源框架,可以用一份 Java 或 Kotlin 代码库构建原生 iOS、Android、桌面和 Web 应用。更多信息可访问 codenameone.com。

打开网易新闻 查看精彩图片

本周的开发进展有些缓慢,因为我的家人把我拖来泰国度假。那里风光不错,但海滩、阳光和大海并不是我的最爱。再加上 GitHub Actions 的宕机,这周进度比平时慢。几个有趣的 PR 仍在进行中,我们决定不仓促处理。

Codename One App Shield 是一个企业级应用证明层。它向 Apple App Attest 或 Google Play Integrity 请求硬件背书声明,通过 Codename One 服务验证该声明,然后向应用发放一个短期的 ES256 令牌。你的后端在敏感操作执行前先验证这个令牌。

我们已经在服务多家银行客户,高安全需求多年来一直塑造着 Codename One 的发展方向。Java 恰好契合这些需求:这些团队可以获得成熟的分析工具、熟悉的类型系统,以及一套可审查的应用代码库,而不是分别审查 iOS 和 Android 两套实现。

但 Java 本身并不是安全边界。构建流水线确实给攻击者增加了阻力,但决心坚定的攻击者仍然可以逆向工程他们控制下的客户端。

最后一点正是关键。一个被篡改的应用可以强制本地 isDeviceCompromised() 调用返回 false,但它无法铸造一个由服务器信任的密钥签名的有效令牌。

App Shield 将平台证明提供方、Codename One 验证服务和你的后端串联起来:nonce 防止被捕获的平台声明变成永久重放凭证。令牌标识预期的包名和平台,携带证明结果并短暂过期,后端以此确认请求来自可信应用。

总之,把你的安全决策放到服务器端,而不是完全信任被攻击者控制的手机。App Shield 就是为此而生的。