Notice
Recent Posts
Recent Comments
Link
투케이2K
42. (AndroidStudio/android/java) (추가구현) 로컬, 구글 플레이스토어 등록된 인증서 해시 키 (hash key) 값 얻기 본문
Android
42. (AndroidStudio/android/java) (추가구현) 로컬, 구글 플레이스토어 등록된 인증서 해시 키 (hash key) 값 얻기
투케이2K 2021. 1. 29. 17:19/* =========================== */
[ 개발 환경 설정 ]
개발 툴 : AndroidStudio
개발 언어 : java
/* =========================== */
/* =========================== */
[소스 코드]
// ========= [키해시 값 알아오는 메소드] =========
public void getHashKeyData(Context context){
/**
* 1. 사용 이유 - 카카오, 구글 등 API 호출 시 hash key를 통해 인증된 사용자인지 여부를 판단합니다
* */
try {
//TODO === [로컬 sha1 인증서 HashKey 얻기] ===
String sha1_hash = "";
PackageInfo info_sha1 = context.getPackageManager().getPackageInfo(String.valueOf(getPackageName()), PackageManager.GET_SIGNATURES);
for (Signature signature : info_sha1.signatures) {
MessageDigest md = MessageDigest.getInstance("SHA");
md.update(signature.toByteArray());
sha1_hash = Base64.encodeToString(md.digest(), Base64.DEFAULT);
}
//TODO === [로컬 sha1 인증서 hex값 얻기] ===
String sha1_hex = "";
byte[] sha1_data_arr = Base64.decode(sha1_hash,0);
sha1_hex = String.valueOf(getByte_To_HexString(sha1_data_arr));
//TODO === [로컬 sha256 인증서 HashKey 얻기] ===
String sha256_hash = "";
PackageInfo info_sha256 = context.getPackageManager().getPackageInfo(String.valueOf(getPackageName()), PackageManager.GET_SIGNATURES);
for (Signature signature : info_sha256.signatures) {
MessageDigest md = MessageDigest.getInstance("SHA256");
md.update(signature.toByteArray());
sha256_hash = Base64.encodeToString(md.digest(), Base64.DEFAULT);
}
//TODO === [로컬 sha256 인증서 hex값 얻기] ===
String sha256_hex = "";
byte[] sha256_data_arr = Base64.decode(sha256_hash,0);
sha256_hex = String.valueOf(getByte_To_HexString(sha256_data_arr));
//TODO === [로컬 md5 인증서 HashKey 얻기] ===
String md5_hash = "";
PackageInfo info_md5 = context.getPackageManager().getPackageInfo(String.valueOf(getPackageName()), PackageManager.GET_SIGNATURES);
for (Signature signature : info_md5.signatures) {
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(signature.toByteArray());
md5_hash = Base64.encodeToString(md.digest(), Base64.DEFAULT);
}
//TODO === [로컬 md5 인증서 hex값 얻기] ===
String md5_hex = "";
byte[] md5_data_arr = Base64.decode(md5_hash,0);
md5_hex = String.valueOf(getByte_To_HexString(md5_data_arr));
//TODO === [구글 플레이 스토어 등록 sha1 인증서 HashKey 얻기] ===
byte[] sha1 = { (byte)0x1E, (byte)0xBE, (byte)0x45, (byte)0x66, (byte) 0x7A, (byte) 0x25, (byte) 0x8C, (byte) 0xFC, (byte) 0x9F, (byte) 0x44, (byte) 0xA4, (byte) 0x8F,
(byte)0xB7, (byte)0x37, (byte)0xE8, (byte)0x79, (byte)0x88, (byte)0xEC, (byte)0x16, (byte)0x8F, };
String store_hash = "";
store_hash = Base64.encodeToString(sha1, Base64.NO_WRAP);
//TODO === [구글 플레이 스토어 등록 sha1 인증서 hex값 얻기] ===
String store_hex = "";
byte[] store_data_arr = Base64.decode(store_hash,0);
store_hex = String.valueOf(getByte_To_HexString(store_data_arr));
//TODO === [추출한 HashKey 결과 출력 실시] ===
Log.d("---","---");
Log.d("//===========//","================================================");
Log.d("","\n"+"[getHashKeyData() 메소드 > HashKey 값 확인 실시]");
Log.d("","\n"+"[패키지 명 : "+String.valueOf(getPackageName())+"]");
Log.w("","\n"+"[로컬 sha1 [HashKey] : "+sha1_hash+"");
Log.w("","\n"+"[로컬 sha1 [Hex] : "+sha1_hex+"");
Log.w("","\n"+"[로컬 sha1 [Hex > HashKey] : "+getHex_To_HashKeyData(sha1_hex)+"");
Log.d("","\n"+"[로컬 sha256 [HashKey] : "+sha256_hash+"");
Log.d("","\n"+"[로컬 sha256 [Hex] : "+sha256_hex+"");
Log.d("","\n"+"[로컬 sha256 [Hex > HashKey] : "+getHex_To_HashKeyData(sha256_hex)+"");
Log.d("","\n"+"[로컬 md5 [HashKey] : "+md5_hash+"");
Log.d("","\n"+"[로컬 md5 [Hex] : "+md5_hex+"");
Log.d("","\n"+"[로컬 md5 [Hex > HashKey] : "+getHex_To_HashKeyData(md5_hex)+"");
Log.w("","\n"+"[플레이 스토어 등록 sha1 [HashKey] : "+store_hash+"");
Log.w("","\n"+"[플레이 스토어 등록 sha1 [Hex] : "+store_hex+"");
Log.w("","\n"+"[플레이 스토어 등록 sha1 [Hex > HashKey] : "+getHex_To_HashKeyData(store_hex)+"");
Log.d("//===========//","================================================");
Log.d("---","---");
}
catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
}
// ========= [HashKey 값을 바이트 값으로 변환 후 Hex값으로 출력 위함 ] =========
public static String getByte_To_HexString(byte buf[]) {
String Hex_Value = "";
for(int i=0; i<buf.length; i++) {
Hex_Value += String.format("%02X", buf[i]);
if(i < (buf.length-1)){
Hex_Value += ":";
}
}
return Hex_Value;
}
// ========= [인증서 값을 가지고 해시값으로 변환하는 메소드] =========
public String getHex_To_HashKeyData(String data){
try{
String parse = "";
parse = data;
parse = parse.replaceAll(":","");
parse = parse.replaceAll("0x", "");
parse = parse.replaceAll(" ", "");
byte arr[] = new byte[parse.length()/2];
int before = 0;
int after = 2;
for(int i=0; i<arr.length; i++) {
String value = parse.substring(before, after);
arr[i] = new java.math.BigInteger(value, 16).byteValue();
before += 2;
after += 2;
}
return String.valueOf(Base64.encodeToString(arr, Base64.NO_WRAP));
}
catch (Exception e){
e.printStackTrace();
}
return "";
}
/* =========================== */
/* =========================== */
[결과 출력]
/* =========================== */
반응형
'Android' 카테고리의 다른 글
Comments