원래는 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) 이 값을 서버로 부터 올바른 인증서 해쉬값을 받아서 비교하면 됨.
debug 인증서 해쉬값은 우측에 Gradle 부분에서 siningReport를 실행하면
하단부에 이렇게 인증서에 대한 해쉬값이 나오는데
위 코드 실행하면 아래와 같이 나옴
참고로 내가 쓰는 핸폰이 Oreo 8.1(API Lv27)이라 27에 맞게 작업함. 28부터는 위 코드가 안먹히고 다른걸로 바뀌었더군.
답글 남기기