חתימה על אפליקציות

חתימה על אפליקציות מאפשרת למפתחים לזהות את המחבר של האפליקציה ולעדכן אותה בלי ליצור ממשקים והרשאות מורכבים. כל אפליקציה שפועלת בפלטפורמת Android חייבת להיות חתומה על ידי המפתח. אפליקציות שמנסות להתקין בלי חתימת האפליקציה נדחות על ידי Google Play או על ידי מנהל החבילות במכשיר Android.

ב-Google Play, חתימת האפליקציה משלימה את האמון של Google במפתח ואת האמון של המפתח באפליקציה שלו. המפתחים יודעים שהאפליקציה שלהם מוצגת במכשיר Android ללא שינוי, ואפשר לחייב אותם באחריות על ההתנהגות של האפליקציה.

ב-Android, חתימת האפליקציה היא השלב הראשון להעברת האפליקציה לארגז החול שלה. אישור האפליקציה החתום מגדיר איזה מזהה משתמש משויך לאפליקציה כלשהי. אפליקציות שונות פועלות עם מזהי משתמשים שונים. חתימה על אפליקציות מוודאת שאפליקציה אחת לא יכולה לגשת לאפליקציה אחרת אלא דרך IPC מוגדר היטב.

כשמתקינים אפליקציה (קובץ APK) במכשיר Android, מנהל החבילות מאמת שה-APK נחתם כראוי באמצעות האישור שמצורף אליו. אם האישור (או, באופן מדויק יותר, המפתח הציבורי שבאישור) תואם למפתח ששימש לחתימה על כל קובץ APK אחר במכשיר, בקובץ ה-APK החדש יש אפשרות לציין במניפסט שהוא משתף מזהה UID עם קובצי ה-APK האחרים שחתומים באופן דומה.

אפליקציות יכולות להיות חתומות על ידי צד שלישי (OEM, מפעיל, שוק חלופי) או חתומות על ידי עצמן. ב-Android יש אפשרות לחתום על קוד באמצעות אישורים בחתימה עצמית, שמפתחים יכולים ליצור ללא עזרה או הרשאה חיצונית. אין צורך שחתימת האפליקציות תתבצע על ידי רשות מרכזית. בשלב זה, מערכת Android לא מבצעת אימות של אישורי CA לאישורי אפליקציות.

אפליקציות יכולות גם להצהיר על הרשאות אבטחה ברמת ההגנה על החתימה, כדי להגביל את הגישה רק לאפליקציות שחתומות על ידי אותו מפתח, תוך שמירה על מזהי UID וארגזי חול נפרדים לאפליקציות. אפשר ליצור קשר הדוק יותר עם ארגז חול משותף של אפליקציות באמצעות התכונה 'מזהה משתמש (UID) משותף'. כשמשתמשים בתכונה הזו, שתי אפליקציות או יותר שחתמו על המפתח שלהן עם אותו מפתח פיתוח יכולות להצהיר על מזהה משתמש משותף במניפסט שלהן.

סכמות חתימה של APK

מערכת Android תומכת בשלושה סכמות לחתימה על אפליקציות:

כדי לשפר את התאימות, מומלץ לחתום על האפליקציות בכל הסכימות, קודם בגרסה 1, אחר כך בגרסה 2 ואז בגרסה 3. במכשירי Android מגרסה 7.0 ואילך, אפליקציות שחתומות בסכמות v2 ואילך מותקנות מהר יותר מאפליקציות שחתומות רק בסכמה v1. פלטפורמות Android ישנות יותר מתעלמות מחתימות מגרסה 2 ואילך, ולכן האפליקציות צריכות להכיל חתימות מגרסה 1.

חתימה על קובצי JAR (סכימה v1)

חתימה על חבילות APK הייתה חלק מ-Android מההתחלה. הוא מבוסס על קובץ JAR חתום. לפרטים על השימוש בתוכנית הזו, אפשר לעיין במסמכי העזרה של Android Studio בנושא חתימה על האפליקציה.

חתימות v1 לא מגינות על חלקים מסוימים של קובץ ה-APK, כמו מטא-נתונים של ZIP. מאמת ה-APK צריך לעבד הרבה מבנים של נתונים לא מהימנים (עדיין לא אומתו), ואז להשליך נתונים שלא מכוסים בחתימות. כך נוצר שטח מתקפה גדול. בנוסף, מאמת ה-APK צריך לבטל את דחיסת כל הרשומות, וכך נדרשים יותר זמן וזיכרון. כדי לטפל בבעיות האלה, הוספנו ל-Android 7.0 את הסכימה APK Signature Scheme v2.

סכמת חתימה על APK בגרסה 2 ו-3 (סכמה v2+)

במכשירים עם Android מגרסה 7.0 ואילך יש תמיכה ב-APK Signature Scheme v2 (סכמה v2) ואילך. (התוכנית של גרסה 2 עודכנה לגרסה 3 ב-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 מאומת באמצעות החתימה מהגרסה 2 ואילך שמאוחסנת בבלוק החתימה של ה-APK. הגיבוב מכסה את כל הנתונים, מלבד הבלוק של חתימה על קובץ ה-APK, שמכיל את החתימה של v2 ואילך. כל שינוי ב-APK מחוץ לבלוק החתימה של ה-APK מבטל את החתימה של ה-APK בגרסה 2 ואילך. גם קבצים מסוג APK עם חתימה מדור שני ומעלה שהושמטה מהם נדחים, כי החתימה שלהם בגרסה 1 מציינת שה-APK נחתם בגרסה 2. לכן, מכשירי Android מגרסה 7.0 ואילך מסרבים לאמת קבצים מסוג APK באמצעות חתימות שלהם בגרסה 1.

פרטים על תהליך אימות החתימה של קובץ ה-APK מופיעים בקטע Verification של APK Signature Scheme v2.