중국시가넷 - 개인 서명 - APK 서명 메커니즘 중 하나-v2 서명 메커니즘에 대한 자세한 설명

APK 서명 메커니즘 중 하나-v2 서명 메커니즘에 대한 자세한 설명

이전 apk 서명 메커니즘 중 하나인 JAR 서명 메커니즘에 대한 자세한 분석을 통해 JAR 서명은 Apk 의 모든 파일을 해시해야 하며 리소스가 많은 경우 서명 검증 속도가 느리다는 것을 알 수 있습니다. 인증 속도를 높이고 무결성 보증을 강화하기 위해 Andorid 는 7.0 에 전체 파일 서명 체계 V2 를 도입했습니다. V2 프로그램의 구체적인 설계 원리를 살펴 보겠습니다.

V2 서명의 구조를 이해하기 전에 먼저 zip(apk) 파일의 구조를 살펴보겠습니다.

Zip 파일은 다음 세 부분으로 나뉩니다.

중앙 디렉토리의 초기 오프셋과 크기를 통해 중앙 디렉토리를 찾은 다음 중앙 디렉토리의 항목을 반복하여 로컬 파일 헤더의 초기 오프셋을 기준으로 데이터 영역에서 해당 압축 데이터를 찾을 수 있습니다.

Apk 서명 메커니즘 중 하나인 JAR 서명 메커니즘에 대한 자세한 설명에서는 JAR 서명이 Apk 파일에 메타-Inf 디렉토리를 추가하는 것임을 이미 알고 있습니다. 즉, 데이터 영역과 중앙 디렉토리를 수정해야 합니다. 파일을 늘리면 중앙 디렉토리의 크기와 오프셋이 변경되고 중앙 디렉토리의 끝 레코드도 수정해야 하기 때문입니다. 데이터 무결성 보장을 강화하기 위해 V2 스키마는 데이터 영역 및 중앙 디렉토리 대신 데이터 영역과 중앙 디렉토리 사이에 APK 서명 블록을 삽입하여 원본 zip(apk) 데이터의 무결성을 보장합니다. 자세한 내용은 다음과 같습니다.

V2 서명 블록은 1, 3, 4 부의 무결성과 2 부에 포함된 APK 서명 체계 V2 블록에 서명된 데이터 블록의 무결성을 보호합니다.

APK 서명 블록은 블록 길이, ID 값 시퀀스, 블록 길이 및 고정 매직 값의 네 부분으로 구성됩니다. 여기서 APK 서명 체계 v2 는 ID 가 0x7 10987 1a 인 키-값 쌍에 저장됩니다. 서명을 확인할 때 먼저 zip 중앙 디렉토리 끝에 있는 레코드를 찾은 다음 이 레코드에서 중앙 디렉토리의 초기 오프셋을 찾습니다. 그런 다음 마법 값을 사용하여 앞에 APK 서명이 있을 수 있는 블록을 확인할 수 있습니다. 그런 다음 APK 서명 블록의 위치는 두 개의 블록 길이 필드에 의해 결정될 수 있습니다. 마지막으로 ID(0x7 10987 1a) 를 통해 APK 서명 체계 v2 블록의 위치를 찾을 수 있습니다.

APK 서명 체계의 v2 블록은 여러 서명자가 동일한 APK 에 서명하는 데 사용할 수 있음을 나타내는 서명 시퀀스입니다. 각 서명 정보는 다음 세 부분으로 구성됩니다.

앞서 언급했듯이 v2 서명 블록은 1, 3, 4 부의 무결성과 2 부에 포함된 APK 서명 체계 v2 블록에 있는 서명된 데이터 블록의 무결성을 보호합니다. 1, 3, 4 부의 무결성은 컨텐츠 다이제스트로 보호되고, 컨텐츠 다이제스트는 서명 블록에 저장되고, 서명 블록의 무결성은 서명으로 보장됩니다. 추상적인 계산 과정을 살펴 보겠습니다.

1, 3, 4 부에 대한 요약 계산은 2 단계 Merkle 트리와 비슷합니다.

V2 서명 메커니즘은 Android 7.0 에 도입되었기 때문에 Android 7.0 이하 버전에 APK 를 설치하려면 먼저 JAR 서명으로 APK 에 서명한 다음 V2 스키마로 서명해야 합니다. JAR 서명은 zip 데이터 영역과 중앙 디렉토리의 내용을 수정해야 하기 때문에 JAR 서명을 먼저 한 다음 JAR 로 서명하면 V2 서명의 무결성이 손상됩니다.

사실, 우리는' APK' 를 컴파일할 때 이 과정에 관심을 가질 필요가 없다. Android 플러그인 gradle 2.2 에서 gradle 은 기본적으로 JAR 서명 및 V2 스키마를 사용하여 APK 에 서명합니다. JAR 서명 또는 V2 서명을 끄려면 build.gradle 에서 다음을 수행할 수 있습니다.

Android 7.0 에서 APK 는 먼저 v2 스키마를 사용하여 검증합니다. 안드로이드 7.0 이하 버전에서는 v2 서명이 무시되고 v 1 서명만 확인됩니다. 안드로이드 7.0+의 유효성 검사 프로세스는 다음과 같습니다.

V2 서명이 있는 APK 에는 JAR 서명도 있으므로 공격자는 APK 의 V2 서명을 삭제하여 안드로이드 시스템에서 JAR 서명만 확인할 수 있습니다. 이런 공격을 막기 위해 V2 프로그램은 다음과 같이 규정하고 있다.

공격자는 또한 APK 서명 체계 v2 블록에서 안전계수가 높은 서명을 제거하여 시스템에서 안전계수가 낮은 서명을 확인할 수 있도록 할 수도 있습니다. 이러한 공격을 방지하기 위해:

Apk 서명 메커니즘 중 하나인 ——JAR 서명 메커니즘에 대한 자세한 설명과 이 문서의 분석을 통해 우리는 다음을 알고 있습니다.

JAR 서명의 단점

V2 서명의 이점

이제 "Apk 서명의 기본 개념과 용법" 서문에서 제기된 질문에 대답할 수 있습니다.

APK 의 무결성과 신뢰성을 보장하기 위해 APK 서명은 JAR 서명과 V2 서명이라는 두 가지 시나리오로 나뉩니다. 핵심 아이디어는 APK 내용의 해시를 계산한 다음 서명 알고리즘을 사용하여 해시에 서명하는 것입니다. 확인 중에 서명은 서명자의 공개 키로 해독된 다음 인증자가 계산한 APK 콘텐츠 해시와 비교됩니다. 일치하는 경우 검증을 통과합니다.

서명 인증서 지문, 제 3 자 SDK 를 신청할 때 APK 패키지 이름과 인증서 지문을 기입해야 합니다. SDK 개발자는 백그라운드에서 이 두 값을 기준으로 키를 생성합니다. 타사 SDK 는 초기화 시 시스템에서 현재 APK 의 패키지 이름, 서명 인증서 지문 및 키를 가져와서 서버에 업로드한 다음 패키지 이름과 서명 인증서 지문이 이 키에 바인딩되었는지 확인하고 통과 후 권한을 부여합니다.

V2 프로그램이 등장하기 전에 세 가지 빠른 대량 포장 시나리오가 있습니다.

V2 시나리오가 나타난 후 데이터 영역, 중앙 디렉토리 및 중앙 디렉토리의 종료 레코드 무결성이 모두 보장되므로 시나리오 2 와 3 은 적용되지 않습니다. 빠른 대량 포장이 가능합니까? 물론 아닙니다. 우리는 APK 서명구역으로 시작할 수 있습니다. APK 서명 블록의 구조를 살펴 보겠습니다.

APK 서명 블록에는 ID-VALUE 시퀀스가 있으며 서명 정보 (APK 서명 체계 v2 블록) 는 ID 가 0x7 10987 1a 인 ID-VALUE 에만 저장됩니다. 서명 검증 소스 코드를 분석하여 다른 ID-VALUE 데이터가 해결되지 않았음을 알 수 있습니다. 즉, APK 서명 체계 v2 블록 이외의 ID-VALUE 는 서명 검증에 영향을 주지 않습니다. 따라서 새 ID 값을 정의하고 APK 서명 블록에 채널 정보를 쓸 수 있습니다. V2 스키마는 1, 3, 4 부 및 2 부 (APK 서명 블록) 에 포함된 APK 서명 체계의 V2 블록에서 서명된 데이터 블록의 무결성만 보장하므로 새로 기록된 ID 값은 보호되지 않으므로 이 시나리오가 가능합니다. 미단의 차세대 채널 패킷 생성 도구인 Walle 은 사실 이 방안을 통해 이뤄졌다.

자, APK 서명 메커니즘의 모든 내부 분석이 끝났습니다. 이 세 편의 문장 다 보고 나면 JAR 서명과 V2 서명 메커니즘에 대해 대충 이해하실 수 있을 겁니다. (데이비드 아셀, Northern Exposure (미국 TV 드라마), 예술명언) 관심 있는 학생은 서명과 검증의 소스 코드를 읽어 추가 분석을 할 수 있다.