APK변조 대비 인증서 값 가져오기

원래는 Keytool로 예전에 만들었던 인증서 파일 내용 좀 확인할려고 시작한게 어떻게 하다 보니 APK 변조 대비해서 인증서값 가져다 확인하는걸 만들었길래 여기 정리해둠 -_-;;;

안드로이드에서 앱 실행시 APK에 서명된 인증서 값을 가져올수 있는데 이걸로 현재 앱이 변조된건지 아닌지 판별하면 될듯 싶다.

class MainActivity : AppCompatActivity() {
    private val digits = "0123456789ABCDEF"
    fun toHexString(byteArray: ByteArray): String {
        val buf = StringBuilder(byteArray.size * 2)
        for (i in byteArray.indices) {
            val v = byteArray[i].toInt() and 0xff
            buf.append(digits[v shr 4])
            buf.append(digits[v and 0xf])
            buf.append(":")
        }
        return buf.toString()
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val context =  this.applicationContext
        val packageInfo = context.packageManager.getPackageInfo(
            context.packageName,PackageManager.GET_SIGNATURES)

        try{
            if(packageInfo.signatures!= null){
                val result = packageInfo.signatures;
                val msgDigest = MessageDigest.getInstance("SHA256")
                msgDigest.update(result[0].toByteArray())
                val cert = msgDigest.digest()

                textView_Log.text = "Cert(SHA256): "+toHexString(cert)
            }

        }catch (e: Exception ){       }
    }

}

toHexString 함수는 https://pyxispub.uzuki.live/?p=1176 여기를 참고함.

result 변수에 byteArray로 인증서 값이 들어오는데 이걸 SHA256으로 해쉬한뒤 (변수 cert) 이 값을 서버로 부터 올바른 인증서 해쉬값을 받아서 비교하면 됨.

signingReport

debug 인증서 해쉬값은 우측에 Gradle 부분에서 siningReport를 실행하면

인증서의 MD5 SHA1 SHA256값 표시

하단부에 이렇게 인증서에 대한 해쉬값이 나오는데

위 코드 실행하면 아래와 같이 나옴

인증서 SHA256값 표시

참고로 내가 쓰는 핸폰이 Oreo 8.1(API Lv27)이라 27에 맞게 작업함. 28부터는 위 코드가 안먹히고 다른걸로 바뀌었더군.

크리에이티브 커먼즈 라이선스Linsoo의 저작물인 이 저작물은(는)크리에이티브 커먼즈 저작자표시-동일조건변경허락 4.0 국제 라이선스에 따라 이용할 수 있습니다.

댓글 남기기

이메일은 공개되지 않습니다.

This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

This site uses Akismet to reduce spam. Learn how your comment data is processed.