使用ndk在android中保护本机方法和api-key

时间:2018-07-06 11:42:31

标签: android encryption android-ndk java-native-interface

我正在使用ndk和android studio来保护我的api-key,它现在可以工作。 我也在尝试肮脏的代码以加强拆卸能力。 但是我仍然可以反编译并在Java类中看到本机方法。 还可以在APK中预构建.so(共享库)文件,并且可以再次使用!

问题:

  1. 在发布apk之后,所有黑客都可以看到.so文件,他们可以使用.mk文件中的自定义设置,并可以编程特定的本机方法(例如我的类)来仅提取api-key。他们在不知道实现的情况下调用了与api-key相关的函数。我在这里消除东西吗?

    1. 这样需要保镖吗?

3 个答案:

答案 0 :(得分:1)

  1. 您增加了黑客需要反编译和理解.so文件的时间。估算其难度,并不时更改api身份验证的工作方式。这样做会使以前的黑客尝试过时,即使它们已经成功。

要澄清:将api键身份验证过程放在本机方法中。例如,对于HTTPS api,请将uri,json内容,usertoken发送到本机方法。然后在本机代码中,使用这些和api键以及一些哈希函数来创建哈希。并将该哈希输出到要在HTTP请求中发送的Java代码。这样,仅通过监视条目和输出就很难猜出认证方法。攻击者将不得不反编译本机代码。

  1. 激活Proguard,进行编译,反编译并亲自查看。在我看来,它的设置确实提高了复杂性。

答案 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中。

我们希望收到有关我们解决方案的反馈!