[Android] 키해시(key hash) 추출하기

유재민·2022년 9월 3일
0
post-thumbnail
post-custom-banner

키해시의 종류는 디버그용, 릴리즈용, 구글 플레이용으로 총 3가지이다. debug key hash는 주로 앱 개발을 할 때 디버그용으로 사용되는 키해시이다. release key hash는 앱 개발을 완료 후 apk 파일을 추출했을 때 사용되는 키해시이다. 이때, debug apk, release apk 관계없이 모두 release key hash를 사용해야한다. debug apk 파일을 뽑았는데 debug key hash만 넣으면 되는 줄 알고 고생했던 기억이 있다. 마지막으로 google play app signing key hash는 플레이 스토어에서 등록된 앱에 사용되는 키해시이다. 키해시가 다양하고 어느 경우에 어떤 키해시를 사용해야되는지 몰랐어서 답답했던 적이 있다. 이번 정리를 통해 완벽하게 학습하려 한다.

이러한 key hash를 추출하는 방법을 총 2가지가 있다.

  1. 터미널 이용
  2. 코드 이용

먼저 터미널을 이용하는 방법을 알아보겠다.


💻 터미널 이용

1. OpenSSL 설치

  • 이 사이트에서 OpenSSL을 다운로드한다.
  • 압축을 원하는 폴더에 해제한다. (추후 경로를 가져와야하기 때문에 편의상 C드라이브에 넣어주었다.)

mac은 homebrew로 간단하게 설치가 가능하다.

2. 환경 변수 설정

  1. 시스템 속성의 환경 변수로 들어간다.

  1. 시스템 변수의 Path에서 편집 버튼을 누른다.

  1. 아까 설치했던 OpenSSL의 bin 폴더의 경로를 추가해준다.
    • ex) C:\OpenSSL\bin
  2. 확인을 누른다.

❗ 만약 터미널(cmd)창이 켜져있었다면 종료 후 다시 실행해야 저장한 환경변수가 다시 설정된다.

3-1. debug key hash 추출

  • 명령 프롬프트(cmd) 창을 실행한다.
  • keytool -exportcert -alias androiddebugkey -keystore {path} -storepass android -keypass android | openssl sha1 -binary | openssl base64 ← 명령어 입력
  • {path} : debug.keystore 가 있는 경로를 path에 넣어준다.
    • ex) window: C:\Users\{계정이름}\.android\debug.keystore
    • ex) mac: /Users/{계정이름}/.android/debug.keystore
    • debug.keystore 는 자동으로 생성되는 keystore로 .android 폴더에 존재한다.
  • debug key hash는 컴퓨터마다 hash 값이 달라진다. 그러므로, 여러 대의 컴퓨터에서 같은 프로젝트를 테스트하는 경우 모든 컴퓨터의 key hash 를 추출해야한다.

3-2. release key hash 추출

  • keytool -exportcert -alias {key_alias} -keystore {keystore_path} | openssl sha1 -binary | openssl base64 ← 명령어 입력
    • release key hash는 keystore가 필요하다. 그리고, 키스토어의 정보를 입력해 주어야 한다.
    • {key_alias} : key 별칭 (Key - Alias 부분)
    • {keystore_path} : keystore 경로
    • (참고로 중괄호는 입력해야하는 변수를 구분하기 위해 만든거임)

The operation couldn’t be completed. Unable to locate a Java Runtime.
위와 같은 오류가 뜨는 경우 java sdk 설치가 필요하다.

terminal> brew install openjdk@8
terminal> sudo ln -sfn $(brew --prefix)/opt/openjdk@8/libexec/openjdk.jdk /Library/Java/JavaVirtualMachines/openjdk-8.jdk

🚗 코드 이용

debug key hash 추출

fun getKeyHash() {
	if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
    	val packageInfo = requireContext().packageManager.getPackageInfo(requireContext().packageName, PackageManager.GET_SIGNING_CERTIFICATES)
            for (signature in packageInfo.signingInfo.apkContentsSigners) {
                try {
                    val md = MessageDigest.getInstance("SHA")
                    md.update(signature.toByteArray())
                    Log.d("getKeyHash", "key hash: ${Base64.encodeToString(md.digest(), Base64.NO_WRAP)}")
                } catch (e: NoSuchAlgorithmException) {
                    Log.w("getKeyHash", "Unable to get MessageDigest. signature=$signature", e)
                }
            }
        }
    }

release key hash를 코드로 추출하진 못한다. 😥


📱 Google play app signing key hash 추출

  1. Google Play Console 접속
  2. key hash 추출할 앱 클릭
  3. 출시 → 설정 → 앱 무결성

  1. 앱 서명 → SHA-1 인증서 지문 복사

  1. 함수로 key hash 뽑아내기
fun getKeyHash(sha1: String) {
    val sha1Arr = sha1.split(':')
    var byteArr =byteArrayOf()
    for (hex in sha1Arr) {
        byteArr += Integer.parseInt(hex, 16).toByte()
    }

    Log.d("getKeyHash", "key hash: ${Base64.encodeToString(byteArr, Base64.NO_WRAP)}")
}
getKeyHash("EA:2A:...")

여러 종류의 key hash를 추출하는 여러 방식들을 알아보았다. 잘못된 key hash를 추가하는 경우 API 정보를 제대로 가져올 수 없어 어느 부분에서 오류가 났는지 찾기가 힘들다. 그렇기 때문에, 올바른 key hash를 넣는 것은 매우 중요하다. 이 글이 도움이 됐으면 좋겠다.😊


[Android] SNS 로그인 키해시(key hash) 추출

profile
유잼코딩
post-custom-banner

0개의 댓글