기본 콘텐츠로 건너뛰기

2025년 9월 카카오 사태 프로필 미공개

2025년 9월 23일 카카오 사태가 벌어졌다.   나는 다행히 앱스토어 설정에 들어가서 자동업데이트를 비활성해서 이번 사태를 잠깐 피해갈 수 있었다.   하지만 유튜브를 보다보니까   이번에 업데이트를 이미 한 사람들에게 나의 프로필이 까발려 진다는 것을 알게되었다.   내 친구한테 알려지는 건 좋은데   카카오톡은 내가 전혀 모르는 사람이나 싫은 사람, 업무적인 사람들 연락처에 있는 모든 사람이나 전화 번호가 변경되서 모르는 사람들도 친구 목록에 표시가 된다.   그런 모든 사람들에게 내 사생활을 강제로 공개되도록 해버렸다는 거에 공포를 느꼈다.   프로필 탭으로 이동해서   내 프로필에서 오른쪽 상단에 설정 버튼이 있고 그걸 클릭하면   프로필 설정들이 있고 거기서 옵션들을 비활성 해주자   “프로필 인증배지 표시”, “내 프로필 검색”, “내 홈 표시” 모두 비활성 해줬다.   솔직히 앞으로 이번 사태 이전으로 롤백을 시키지 않는한 앞으로 프로필에 사진을 올릴거 같지 않다.   이미 앱은 배포가 되었고   이 사태가 벌어진 버전의 앱을 업데이트 하지 않고 사용하는 사람들이 많을것이다.   (보통은 앱을 배포 하고 강제로 업데이트 유도하지 않는 이상 앱을 업데이트 하지 않는 사람들이 많다.) 만약에 더 프로필 공개에 공포를 느낀다면 프로필에 올린 이미지들을 당장 지우자.   *추가* 숏폼과 오픈채팅을 합쳐놓은 것도 참 거지같은 짓을 한거라고 생각한다.   오픈채팅에 개발이나 다이어트나 여러가지 같은 관심을 가진 사람들이 단체 톡방에 들어가서 커뮤니티를 하고 계실거다.   나도 개발 단체톡방에 들어가서 대화를 하는데   왜 그걸 합쳐놔서   오픈채팅을 들어가기 위해서 무조건 숏폼을 강제로 봐야 한다는 건 참 별로다.   *추가 2* 벌서 온갖 야시시 하고 폭력적인 숏폼에 노출되고 있...

Android NDK 에서 앱 Signaiture 가져오는 코드

Android NDK 에서 앱 Signaiture 를 가져와서 
함수 내에서 비교를 하고 
그 결과를 반환하는 소스 

C 기반으로 만들었습니다. C++ 로 하실려면 수정 필요합니다.
참조 사이트 링크 : http://dev.re.kr/m/post/72 




int getSignaiture(JNIEnv *env, jobject context) {

    jclass contextClass =  (*env)->GetObjectClass(env, context);
    jmethodID getPackageNameMid = (*env)->GetMethodID(env, contextClass, "getPackageName", "()Ljava/lang/String;");
    jmethodID getPackageManager =  (*env)->GetMethodID(env, contextClass, "getPackageManager", "()Landroid/content/pm/PackageManager;");

    jclass packageManagerClass = (*env)->FindClass(env,"android/content/pm/PackageManager");
    jmethodID getPackageInfo = (*env)->GetMethodID(env, packageManagerClass, "getPackageInfo", "(Ljava/lang/String;I)Landroid/content/pm/PackageInfo;");

    jclass packageInfoClass = (*env)->FindClass(env,"android/content/pm/PackageInfo");
    jfieldID signaturesFid = (*env)->GetFieldID(env, packageInfoClass, "signatures", "[Landroid/content/pm/Signature;");

    jclass signatureClass = (*env)->FindClass(env, "android/content/pm/Signature");
    jmethodID signatureToByteArrayMid = (*env)->GetMethodID(env, signatureClass, "toByteArray", "()[B");

    jclass messageDigestClass = (*env)->FindClass(env, "java/security/MessageDigest");
    jmethodID messageDigestUpdateMid = (*env)->GetMethodID(env, messageDigestClass, "update", "([B)V");
    jmethodID getMessageDigestInstanceMid  = (*env)->GetStaticMethodID(env, messageDigestClass, "getInstance", "(Ljava/lang/String;)Ljava/security/MessageDigest;");
    jmethodID digestMid = (*env)->GetMethodID(env, messageDigestClass,"digest", "()[B");

    jclass base64Class = (*env)->FindClass(env, "android/util/Base64");
    jmethodID encodeToStringMid = (*env)->GetStaticMethodID(env, base64Class,"encodeToString", "([BI)Ljava/lang/String;");

    jstring packageName =  (jstring)(*env)->CallObjectMethod(env, context, getPackageNameMid);

    jobject packageManagerObj = (*env)->CallObjectMethod(env, context, getPackageManager);
    // PackageManager.GET_SIGNATURES = 0x40    jobject packageInfoObj = (*env)->CallObjectMethod(env, packageManagerObj,getPackageInfo, packageName, 0x40);
    jobjectArray signatures = (jobjectArray)(*env)->GetObjectField(env, packageInfoObj, signaturesFid);
    //int signatureLength =  env->GetArrayLength(signatures);    jobject signatureObj = (*env)->GetObjectArrayElement(env,signatures, 0);
    jobject messageDigestObj  = (*env)->CallStaticObjectMethod(env, messageDigestClass, getMessageDigestInstanceMid, (*env)->NewStringUTF(env, "SHA"));
    (*env)->CallVoidMethod(env, messageDigestObj, messageDigestUpdateMid, (*env)->CallObjectMethod(env, signatureObj,signatureToByteArrayMid));

    // Base64.DEFAULT = 0 그렇기 때문에 맨 마지막 인자값은 0이다.    jstring signatureHash = (jstring)(*env)->CallStaticObjectMethod(env, base64Class, encodeToStringMid, (*env)->CallObjectMethod(env, messageDigestObj, digestMid, signatureObj), 0);

    (*env)->DeleteLocalRef( env, contextClass );
    (*env)->DeleteLocalRef( env, packageManagerClass );
    (*env)->DeleteLocalRef( env, packageInfoClass );
    (*env)->DeleteLocalRef( env, signatureClass );
    (*env)->DeleteLocalRef( env, messageDigestClass );
    (*env)->DeleteLocalRef( env, base64Class );
    (*env)->DeleteLocalRef( env, packageName );
    (*env)->DeleteLocalRef( env, packageManagerObj );
    (*env)->DeleteLocalRef( env, packageInfoObj );
    (*env)->DeleteLocalRef( env, signatures );
    (*env)->DeleteLocalRef( env, signatureObj );
    (*env)->DeleteLocalRef( env, messageDigestObj );

    char *signatureHash_char = (*env)->GetStringUTFChars(env, signatureHash, 0);

    // 중요 : 이렇게 char* 로 나오면 C 언어의 특성상 뒤에 줄넘김 문자가 자동으로 붙는대 아래 소스로 끝의 줄넘김 문자를 제거하자    fgets(signatureHash_char, strlen(signatureHash_char), stdin);
    signatureHash_char[strlen(signatureHash_char) - 1] = '\0';
    // 줄 넘김 문자 제거 완료
    //LOGD("NDK Sign : |%s|", signatureHash_char);
    (*env)->DeleteLocalRef( env, signatureHash );

    int result = strcmp(signatureHash_char, debug_signature);

    // 디버그 앱 키를 먼저확인    if(result == 0){
        return result;
    }

    // 운영 앱 키 확인    result = strcmp(signatureHash_char, release_signature);

    // strcmp 는 두 문자가 같으면 0 을 반환한다    return result;
}