この回答がどれほど正確かはわかりませんが、Androidオタクからの回答が欲しいので投稿しています
C コードは逆コンパイルが難しいことを考慮して、パスワードを生成するアルゴリズムを含む Android NDK を使用して単純なネイティブ C ライブラリ (.so) を作成しました。このアルゴリズムは、アプリが証明書によって署名されている場合にのみ実行されます。誰かが他のアプリでこのライブラリを再利用すると、証明書が一致しないため、パスワードが返されません。この投稿からこのアイデアを得ました:
http://digital-identity.dk/2010/12/protecting-ip-in-android-applications/
これは私が証明書を取得する方法です:
void Java_dk_digitalidetity_android_SomeClass_SomeMethod(JNIEnv* env, jobject obj) {
// this.getPackageManager()
jclass cls = (*env)->GetObjectClass(env, obj);
jmethodID mid = (*env)->GetMethodID(env, cls, "getPackageManager", "()Landroid/content/pm/PackageManager;");
jobject packageManager = (*env)->CallObjectMethod(env, obj, mid);
// this.getPackageName()
mid = (*env)->GetMethodID(env, cls, "getPackageName", "()Ljava/lang/String;");
jstring packageName = (jstring) (*env)->CallObjectMethod(env, obj, mid);
// packageManager->getPackageInfo(packageName, GET_SIGNATURES);
cls = (*env)->GetObjectClass(env, packageManager);
mid = (*env)->GetMethodID(env, cls, "getPackageInfo", "(Ljava/lang/String;I)Landroid/content/pm/PackageInfo;");
jint flags = GET_SIGNATURES;
jobject packageInfo = (*env)->CallObjectMethod(env, packageManager, mid, packageName, flags);
// packageInfo->signatures
cls = (*env)->GetObjectClass(env, packageInfo);
jfieldID fid = (*env)->GetFieldID(env, cls, "signatures", "[Landroid/content/pm/Signature;");
jobject signatures = (*env)->GetObjectField(env, packageInfo, fid);
// signatures[0]
jobject signature = (*env)->GetObjectArrayElement(env, signatures, 0);
// signature->toByteArray()
cls = (*env)->GetObjectClass(env, signature);
mid = (*env)->GetMethodID(env, cls, "toByteArray", "()[B");
jbytearray certificate = (*env)->CallObjectMethod(env, signature, mid);
}