การลงนามแอป

การรับรองแอปช่วยให้นักพัฒนาแอประบุผู้เขียนแอปและอัปเดตแอปได้โดยไม่ต้องสร้างอินเทอร์เฟซและสิทธิ์ที่ซับซ้อน แอปทุกแอปที่ทำงานบนแพลตฟอร์ม Android จะต้อง ลงนามโดยนักพัฒนาแอป แอปที่พยายามติดตั้งโดยไม่ได้ลงชื่อจะถูกปฏิเสธโดย Google Play หรือโปรแกรมติดตั้งแพ็กเกจในอุปกรณ์ Android

ใน Google Play การลงนามแอปจะเป็นตัวเชื่อมถึงความไว้วางใจที่ Google มีต่อนักพัฒนาแอป และความเชื่อถือที่มีต่อแอปของตน นักพัฒนาแอปจะทราบว่าแอปของตนมีให้บนอุปกรณ์ Android และไม่มีการแก้ไข และนักพัฒนาแอปเองก็เป็นผู้รับผิดชอบต่อลักษณะการทำงานของแอป

ใน Android การรับรองแอปเป็นขั้นตอนแรกในการวางแอปในซานด์บ็อกซ์ของแอปพลิเคชัน ใบรับรองแอปที่ลงนามจะกำหนดว่ารหัสผู้ใช้ใดเชื่อมโยงกับแอปใด แอปต่างๆ จะทำงานภายใต้รหัสผู้ใช้ที่แตกต่างกัน การรับรองแอปช่วยให้มั่นใจได้ว่าแอปหนึ่งๆ จะเข้าถึงแอปอื่นไม่ได้ ยกเว้นผ่าน IPC ที่กําหนดไว้อย่างดี

เมื่อติดตั้งแอป (ไฟล์ APK) ลงในอุปกรณ์ Android เครื่องมือจัดการแพ็กเกจจะยืนยันว่า APK ได้รับการรับรองด้วยใบรับรองที่รวมอยู่ใน APK นั้นอย่างถูกต้อง หากใบรับรอง (หรือคีย์สาธารณะในใบรับรอง) ตรงกับคีย์ที่ใช้ในการรับรอง APK อื่นๆ ในอุปกรณ์ APK ใหม่จะมีตัวเลือกในการระบุในไฟล์ Manifest ว่าแชร์ UID กับ APK อื่นๆ ที่รับรองในลักษณะเดียวกัน

แอปอาจได้รับการรับรองโดยบุคคลที่สาม (OEM, ผู้ให้บริการเครือข่าย, ตลาดทางเลือก) หรือรับรองด้วยตนเอง Android ให้การรับรองโค้ดโดยใช้ใบรับรองที่ลงนามด้วยตนเองซึ่งนักพัฒนาแอปสามารถสร้างได้โดยไม่ต้องขอความช่วยเหลือหรือสิทธิ์จากภายนอก แอปไม่จำเป็นต้องได้รับการรับรองจากหน่วยงานกลาง ปัจจุบัน Android ไม่ได้ดำเนินการยืนยัน CA สำหรับใบรับรองแอป

นอกจากนี้ แอปยังประกาศสิทธิ์ด้านความปลอดภัยที่ระดับการปกป้องลายเซ็นได้อีกด้วย ซึ่งจะจำกัดการเข้าถึงไว้เฉพาะแอปที่ลงนามด้วยคีย์เดียวกัน ขณะเดียวกันก็คง UID และ Application Sandbox ที่แตกต่างกันไว้ คุณสามารถมีความสัมพันธ์ที่ใกล้ชิดยิ่งขึ้นกับ Sandbox ของแอปพลิเคชันที่แชร์ได้โดยใช้ ฟีเจอร์ UID ที่แชร์ ซึ่งแอปตั้งแต่ 2 แอปขึ้นไปที่ลงนามด้วยคีย์นักพัฒนาแอปเดียวกันจะประกาศ UID ที่แชร์ในไฟล์ Manifest ได้

รูปแบบการรับรอง APK

Android รองรับรูปแบบการรับรองแอป 3 รูปแบบ ดังนี้

  • สคีม v1: อิงตามการลงนาม JAR
  • รูปแบบ v2: APK Signature Scheme v2 ซึ่งเปิดตัวใน Android 7.0
  • รูปแบบ v3: APK Signature Scheme v3 ซึ่งเปิดตัวใน Android 9

ลงนามแอปด้วยรูปแบบทั้งหมด ก่อนจะใช้ v1 ตามด้วย v2 และ v3 อุปกรณ์ Android 7.0 ขึ้นไปจะติดตั้งแอปที่ลงชื่อด้วยรูปแบบ v2 ขึ้นไปได้เร็วกว่าแอปที่ลงชื่อด้วยรูปแบบ v1 เท่านั้น แพลตฟอร์ม Android เวอร์ชันเก่าจะไม่สนใจลายเซ็น v2 ขึ้นไป จึงกำหนดให้แอปต้องมีลายเซ็น v1

การลงนาม JAR (รูปแบบ v1)

การรับรอง APK เป็นส่วนหนึ่งของ Android มาตั้งแต่ต้น ซึ่งอิงตาม JAR ที่ลงนาม โปรดดูรายละเอียดเกี่ยวกับการใช้รูปแบบนี้ในเอกสารประกอบของ Android Studio เกี่ยวกับ การลงนามแอป

ลายเซ็น v1 จะไม่ปกป้องบางส่วนของ APK เช่น ข้อมูลเมตา ZIP โปรแกรมตรวจสอบ APK ต้องประมวลผลโครงสร้างข้อมูลที่ไม่น่าเชื่อถือ (ยังไม่ได้ยืนยัน) จำนวนมาก จากนั้นจึงทิ้งข้อมูลที่ไม่ได้อยู่ภายใต้ลายเซ็น ซึ่งจะเพิ่มพื้นที่การโจมตี นอกจากนี้ ผู้ตรวจสอบ APK จะต้องคลายการบีบอัดรายการที่บีบอัดทั้งหมด ซึ่งทำให้เสียเวลาและหน่วยความจำมากขึ้น Android 7.0 ได้เปิดตัว APK Signature Scheme v2 เพื่อแก้ไขปัญหาเหล่านี้

APK Signature Scheme v2 และ v3 (v2+ Scheme)

อุปกรณ์ที่ใช้ Android 7.0 ขึ้นไปรองรับรูปแบบลายเซ็น APK v2 (v2 scheme) ขึ้นไป (รูปแบบ v2 ได้รับการอัปเดตเป็น v3 ใน Android 9 เพื่อรวมข้อมูลเพิ่มเติมในบล็อกการรับรอง แต่ยังคงทำงานเหมือนเดิม) ระบบจะแฮชและเซ็นเนื้อหาของ APK จากนั้นจะแทรกบล็อกการรับรอง APK ที่ได้ลงใน APK โปรดดูรายละเอียดเกี่ยวกับการใช้รูปแบบ v2 ขึ้นไปกับแอปที่หัวข้อ APK Signature Scheme v2

ในระหว่างการตรวจสอบ สคีมา v2 ขึ้นไปจะถือว่าไฟล์ APK เป็น Blob และดำเนินการตรวจสอบลายเซ็นในทั้งไฟล์ การแก้ไข APK รวมถึงการแก้ไขข้อมูลเมตา ZIP จะทำให้ลายเซ็น APK ใช้งานไม่ได้ การยืนยัน APK รูปแบบนี้จะเร็วขึ้นมากและสามารถตรวจหาการแก้ไขที่ไม่ได้รับอนุญาตได้อีกหลายระดับ

รูปแบบใหม่นี้ใช้งานย้อนหลังได้ จึงติดตั้ง APK ที่รับรองด้วยรูปแบบลายเซ็นใหม่ในอุปกรณ์ Android รุ่นเก่าได้ (ซึ่งจะละเว้นข้อมูลที่เพิ่มลงใน APK) ตราบใดที่ APK เหล่านี้ได้รับการรับรอง v1 ด้วย

กระบวนการยืนยันลายเซ็น APK

รูปที่ 1 กระบวนการยืนยันลายเซ็น APK

ระบบจะยืนยันแฮชทั้งไฟล์ของ APK กับลายเซ็น v2 ขึ้นไปที่จัดเก็บไว้ในบล็อกการรับรอง APK แฮชจะครอบคลุมทุกอย่างยกเว้นบล็อกการรับรอง APK ซึ่งมีลายเซ็น v2 ขึ้นไป การแก้ไข APK นอกบล็อกการรับรอง APK จะทําให้ลายเซ็น v2 ขึ้นไปของ APK ใช้งานไม่ได้ ระบบจะปฏิเสธ APK ที่มีลายเซ็น v2 ขึ้นไปที่ลบออกด้วย เนื่องจากลายเซ็น v1 ระบุว่า APK ได้รับการรับรอง v2 ซึ่งทำให้ Android 7.0 ขึ้นไปปฏิเสธที่จะยืนยัน APK โดยใช้ลายเซ็น v1

โปรดดูรายละเอียดเกี่ยวกับกระบวนการยืนยันลายเซ็น APK ที่ ส่วนการยืนยันของ APK Signature Scheme v2