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

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

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

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

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

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

אפליקציות יכולות גם להצהיר על הרשאות אבטחה ברמת ההגנה על החתימה, כדי להגביל את הגישה רק לאפליקציות שחתומות באותו מפתח, תוך שמירה על מזהי UID וארגזי חול נפרדים לאפליקציות. קשר קרוב יותר עם ארגז חול משותף של אפליקציות אפשרי באמצעות תכונת 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 ו-v3 (סכמת 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 עם חתימה מגרסה v2+ שהוסרה נדחות כי לפי חתימת גרסה 1 שלהן מצוין שה-APK חתום בחתימה v2, ולכן מערכת Android מגרסה 7.0 ואילך מסרבים לאמת חבילות APK באמצעות החתימות v1 שלהן.

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