חתימה על יישום

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

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

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

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

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

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

סכימות חתימת APK

אנדרואיד תומך בשלוש תוכניות חתימת יישומים:

לתאימות מקסימלית, חתום על יישומים עם כל הסכמות, תחילה עם v1, לאחר מכן v2, ולאחר מכן v3. מכשירים עם אנדרואיד 7.0 ואילך מתקינים אפליקציות חתומות עם סכימות v2+ מהר יותר מאלה שנחתמו רק עם סכימת v1. פלטפורמות אנדרואיד ישנות יותר מתעלמות מחתימות v2+ ולכן זקוקות לאפליקציות שיכילו חתימות v1.

חתימת JAR (סכימת v1)

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

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

APK Signature Scheme v2 ו-v3 (סכימת v2+)

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

במהלך האימות, סכימת v2+ מתייחסת לקובץ ה-APK כאל בלוק ומבצעת בדיקת חתימה על פני כל הקובץ. כל שינוי ב-APK, כולל שינויים במטא נתונים של ZIP, מבטל את התוקף של חתימת ה-APK. צורה זו של אימות APK מהירה יותר באופן משמעותי ומאפשרת זיהוי של מחלקות נוספות של שינויים לא מורשים.

הפורמט החדש תואם לאחור, כך שניתן להתקין חבילות APK חתומות בפורמט החתימה החדש במכשירי אנדרואיד ישנים יותר (שפשוט מתעלמים מהנתונים הנוספים שנוספו ל-APK), כל עוד חבילות ה-APK הללו חתומות גם ב-v1.

תהליך אימות חתימת APK

איור 1. תהליך אימות חתימת APK

Hash של קובץ שלם של ה-APK מאומת מול חתימת v2+ המאוחסנת ב-APK Signing Block. ה-hash מכסה הכל מלבד בלוק החתימה APK, שמכיל את חתימת v2+. כל שינוי ב-APK מחוץ ל-APK Signing Block מבטל את תוקף החתימה v2+ של APK. חבילות APK עם חתימת v2+ מופשטת נדחות גם כן, מכיוון שחתימת v1 שלהן מציינת שה-APK היה חתום ב-v2, מה שגורם ל-Android 7.0 ואילך לסרב לאמת חבילות APK באמצעות חתימות v1 שלהם.

לפרטים על תהליך אימות חתימת APK, עיין בסעיף אימות של APK Signature Scheme v2.

,

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

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

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

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

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

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

סכימות חתימת APK

אנדרואיד תומך בשלוש תוכניות חתימת יישומים:

לתאימות מקסימלית, חתום על יישומים עם כל הסכמות, תחילה עם v1, לאחר מכן v2, ולאחר מכן v3. מכשירים עם אנדרואיד 7.0 ואילך מתקינים אפליקציות חתומות עם סכימות v2+ מהר יותר מאלה שנחתמו רק עם סכימת v1. פלטפורמות אנדרואיד ישנות יותר מתעלמות מחתימות v2+ ולכן זקוקות לאפליקציות שיכילו חתימות v1.

חתימת JAR (סכימת v1)

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

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

APK Signature Scheme v2 ו-v3 (סכימת v2+)

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

במהלך האימות, סכימת v2+ מתייחסת לקובץ ה-APK כאל בלוק ומבצעת בדיקת חתימה על פני כל הקובץ. כל שינוי ב-APK, כולל שינויים במטא נתונים של ZIP, מבטל את התוקף של חתימת ה-APK. צורה זו של אימות APK מהירה יותר באופן משמעותי ומאפשרת זיהוי של מחלקות נוספות של שינויים לא מורשים.

הפורמט החדש תואם לאחור, כך שניתן להתקין חבילות APK חתומות בפורמט החתימה החדש במכשירי אנדרואיד ישנים יותר (שפשוט מתעלמים מהנתונים הנוספים שנוספו ל-APK), כל עוד חבילות ה-APK הללו חתומות גם ב-v1.

תהליך אימות חתימת APK

איור 1. תהליך אימות חתימת APK

Hash של קובץ שלם של ה-APK מאומת מול חתימת v2+ המאוחסנת ב-APK Signing Block. ה-hash מכסה הכל מלבד בלוק החתימה APK, שמכיל את חתימת v2+. כל שינוי ב-APK מחוץ ל-APK Signing Block מבטל את תוקף החתימה v2+ של APK. חבילות APK עם חתימת v2+ מופשטת נדחות גם כן, מכיוון שחתימת v1 שלהן מציינת שה-APK היה חתום ב-v2, מה שגורם ל-Android 7.0 ואילך לסרב לאמת חבילות APK באמצעות חתימות v1 שלהם.

לפרטים על תהליך אימות חתימת APK, עיין בסעיף אימות של APK Signature Scheme v2.