我有一个本地的Android库(.so),我正在将其与某些应用程序捆绑在一起。在本地代码中,我想要验证调用应用程序的签名者/包名称。
原因是,目前任何人都可以打开.apk文件,获取我的.so文件并用它来构建自己的应用程序。
是否有一种安全的方式从Java端识别调用应用程序?这可以是包名称、签名或任何其他可以唯一识别Android应用程序的东西。
我有一个本地的Android库(.so),我正在将其与某些应用程序捆绑在一起。在本地代码中,我想要验证调用应用程序的签名者/包名称。
原因是,目前任何人都可以打开.apk文件,获取我的.so文件并用它来构建自己的应用程序。
是否有一种安全的方式从Java端识别调用应用程序?这可以是包名称、签名或任何其他可以唯一识别Android应用程序的东西。
JNI代码与Java包名称耦合,只能从同一包和类中调用。为了进一步提高安全性,您可以从JNI代码中检查一些Java private static final
字段。
#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;
}