안드로이드를 보면 'Apk Signing' 이라는 말이 많이 나옵니다.
그리고 누구나 마켓에 앱을 올리기 위해 앱을 사이닝 합니다.
하지만 플랫폼이 어떤식으로 검증하는지는
실제로 잘 모르는 분들이 많습니다. 저 또한 안드로이드 보안 한다면서
대강만 알고 있었기에 이번에 제대로 정리합니다.
Apk Signing 을 하면 META-INF 폴더안에 3가지 파일이 생기는데,
CERT.RSA, CERT.SF, MANIFEST.MF 파일입니다.
먼저 MANIFEST.MF 파일을 보면 다음과 같은 구조로 되어있습니다.
Manifest-Version: 1.0
Created-By: 1.0 (Android SignApk)
Name: res/drawable-hdpi-v4/a.png
SHA1-Digest: 9N951JbaBqMwJu6neE80ZxknAaA=
Name: res/drawable-hdpi-v4/b.png
SHA1-Digest: aKuzkBMBNNlmgMu9Kfcl7CVk2Ec=
아시다시피 각 파일에 대한 해시값이 계산되어 기록되어있습니다.
CERT.SF 파일은 다음과 같은 구조로 되어있습니다.
Signature-Version: 1.0
Created-By: 1.0 (Android SignApk)
SHA1-Digest-Manifest: 7xpSMheWj+9cc+YiEZUoa52CaZc=
Name: res/drawable-hdpi-v4/a.png
SHA1-Digest: 5tNwzpVMTwTTh82YDhYYPnI7Ljc=
Name: res/drawable-hdpi-v4/b.png
SHA1-Digest: 5l/YxPScJe4eaks0aiKJHIwKrK4=
가장 윗 부분에는 MANIFEST.MF 에 대한 해시값이,
나머지는 MANIFEST.MF 에 기록되어있는 Name, SHA 값, \r\n 값까지 포함해서 3줄을
해시한 값입니다.
CERT.RSA 에는 공개키와 주체 등이 적혀있고
동일한 앱 이름인데 다른 사이닝 키를 사용하면 충돌합니다.
여기까지는 대부분 아시는 부분입니다.
그런데 위 내용만 안다면 다음과 같은 의문이 생기게 됩니다.
해커가 hack.png 파일을 해시해서 MANIFEST.MF 와 CERT.SF 에 각각 계산해 넣고,
CERT.RSA를 그대로 둔다면....
네. 당연히 막히는데 이유는 다음과 같습니다.
CERT.SF 를 키스토어 개인키로 암호화 한 시그니쳐가 CERT.RSA에 기록되기 때문입니다.
그래서 안드로이드 플랫폼에서는 공개키로 CERT.RSA에 기록된 시그니쳐를 복호화 하고,
실제 CERT.SF 와 비교하는 방식으로 앱 검증을 하게 됩니다.
이런 내용이 상세히 기록되어있는 블로그는 거의 없고..
그냥 앱을 사이닝해서 검증한다는식으로 얼버무리거나
'CERT.SF 내부의 암호화된 값들을 공개키를 이용하여 복호화 하고'
같은 말도안되는 정보가 많아서 기록으로 남깁니다.