반응형

1. Singing Key 확인

 - 앱을 플레이스토어에 올리기 위해서는 릴리즈 빌드를 해야하는데 이 때 Signing 을 하게 된다. 이것의 목적은 Signing에 사용된 공용키에 해당하는 개인키를 가진 사람만이 업데이트를 할 수 있도록 하기 위해서이다.

 - 따라서 무결성 체크를 위해서는 사이닝된 키가 개발자가 설정한 키와 동일한 키인지 런타임 시 Signing 인증서를 체크하여 위변조된 앱인지 아닌지 확인할 수 있다.

 - 아래는 간단히 앱에서 현재 Signing 된 인증서 정보를 가져오는 코드이다. 

( 출처 : http://dktfrmaster.blogspot.com/2017/02/apk.html )



public static void checkAppSignatureInServer(Context context, Callback callback) {
    try {
        @SuppressLint("PackageManagerGetSignatures")
        PackageInfo packageInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), PackageManager.GET_SIGNATURES);
        
        //안드로이드는 이론상 여러 키스토어로 Signing 가능하다고 하지만,
        //일반적으로는 하나의 키스토어로만 Signing을 하므로, signatures의 첫번째 값을 이용한다.
        Signature signature = packageInfo.signatures[0];
        final String currentSignature = obtainSignatureString(signature);
        fetchServer(currentSignature, callback);
    } catch (PackageManager.NameNotFoundException | NoSuchAlgorithmException e) {
        e.printStackTrace();
    }
}

private static void fetchServer(String signature, Callback callback) {
    //TODO::Fill in server logic
    callback.onFinishCheck(ValidationEnum.VALID);

2. 인스톨러 확인
- 모든 앱은 어떤 인스톨러를 이용하여 설치되었는지 알 수 있다. 이 때 인스톨러의 identifier를 체크하여 위변조된 앱인지 아닌지 알 수 있다.
- 각 인스톨러마다 identifier를 가지고 있는데 구글의 경우 com.android.vending이라는 identifier를 가지고 있다. 만약 adb로 인스톨했을 때에는 null로 출력된다. 따라서 identifier가 com.android.vending이 아니라면 플레이스토어에서 설치한 앱이 아니므로 앱을 종료시키면 된다.
- 아래는 간단히 앱의 인스톨러를 확인하는 코드이다.

public static boolean verifyGoogleInstaller(Context context) {
    final String installer = context.getPackageManager().getInstallerPackageName(context.getPackageName());
    return installer != null && installer.startsWith("com.android.vending");
}


참고) http://dktfrmaster.blogspot.com/2017/02/apk.html

반응형
블로그 이미지

rootable

,