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부터는 위 코드가 안먹히고 다른걸로 바뀌었더군.


Comments

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다