본문 바로가기
프로그래밍 놀이터/안드로이드, Java

[android] APK Signature Scheme v2

by 돼지왕 왕돼지 2018. 11. 21.
반응형


apk sign v2, apk signature scheme v2, APK Signature Scheme v2 Block, apk signing block, contents 보호 무결성, jar signing, NOS, v1 scheme, verification, zip metadata, [android] APK Signature Scheme v2

-

APK Signature Scheme v2 는 verification speed 를 향상시키고, APK 의 일부가 변경되었는지 detecting 하는 것이 강화되어 보안에도 더 안전하다.


APK Signature Scheme v2 는 APK Signing Block 을 Zipping 하기 전에 APK 에 넣는다.

apk sign v2, apk signature scheme v2, APK Signature Scheme v2 Block, apk signing block, contents 보호 무결성, jar signing, NOS, v1 scheme, verification, zip metadata, [android] APK Signature Scheme v2


-

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 으로 구성된다.

apk sign v2, apk signature scheme v2, APK Signature Scheme v2 Block, apk signing block, contents 보호 무결성, jar signing, NOS, v1 scheme, verification, zip metadata, [android] APK Signature Scheme v2

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 를 만든다.

apk sign v2, apk signature scheme v2, APK Signature Scheme v2 Block, apk signing block, contents 보호 무결성, jar signing, NOS, v1 scheme, verification, zip metadata, [android] APK Signature Scheme v2





Verification


-

Android 7.0 에서 APK 는 APK signature scheme v2 (v2 scheme) 또는 JAR signing (v1 scheme) 으로 검증될 수 있다.

구버전 platform 에서는 v2 signature 를 무시하고 v1 signature 로만 verify 한다.

apk sign v2, apk signature scheme v2, APK Signature Scheme v2 Block, apk signing block, contents 보호 무결성, jar signing, NOS, v1 scheme, verification, zip metadata, [android] APK Signature Scheme v2



-

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

댓글