-
APK Signature Scheme v2 는 verification speed 를 향상시키고, APK 의 일부가 변경되었는지 detecting 하는 것이 강화되어 보안에도 더 안전하다.
APK Signature Scheme v2 는 APK Signing Block 을 Zipping 하기 전에 APK 에 넣는다.
-
Jar signing(v1 scheme) 은 ZIP metadata 등의 일부 영역을 보호하지 못했다.
그리고 verify 를 위해서 모든 entry 를 압축해제해야 했으며, 이는 많은 시간과 메모리를 소모했다.
이 때문에 Android 7.0(NOS) 에서 APK signature scheme v2 가 나왔다.
v2 scheme 은 APK file 을 blob 으로 여기고 전체 file 에 대한 signature checking 을 수행한다.
APK 에 대한 어떠한 수정은(ZIP metadata 변환) APK signature 를 invalidate 시킨다.
-
APK Signature Scheme v2 는 Android 7.0 (Nougat) 에 등장했다.
Android 6.0 (MOS) 이하 단말에서 설치되게 하려면, v2 scheme 으로 sign 되기 전에 JAR signing 되어야 한다.
APK Signing Block
-
현재의 APK format 과의 하위 호환성을 보장하기 위해 v2 의 새로운 APK signature 는 APK signing block 에 저장된다.
APK file 에서 APK signing block 은 ZIP Central Directory 바로 앞에 위치한다.
해당 block 은 ID-value pair 로 구성되어 있다.
APK 의 v2 signature 는 ID 0x7109871a 로 로 저장되어 있다.
APK Signature Scheme v2 Block
-
APK 는 1개 이상의 signer/identity 로 sign 되며, 각각은 signing key 로 대표된다.
각 signer 에는 다음 정보가 저장되어 있다.
(signature algorithm, digest, signature) tuples.
signer’s identity 를 표시하는 X.509 certificate chain
추가 key-value pair attribute
-
각각의 signer 에 대해 APK 는 지원하는 signature 로 verify 한다.
알려지지 않은 signature algorithm 으로 sign 된 것은 무시된다.
이것으로 하위 호환성을 맞춘다.
contents 보호 무결성
-
APK 내용을 보호하기 위한 목적으로 APK 는 다음 네가지 section 으로 구성된다.
1. Contents of ZIP entries ( offset 0 부터 APK signing block 까지 )
2. APK Signing Block
3. ZIP Central Directory
4. ZIP End of Central Directory
-
APK signature scheme v2 는 1, 3, 4 영역과 APK signing block 안의 signed data block 을 보호한다.
각 영역을 chunk 단위로 나누어 digest 를 만든다.
Verification
-
Android 7.0 에서 APK 는 APK signature scheme v2 (v2 scheme) 또는 JAR signing (v1 scheme) 으로 검증될 수 있다.
구버전 platform 에서는 v2 signature 를 무시하고 v1 signature 로만 verify 한다.
-
APK signature scheme v2 verification
1. APK signing block 을 검증한다.
a. APK signing block 의 size field 가 같은 값인지 확인한다.
b. ZIP Central Directory 바로 뒤에 ZIP End of Central Directory 가 위치하는지 본다.
c. ZIP End of Central Directory 뒤에 data 가 없어야 한다.
2. APK signature scheme v2 가 있으면 verify 를 계속하고, 아니면 v1 scheme 으로 verify 한다.
3. APK signature scheme v2 block 안의 각각의 signer 를 검증한다.
a. 가장 강력한 signature algorithm ID 를 선택한다. 강력함의 기준은 구현 및 platform version 에 따라 다를 수 있다.
b. public key 를 가지고 signed data 에 대한 signature 를 검증한다.
c. digests 와 signatures 안에 있는 signature algorithm ID list 가 동일한지 확인한다.
d. APK contents 에 대해 digest 를 다시 계산한다.
e. 계산한 digest 가 동일한지 확인한다.
f. 첫번째 certificate 안의 SubjectPublicKeyInfo 값이 public key 와 동일한지 확인한다.
정리하면..
-
기존의 JarSigning 을 v1 signing 이라고 하고,
누가(NOS) 부터 등장한 새로운 signing 형태를 v2 signing 이라고 한다.
v1 signing 은 사이닝 방식에 의해 설치시 verify 하면서 시간이 오래 걸리고, file 중 cover 하지 않는 부분이 있어 보안에 v2 에 비해 취약한 편이었다.
v2 signing 은 사이닝 방식이 조금 변화되면서 전체 파일에 대한 digest 를 하는 방식으로 보안도 강화되고, digest 생성 방식의 변화로 verify 도 빨라졌다.
N 미만 단말에서도 설치되게 하려면 v1, v2 두번 다 sign 해야 한다.
N 이상만 지원한다면 v2 로만 sign 해도 된다.
'프로그래밍 놀이터 > 안드로이드, Java' 카테고리의 다른 글
[android] code 와 resource shrink 하자! (0) | 2018.11.23 |
---|---|
[android] D8 이 뭐야? (0) | 2018.11.22 |
[android] Staged Rollout? (0) | 2018.10.12 |
[Android] ART vs. Dalvik (0) | 2018.10.11 |
[Android] ART 의 GC 이야기 (0) | 2018.10.10 |
댓글