การลงนามในใบสมัคร

การลงนามแอปพลิเคชันช่วยให้นักพัฒนาสามารถระบุผู้เขียนแอปพลิเคชันและอัปเดตแอปพลิเคชันโดยไม่ต้องสร้างอินเทอร์เฟซและการอนุญาตที่ซับซ้อน ทุกแอปพลิเคชันที่ทำงานบนแพลตฟอร์ม 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 ที่แตกต่างกัน อนุญาตให้มีความสัมพันธ์ที่ใกล้ชิดยิ่งขึ้นกับ 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 ด้วย

ขั้นตอนการตรวจสอบลายเซ็น APK

รูปที่ 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