본문 바로가기

Android/정리 노트

[Android/안드로이드] 자바 코드로 hask key 가져오기(get hash key in runtime)

카카오, 페이스북, 네이버 등등 로그인 API나 다른 여러 API를 쓸 때 해당 서비스를 사용하려면 앱에 signing한 keystore의 Hash key를 등록해야 하는 경우가 있다.

 

보통 그런 플랫폼의 경우 입력창 근처의 도움말이나 개발가이드를 동해 Hash key를 알수있는 방법을 알려주고

 

(개인적인 경험으로는)과반수가 터미널의 Command line을 통한 방법을 알려준다.

 

그러나 자주 해보고 익숙한 사람이라면 터미널로도 문제없이 해시키를 찾아내어 등록하지만 Hash key를 처음 접한 사람은 keystore가 뭔지도 모르며 자잘한 실수로 이상한 key를 뽑아내어 난항을 겪기도 한다.

 

그래서 잘못된 값을 뽑아낼 일이 없는 가장 확실한 방법을 소개하고자 한다.

 

이 방법은 구글링을 조금만 해봐도 알 수 있는 방법이고 카카오 개발가이드 등등에서 알려주는 Runtime(실행중)에 hask key를 로그로 찍어서 보여준다.

 

 

터미널의 커맨드를 통해 알아내는 방법보다 이 방법을 추천하는 이유는

 

일단, Debug용과 Release용 모두 등록해야하는데 Debug용은 어찌어찌 커맨드로 알아내어 등록했지만 릴리즈에서 또다시 난항을 겪는 경우가 많고

 

매번 Release의 경우 keystore에 비밀번호나 alias등을 알고있어야하기 때문이다.

 

 

그럼 빠르게 적용해보자. 아래 있는 코드를 import와 method를 SplashActivity나 MainActiviy등 바로바로 보이는 Activity에 옮겨놓고

 

onCreate에 getHashKey();를 호출해준다.

 

 

import


 

 

 

import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.Signature;
import android.util.Base64;
import android.util.Log;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

 

method and call


 

 


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getHashKey();
}


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

for (Signature signature : packageInfo.signatures) {
try {
MessageDigest md = MessageDigest.getInstance("SHA");
md.update(signature.toByteArray());
Log.d("KeyHash", Base64.encodeToString(md.digest(), Base64.DEFAULT));
} catch (NoSuchAlgorithmException e) {
Log.e("KeyHash", "Unable to get MessageDigest. signature=" + signature, e);
}
}
}

 

 

 

이제 프로젝트를 실행하고 Logcat에서 KeyHash 태그로 뜨는 값을 확인하면 끝!