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