我不知道這個答案的精確程度,但仍張貼,因爲我想從Android的愛好者
一些響應考慮到C代碼是很難反編譯,我寫(的.so)使用一個簡單的本地C庫Android NDK包含一個算法來生成密碼。該算法僅在應用程序由我的證書籤名時纔會執行。如果有人在任何其他應用程序中重新使用此庫,則不會返回密碼,因爲證書不匹配。我有這個想法,從這個帖子: 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);
}
如果您看到用戶爲攻擊者,你不能相信在客戶端上的任何東西。就那麼簡單。你可以在這個問題上投入大量的混淆,然後希望沒人會打擾它。 – CodesInChaos 2012-08-14 20:42:48
爲什麼沒有服務器交互?除非你真的有充分的理由不這樣做,否則你應該使用服務器來存儲我認爲的密鑰。 – Entreco 2012-08-14 21:08:29