마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

릴리즈 해시키 출력 로그

0 추천

안녕하세요 

APK 변조방지를 위해서

키사인된 해시키 대응 방법을 적용하려고 합니다.

 

 

private void getHashKey(){
    PackageInfo packageInfo = null;
    try {
        packageInfo = getPackageManager().getPackageInfo(getPackageName(), PackageManager.GET_SIGNATURES);
    } catch (PackageManager.NameNotFoundException e) {
        e.printStackTrace();
    }
    Log.e("KeyHash", ""+ packageInfo);
    if (packageInfo == null)
        Log.e("KeyHash", "KeyHash:null");



    AlertDialog.Builder alertDialogBuilderExit = new AlertDialog.Builder(this);
    for (Signature signature : packageInfo.signatures) {
        try {

            MessageDigest md = MessageDigest.getInstance("SHA");
            md.update(signature.toByteArray());
            Log.d("KeyHash",md.digest() + "");
            Log.d("KeyHash", Base64.encodeToString(md.digest(), Base64.DEFAULT));
            alertDialogBuilderExit.setMessage(Base64.encodeToString(md.digest(),Base64.NO_WRAP)).setCancelable(false)
                    .setPositiveButton("종료", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialogInterface, int i) {
                            MainActivity.this.finish();
                        }
                    });

        } catch (NoSuchAlgorithmException e) {
            Log.e("KeyHash", "Unable to get MessageDigest. signature=" + signature, e);
            Toast.makeText(getApplicationContext(),"Unable to get MessageDigest. signature=" + signature,Toast.LENGTH_LONG).show();
        }
    }



    AlertDialog dialog = alertDialogBuilderExit.create();
    dialog.show();
}

 

해당 메소드를 이용하고 릴리즈용 해시키로 APK 파일을 만들고 alert 하였는데 계속 

디버그용  해시키가 출력됩니다.

 

릴리즈용 해시키를 출력하는 방법이 있을까요?

치킨무한 (180 포인트) 님이 2020년 11월 18일 질문
그냥 제 생각인데, 해킹하는 사람들이 맘먹으면 APK 리버스 엔지니어링은 막을 수가 없다고 봅니다. API 변조는 application id 만 바꾸어도 금방 피해갈 수 있을 것 같은데요. 차라리  proguard 같은 상용 툴을 사용해서 리버스엔지니어링을 최대한 어렵게 만드시거나 앱이 시작할 때 백그라운드로 서버랑 통신해서 유효성 검사를 하는 편이 더 현실적인 대안같은 생각이 드는데, 저만 그런가요.
댓글 감사합니다.
네 유효성 검사를 앱시작단계에서 서버에서 해시 키값을 가져오고

액티비티에서도 해시키값을 생성하고 유효성 검사할 계획인데

google console 에 앱서명키 SHA1의 hash키값과

위 소스 release버전 hash키값이 달라서 도저히 모르겠네요
님이 하시려는 건 APK 변조라기 보다는 모바일앱 보안을 강화하기 위해  SSL외에 추가적인 방법으로 서버에서 인증한 모발앱만 통신이 가능하게 하시려는 것 처럼 보이네요. 제 말이 맞다면, 사용자 최초 로그인시에 별도의 인증서를 가지고 클라이언트 인증서를 생성하세요. 그리고 다음부터는 클라이언트 인증서의 fingerprint 값을 헤더에 넣어 보내고 서버에서는 추가적으로 이걸 체크하시면 어떨지. 실제 사용했던 방법이기도 하구요.

1개의 답변

0 추천
그냥 빌드하면 당연히 개발버전으로 실행되므로 디버그 해시키가 나오는거구요.

Build > Generate Signed Bundle or APK > release 선택후 v1, v2 체크 해서 > Finish 해서 성공하면

해당 경로에 가서 apk를 설치하고 그 설치한 apk의 로그를 봐서 나온 hashkey를 사용하셔야죠!

 

설마 그렇게 하셨나요???
쭈쭈총각 (17,750 포인트) 님이 2020년 12월 10일 답변
당연히 빌드용 해시키는 ketstore.debug의 해시키가 출력되는게 맞는거구요...

릴리즈용apk파일에서 개발용jks 해시키가 출력되어서 질문드렸던겁니다..
그럼 툴의 문제라고 볼 수밖에 없는데요. 안드로이드 스튜디오 버전 이슈 리포트를 확인해서 유사한 이슈가 있는지 확인해 보셔야할 것 같아요.
...