투케이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 "";
	}

/* =========================== */

/* =========================== */

[결과 출력]

/* =========================== */

반응형
Comments