การลงนามแอป Android: มันทำงานอย่างไรและเหตุใดจึงสำคัญ
ทุกครั้งที่คุณติดตั้งแอปบนโทรศัพท์ Android การตรวจสอบความปลอดภัยที่เงียบแต่สำคัญจะเกิดขึ้นในเบื้องหลัง โทรศัพท์ของคุณตรวจสอบ ลายเซ็นดิจิทัล ของแพ็คเกจ APK การจับมือกันด้วยการเข้ารหัสลับนี้เป็นสิ่งที่ป้องกันแฮกเกอร์ที่เป็นอันตรายจากการ "วางยาพิษ" แอปของคุณด้วยมัลแวร์ ในขณะเดียวกันก็ทำให้มั่นใจได้ว่านักพัฒนาจะสามารถพุชการอัปเดตได้โดยไม่สูญเสียตัวตนของพวกเขา
หากคุณเขียนแอป การเซ็นชื่อคือสิ่งที่คุณต้องทำให้ถูกต้อง หากคุณเพียงแค่ชอบปรับแต่ง Android มันเป็นหนึ่งในส่วนที่น่าพอใจที่สุดของระบบที่จะเข้าใจ ไม่ว่าจะด้วยวิธีใด การลงนามแอปทำงานอย่างไร ก็คุ้มค่ากับเวลาของคุณ ด้านล่างนี้เราจะอธิบายเกี่ยวกับเทคโนโลยี แผนการลงนามมีการพัฒนาอย่างไร และคุณสามารถ ตรวจสอบใบรับรองด้วยตนเอง ออนไลน์ได้อย่างไร
- เหตุใดจึงต้องลงนามแอป Android ทุกแอปและการเข้ารหัสที่เกี่ยวข้อง (RSA / EC)
- ความแตกต่างระหว่างรูปแบบลายเซ็น v1 (JAR), v2, v3 และ v4 และรูปแบบใดที่แอปของคุณควรใช้ในปัจจุบัน
- วิธีที่ Android ตัดสินใจว่าจะอนุญาตการอัปเดตตามความต่อเนื่องของลายเซ็นหรือไม่
- วิธีที่การหมุนเวียนคีย์ช่วยให้นักพัฒนาเปลี่ยนคีย์การลงนามได้โดยไม่ทำให้การติดตั้งที่มีอยู่เสียหาย
- วิธีตรวจสอบลายเซ็นของ APK ด้วยตนเอง บนบรรทัดคำสั่งหรือด้วย ตัวตรวจสอบบนเบราว์เซอร์ ของเรา
App Signing คืออะไร?
หัวใจหลักของการลงนามแอปคือกระบวนการที่นักพัฒนาใช้ รหัสส่วนตัว เพื่อสร้างบล็อกลายเซ็นสำหรับไฟล์ของแอป จากนั้น กุญแจสาธารณะ ที่เกี่ยวข้องจะถูกฝังอยู่ใน APK ภายในโฟลเดอร์ META-INF เมื่อโทรศัพท์ของคุณพยายามติดตั้งแอป จะใช้คีย์สาธารณะเพื่อตรวจสอบว่าลายเซ็นตรงกับเนื้อหาของไฟล์หรือไม่
ซึ่งมีคุณสมบัติหลักสองประการ:
- ความไม่เปลี่ยนรูป: หากโค้ดของแอปมีการเปลี่ยนแปลงหนึ่งไบต์ (เช่น โดยโทรจัน) ลายเซ็นจะไม่ตรงกับไฟล์อีกต่อไป และ Android จะปฏิเสธที่จะติดตั้ง
- หลักฐานแสดงตัวตน: หากแอปพยายามอัปเดตแอปที่มีอยู่ ลายเซ็นของแอปนั้นจะต้องตรงกัน นี่คือสาเหตุที่คุณไม่สามารถติดตั้งแอพ Facebook ที่ถูกดัดแปลงทับแอพอย่างเป็นทางการได้
วิวัฒนาการของแผนการลงนาม
Google ได้อัปเกรดกลไกการลงนามอย่างต่อเนื่องเพื่อปรับปรุงทั้งความเร็วและความปลอดภัย:
- V1 (การลงนามขวด): ลงนามแต่ละไฟล์ภายใน APK (ZIP) ซึ่งช้าเพราะระบบปฏิบัติการต้องแตกไฟล์และตรวจสอบทุกไฟล์ นอกจากนี้ยังเสี่ยงต่อการถูกปรับแต่ง ZIP บางอย่างอีกด้วย
- V2 (โครงการลายเซ็น APK): ลงนามบล็อกไบนารีทั้งหมดของ APK ไม่จำเป็นต้องทำการคลายซิปเพื่อตรวจสอบ ทำให้รวดเร็วอย่างเหลือเชื่อ เปิดตัวใน Android 7.0 (Nougat)
- V3 (การหมุนปุ่ม): ขยาย V2 โดยการเพิ่ม "lineage" ของคีย์ ช่วยให้นักพัฒนาสามารถพิสูจน์ได้ว่าคีย์ใหม่เป็นผู้สืบทอดที่ได้รับอนุญาตจากคีย์เก่า เปิดตัวใน Android 9.0 (Pie)
- V4 (การลงนามแบบสตรีมมิ่ง): ออกแบบมาโดยเฉพาะสำหรับการติดตั้งเพิ่มเติม ช่วยให้สามารถตรวจสอบแอปในขณะที่ยังคงดาวน์โหลดผ่าน USB หรือ Wi-Fi
เหตุใดใบรับรองจึงมีความสำคัญสำหรับไซด์โหลด
เมื่อคุณดาวน์โหลด APK จากแหล่งที่ไม่เป็นทางการ การแฮชใบรับรอง จะเป็นเพื่อนที่ดีที่สุดของคุณ ลายนิ้วมือของใบรับรอง (เช่น แฮช SHA-256) จะระบุคีย์การลงนามของนักพัฒนาโดยไม่ซ้ำกัน แต่ละแอปจะเก็บคีย์การลงนามเดียวกันในการอัปเดตทั้งหมด ดังนั้นคุณจึงสามารถเปรียบเทียบลายนิ้วมือของ APK กับค่าที่เผยแพร่ของนักพัฒนาเพื่อยืนยันว่าเป็นของแท้
หากคุณสงสัยว่า APK นั้นเป็นของปลอม คุณควรเรียกใช้ผ่าน เครื่องมือตรวจสอบ APK ออนไลน์ ของเรา เครื่องมือของเราจะแสดงให้คุณเห็น:
- ชื่อสามัญ (CN) ของผู้ลงนาม (เช่น "Android")
- ระยะเวลามีผล ของใบรับรอง
- ลายนิ้วมือ SHA-1/SHA-256.
Android ตรวจสอบลายเซ็น ณ เวลาติดตั้งอย่างไร
ขั้นตอน "ยืนยันใบรับรอง" มักจะถูกมองข้ามไปจนคุ้มค่าที่จะพิจารณาว่าระบบปฏิบัติการทำอะไรจริง ๆ เมื่อคุณแตะ APK และ Android ตัดสินใจว่าจะติดตั้งหรือไม่:
- เปิด APK เป็น ZIP และค้นหาบล็อกการลงนาม สำหรับลายเซ็น v2/v3 ที่เป็นบล็อกที่มีโครงสร้างทันทีก่อนไดเร็กทอรีกลาง สำหรับรูปแบบ v1 แบบเดิม จะเป็นเนื้อหาของ META-INF/*.RSA, *.DSA หรือ *.EC
- คำนวณ SHA-256 แยกย่อยของไบต์อื่นๆ ของ APK บล็อกการลงนามถูกแยกออกจากการแยกย่อยของตัวเอง ทุกสิ่งทุกอย่างจะถูกแฮชในส่วนที่กำหนดไว้
- ตรวจสอบการแยกย่อยของแต่ละชิ้นเทียบกับการแยกย่อยที่บันทึกไว้ในบล็อกการลงนาม หากมีการเปลี่ยนแปลงแม้แต่ไบต์เดียวนับตั้งแต่ผู้พัฒนาลงนามไฟล์ ข้อมูลสรุปจะไม่ตรงกันและการติดตั้งจะถูกปฏิเสธโดยมีข้อผิดพลาด "ไม่ได้ติดตั้งแอป" ทั่วไป
- ตรวจสอบว่าบล็อกการลงนามนั้นถูกสร้างขึ้นด้วยคีย์ส่วนตัวของใบรับรอง รหัสสาธารณะของใบรับรองใช้เพื่อตรวจสอบลายเซ็นการเข้ารหัสในบล็อก การตรวจสอบที่สำเร็จหมายความว่าใครก็ตามที่ลงนามในไฟล์มีคีย์ส่วนตัวที่จับคู่กับใบรับรองนี้
- เปรียบเทียบลายนิ้วมือใบรับรองกับการติดตั้งชื่อแพ็คเกจเดียวกันที่มีอยู่ หากติดตั้งแพ็คเกจแล้วและ APK ใหม่ลงนามด้วยใบรับรองอื่น การติดตั้งจะถูกปฏิเสธด้วย INSTALL_FAILED_UPDATE_INCOMPATIBLE นี่คือการป้องกันการแอบอ้างบุคคลอื่นหลักของระบบปฏิบัติการ: ผู้ประสงค์ร้ายไม่สามารถแทนที่แอปธนาคารของคุณด้วยสำเนาของตนเองได้ เว้นแต่พวกเขาจะขโมยรหัสลงนามของธนาคารด้วย
สิ่งเหล่านี้ไม่ได้พิสูจน์ว่านักพัฒนาเชื่อถือได้ เพียงแต่ว่าไฟล์ที่คุณกำลังจะติดตั้งนั้นมีไบต์เหมือนกันกับสิ่งที่พวกเขาเซ็นชื่อ และไม่มีฝ่ายใดมายุ่งเกี่ยวกับมัน ความไว้วางใจในนักพัฒนาเป็นการตัดสินใจที่แยกต่างหาก และสิ่งที่คุณตัดสินใจโดยการตัดสินใจว่าคุณติดตั้งจากแหล่งใด
"ลายเซ็นไม่ตรงกัน" หมายถึงอะไรจริงๆ
สิ่งที่ทำให้คนประหลาดใจที่พบบ่อยที่สุดเมื่อไซด์โหลดคือข้อผิดพลาด "ลายเซ็นไม่ตรงกัน" ในการอัปเดต นี่คือสิ่งที่เกิดขึ้นจริง:
- คุณได้ติดตั้ง แอป X เวอร์ชัน 1.0 จาก Play Store แล้ว
- คุณดาวน์โหลด แอป X เวอร์ชัน 1.1.1 จากแหล่งที่ไม่ใช่ Play
- ระบบปฏิบัติการเห็นชื่อแพ็กเกจเดียวกัน (com.example.app) แต่ APK ได้รับการลงนามด้วยใบรับรองอื่น (คีย์การลงนามของแหล่งที่มาด้านข้าง ไม่ใช่ของผู้เผยแพร่ดั้งเดิม) มันปฏิเสธที่จะติดตั้ง
สิ่งนี้เกิดขึ้นได้สองวิธีในทางปฏิบัติ:
- APK ของบุคคลที่สามคือ จากสำนักพิมพ์อื่นอย่างแท้จริง เช่น สำเนา "modded" หรือ "patched" การปฏิเสธการติดตั้งถือเป็นพฤติกรรมที่ถูกต้อง การติดตั้งจะหมายถึงการไว้วางใจคนแปลกหน้าด้วยข้อมูลเดียวกันกับที่แอปของธนาคารของคุณสัมผัสแล้ว
- APK ของบุคคลที่สามคือ การอัปโหลด APK อย่างเป็นทางการอีกครั้ง แต่ระบบ Play App Signing ของ Google ลงนามการดาวน์โหลดของผู้ใช้แต่ละรายด้วย Wrapper คีย์การอัปโหลด ของผู้ใช้ บางครั้งอุปกรณ์สองเครื่องอาจเห็นข้อมูลลายเซ็นที่แตกต่างกันเล็กน้อยสำหรับแอปเวอร์ชันที่มีแนวคิดเดียวกัน ในกรณีนั้นลายนิ้วมือของใบรับรองที่รูทยังคงตรงกัน คุณสามารถตรวจสอบกับ เครื่องมือตรวจสอบ APK ของเราได้
หากลายนิ้วมือใบรับรอง อย่างแท้จริง แตกต่างจากการติดตั้งที่คุณมีอยู่ วิธีเดียวที่จะดำเนินการต่อได้คือการถอนการติดตั้งสำเนาปัจจุบันก่อน (สูญเสียข้อมูล) ก่อนที่จะไซด์โหลดสำเนาทดแทน โดยห้ามปิดการตรวจสอบลายเซ็น
การสร้างคีย์การลงนามของคุณเอง (สำหรับนักพัฒนา)
หากคุณกำลังสร้างแอป Android คุณจะต้องลงนามในบิลด์ของคุณเองในที่สุด คำสั่งบรรทัดเดียวมาตรฐานที่ใช้ keytool จาก Java SDK คือ:
keytool -genkeypair -v \
-keystore my-release.keystore \
-alias my-app -keyalg RSA -keysize 2048 \
-validity 10000
สองสิ่งที่ควรรู้:
- ความถูกต้อง มีความสำคัญ: 10,000 วัน (ประมาณ 27 ปี) เป็นค่าทั่วไปเนื่องจากระบบปฏิบัติการปฏิบัติต่อการอัปเดตที่เซ็นชื่อด้วยคีย์ที่ใกล้หมดอายุหรือหมดอายุว่าถูกบุกรุก สร้างคีย์ที่มีอายุการใช้งานยาวนานเพียงครั้งเดียวและปกป้องคีย์
- เมื่อเผยแพร่แล้ว คุณจะไม่สามารถสลับคีย์ได้อย่างง่ายดาย รูปแบบการลงนาม v3 เพิ่มคีย์ การหมุน เป็นคุณลักษณะที่ชัดเจน: ใบรับรองเก่า "อวยพร" ใบรับรองใหม่ผ่านการพิสูจน์ที่เก็บไว้ ช่วยให้ระบบปฏิบัติการยอมรับการอัปเดตจากคีย์ใหม่ในขณะที่ยังคงรักษาความต่อเนื่องของข้อมูลระบุตัวตน หากไม่มี v3 การสูญเสียคีย์ดั้งเดิมหมายถึงการละทิ้งการติดตั้งที่มีอยู่ทั้งหมด
สำหรับบิลด์การทดสอบแบบไซด์โหลด ที่เก็บคีย์การดีบักที่ไม่ได้ลงนามก็ใช้ได้ สำหรับการผลิต ให้ใช้ที่เก็บคีย์ความถูกต้องยาวนานที่ป้องกันด้วยรหัสผ่านซึ่งจัดเก็บไว้ในการสำรองข้อมูลออฟไลน์
ยืนยันตัวตนของแอปอย่างมืออาชีพ
อย่าเชื่อถือชื่อไฟล์ทั่วไป ตรวจสอบหัวใจการเข้ารหัสของ APK ของคุณในไม่กี่วินาที
ตรวจสอบใบรับรองทันทีข้อผิดพลาดทั่วไปในการลงนาม
- ใบรับรองที่ลงนามด้วยตนเอง: แอพ Android ส่วนใหญ่ลงนามด้วยตนเอง ไม่เหมือนกับ SSL สำหรับเว็บไซต์ ไม่มีอำนาจกลางสำหรับการลงนามแอป Android คุณต้องเชื่อถือนักพัฒนาซอฟต์แวร์โดยตรง
- แอป ใบรับรองการแก้ไขข้อบกพร่อง: ที่สร้างขึ้นเพื่อการทดสอบใช้คีย์ "debug" ทั่วไป แอปเหล่านี้ไม่ควรเผยแพร่สู่สาธารณะและถูกบล็อกโดยตัวกรองความปลอดภัยจำนวนมาก
- การสูญเสียที่สำคัญ: หากนักพัฒนาสูญเสียที่เก็บคีย์ส่วนตัว พวกเขาสามารถ ไม่เคย อัปเดตแอปได้อีกครั้ง พวกเขาจะต้องเปิดตัวแอป "ใหม่" ที่มีชื่อแพ็คเกจอื่น
การเลือกแผนการลงนามที่เหมาะสมสำหรับ SDK เป้าหมายของคุณ
การลงนามแอปเป็นการสนับสนุนความปลอดภัยของ Android อย่างมาก เมื่อความสัมพันธ์ของคีย์ส่วนตัว/สาธารณะคลิก คุณสามารถตัดสินแอปที่ถูกไซด์โหลดได้จากข้อดีของแอป และยืนยันว่าสิ่งที่คุณกำลังติดตั้งไม่มีการเปลี่ยนแปลงนับตั้งแต่นักพัฒนาลงนาม สำหรับข้อมูลเพิ่มเติมเกี่ยวกับระบบภายในของ Android โปรดดู คำแนะนำเกี่ยวกับรูปแบบ XAPK ของเรา