การลงนามแอปพลิเคชันช่วยให้นักพัฒนาสามารถระบุผู้เขียนแอปพลิเคชันและอัปเดตแอปพลิเคชันโดยไม่ต้องสร้างอินเทอร์เฟซและการอนุญาตที่ซับซ้อน ทุกแอปพลิเคชันที่ทำงานบนแพลตฟอร์ม Android จะต้อง ลงนามโดยผู้พัฒนา แอปพลิเคชันที่พยายามติดตั้งโดยไม่ได้ลงชื่อจะถูกปฏิเสธโดย Google Play หรือโปรแกรมติดตั้งแพ็กเกจบนอุปกรณ์ Android
บน Google Play การลงนามแอปพลิเคชันจะเชื่อมโยงความไว้วางใจที่ Google มีกับนักพัฒนาซอฟต์แวร์ และความไว้วางใจที่นักพัฒนาซอฟต์แวร์มีกับแอปพลิเคชันของตน นักพัฒนาทราบดีว่ามีการจัดเตรียมแอปพลิเคชันของตนไว้บนอุปกรณ์ Android โดยไม่มีการแก้ไข และนักพัฒนาสามารถรับผิดชอบต่อพฤติกรรมของแอปพลิเคชันของตนได้
บน Android การลงนามแอปพลิเคชันเป็นขั้นตอนแรกในการวางแอปพลิเคชันใน Application Sandbox ใบรับรองแอปพลิเคชันที่ลงนามจะกำหนด ID ผู้ใช้ที่เชื่อมโยงกับแอปพลิเคชันใด แอปพลิเคชันต่าง ๆ ทำงานภายใต้ ID ผู้ใช้ที่แตกต่างกัน การลงนามแอปพลิเคชันทำให้มั่นใจได้ว่าแอปพลิเคชันหนึ่งไม่สามารถเข้าถึงแอปพลิเคชันอื่นได้ ยกเว้นผ่าน IPC ที่กำหนดไว้อย่างดี
เมื่อมีการติดตั้งแอปพลิเคชัน (ไฟล์ APK) ลงในอุปกรณ์ Android Package Manager จะตรวจสอบว่า APK ได้รับการลงนามอย่างถูกต้องด้วยใบรับรองที่รวมอยู่ใน APK นั้น หากใบรับรอง (หรือแม่นยำกว่านั้นคือกุญแจสาธารณะในใบรับรอง) ตรงกับรหัสที่ใช้ในการลงนาม APK อื่นใดบนอุปกรณ์ APK ใหม่จะมีตัวเลือกให้ระบุในรายการว่าจะแชร์ UID กับอีกรายการหนึ่งในลักษณะเดียวกัน - APK ที่ลงนามแล้ว
แอปพลิเคชันสามารถลงนามโดยบุคคลที่สาม (OEM, ผู้ให้บริการ, ตลาดทางเลือก) หรือลงนามด้วยตนเอง Android ให้การเซ็นรหัสโดยใช้ใบรับรองที่ลงนามเองซึ่งนักพัฒนาสามารถสร้างได้โดยไม่ต้องใช้ความช่วยเหลือหรืออนุญาตจากภายนอก แอปพลิเคชันไม่จำเป็นต้องลงนามโดยผู้มีอำนาจส่วนกลาง ขณะนี้ Android ไม่ได้ทำการตรวจสอบ CA สำหรับใบรับรองแอปพลิเคชัน
แอปพลิเคชันยังสามารถประกาศการอนุญาตความปลอดภัยที่ระดับการป้องกันลายเซ็น โดยจำกัดการเข้าถึงเฉพาะแอปพลิเคชันที่ลงนามด้วยคีย์เดียวกันในขณะที่ยังคงรักษา UID และแซนด์บ็อกซ์แอปพลิเคชันที่แตกต่างกัน อนุญาตให้มีความสัมพันธ์ที่ใกล้ชิดยิ่งขึ้นกับ Application Sandbox ที่ แชร์ผ่านคุณลักษณะ UID ที่ใช้ร่วมกัน โดยที่แอปพลิเคชันสองรายการขึ้นไปที่ลงนามด้วยคีย์นักพัฒนาซอฟต์แวร์เดียวกันสามารถประกาศ UID ที่แชร์ในไฟล์ Manifest ได้
แผนการลงนาม APK
Android รองรับรูปแบบการเซ็นชื่อแอปพลิเคชันสามแบบ:
- แบบแผน 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+)
อุปกรณ์ที่ใช้ Android 7.0 และใหม่กว่ารองรับชุดรูปแบบลายเซ็น APK v2 (รูปแบบ v2) และใหม่กว่า (รูปแบบ v2 ได้รับการอัปเดตเป็น v3 ใน Android 9 เพื่อรวมข้อมูลเพิ่มเติมในบล็อกการลงนาม แต่จะใช้งานได้เหมือนกัน) เนื้อหาของ APK จะถูกแฮชและลงนาม จากนั้นจึงแทรก APK Signing Block ที่เป็นผลลัพธ์ลงใน APK สำหรับรายละเอียดเกี่ยวกับการใช้ชุดรูปแบบ v2+ กับแอป โปรดดูที่ APK Signature Scheme v2
ระหว่างการตรวจสอบความถูกต้อง โครงร่าง v2+ จะถือว่าไฟล์ APK เป็น Blob และทำการตรวจสอบลายเซ็นทั่วทั้งไฟล์ การแก้ไขใดๆ ใน APK รวมถึงการแก้ไขข้อมูลเมตาของ ZIP จะทำให้ลายเซ็น APK เป็นโมฆะ รูปแบบของการยืนยัน APK นี้เร็วกว่ามากและช่วยให้สามารถตรวจจับคลาสอื่นๆ ของการแก้ไขที่ไม่ได้รับอนุญาตได้
รูปแบบใหม่นี้เข้ากันได้แบบย้อนหลัง ดังนั้น APK ที่ลงชื่อด้วยรูปแบบลายเซ็นใหม่จึงสามารถติดตั้งบนอุปกรณ์ Android รุ่นเก่าได้ (ซึ่งไม่ต้องสนใจข้อมูลเพิ่มเติมที่เพิ่มลงใน APK) ตราบใดที่ APK เหล่านี้มีการลงชื่อ v1 ด้วย
รูปที่ 1. ขั้นตอนการตรวจสอบลายเซ็น APK
แฮชทั้งไฟล์ของ APK ได้รับการตรวจสอบเทียบกับลายเซ็น v2+ ที่จัดเก็บไว้ใน APK Signing Block แฮชครอบคลุมทุกอย่าง ยกเว้น APK Signing Block ซึ่งมีลายเซ็น v2+ การแก้ไขใดๆ กับ APK นอก APK Signing Block จะทำให้ลายเซ็น v2+ ของ APK เป็นโมฆะ APK ที่มีลายเซ็น v2+ ที่ถูกปล้นจะถูกปฏิเสธเช่นกัน เนื่องจากลายเซ็น v1 ระบุว่า APK นั้นมีการลงนาม v2 ซึ่งทำให้ Android 7.0 และใหม่กว่าปฏิเสธที่จะยืนยัน APK โดยใช้ลายเซ็น v1
สำหรับรายละเอียดเกี่ยวกับกระบวนการตรวจสอบลายเซ็น APK โปรดดู ส่วนการยืนยัน ของ APK Signature Scheme v2