我正在使用ndk和android studio来保护我的api-key,它现在可以工作。 我也在尝试肮脏的代码以加强拆卸能力。 但是我仍然可以反编译并在Java类中看到本机方法。 还可以在APK中预构建.so(共享库)文件,并且可以再次使用!
问题:
在发布apk之后,所有黑客都可以看到.so文件,他们可以使用.mk文件中的自定义设置,并可以编程特定的本机方法(例如我的类)来仅提取api-key。他们在不知道实现的情况下调用了与api-key相关的函数。我在这里消除东西吗?
答案 0 :(得分:1)
要澄清:将api键和身份验证过程放在本机方法中。例如,对于HTTPS api,请将uri,json内容,usertoken发送到本机方法。然后在本机代码中,使用这些和api键以及一些哈希函数来创建哈希。并将该哈希输出到要在HTTP请求中发送的Java代码。这样,仅通过监视条目和输出就很难猜出认证方法。攻击者将不得不反编译本机代码。
答案 1 :(得分:1)
是的,没有办法阻止 .so 被恶意代理重用。因此,您的本机API绝不应向Java端泄露机密信息。您可以在本机方法中执行一些验证,以检查调用Java是否确实属于合法APK。
另一方面,请不要低估本机代码的另一个漏洞:您的 .so 可以使用相关工具进行反汇编,并且任何保护措施都可能被破坏。存在对本机代码进行逆向工程的混淆和弹性的方法,但是与ProGuard相比,它们的收益曲线要陡得多。
仍然,至少不要在C ++代码中以纯文本形式保留api-key是值得的。尝试运行
strings libnative.so
(此处libnative.so是从您的APK中提取的.so文件),您可能会发现正在等待从库中窃取的重要信息,而无需进行复杂的逆向工程。
就ProGuard而言,它不会为您使用的本机方法添加保护。您甚至不能混淆本机方法的类名和方法名。 (可能,但是非常棘手,并且没有任何工具可以帮助您进行此类设置。)
答案 2 :(得分:0)
我们创建了gradle插件来隐藏Android NDK中的键,您可以在github上检查所有实现:https://github.com/klaxit/hidden-secrets-gradle-plugin
目标是使反向工程师键的难度尽可能大。我们鼓励添加自定义加密算法,然后将密钥作为十六进制数组存储在NDK中。
我们希望收到有关我们解决方案的反馈!