【问题标题】:Identify Calling Application in Android NDK识别 Android NDK 中的调用应用程序
【发布时间】:2010-07-27 03:15:11
【问题描述】:

我有一个原生 android 库 (.so) 我正在捆绑一些应用程序。在本机代码中,我想验证调用应用程序的签名者/包名称。

原因是,目前任何人都可以打开 .apk 文件,获取我的 .so 文件并使用它来构建自己的应用程序。

有没有办法从 Java 端安全地识别调用应用程序?这可以是包名称、签名或任何其他可以以独特方式识别 Android 应用程序的内容。

【问题讨论】:

    标签: android authentication android-ndk


    【解决方案1】:

    JNI 代码与 Java 包名相结合,只能从同一个包和类中调用。为了进一步提高安全性,您可以检查 JNI 代码中的一些 Java private static final 字段。

    【讨论】:

    • 另一个应用程序可以使用相同的包和类名来调用函数。这并不难,他们只需要查看 .so 文件中的导出函数列表即可。但我想,私有静态最终字段可以增加额外的安全性。攻击者仍然可以通过反汇编我的应用程序来解决这个问题,但这是一个很长的问题。谢谢你的回答!
    • 攻击者总能削弱您的防御能力。最好的安全是法律辩护
    • 您可以使用应用程序安排一些花哨的加密呼叫和响应协议,但是您添加到 .so 的任何检查都可以通过修改 .so 来禁用。你可以让代码的重用变得非常困难,但你不能让它变得不可能。决定你愿意为此付出多少努力。
    【解决方案2】:

    在本机代码中,我想验证签名者/包名 调用应用程序。

    这个怎么样?

    #include <jni.h>
    #include <string>
    
    extern "C"
    JNIEXPORT jstring JNICALL
    Java_com_x_y_TestActivity_stringFromJNI(JNIEnv *env, jobject thiz)
    { 
        jclass jActivity_class = env->GetObjectClass(thiz);
        jmethodID jMethod_id_pn = env->GetMethodID(jActivity_class,"getPackageName","()Ljava/lang/String;");
        jstring package_name = (jstring) env->CallObjectMethod(thiz,jMethod_id_pn);
        return package_name;
    }
    

    【讨论】:

      猜你喜欢
      • 2013-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-23
      • 2020-11-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多