שקיפות הקוד של חבילות App Bundle

שקיפות הקוד היא מנגנון אופציונלי לחתימת קוד ולאימות, אפליקציות שפורסמו בקובץ Android App Bundle. הוא משתמש בשקיפות קוד מפתח החתימה, שנמצא בבעלותו הבלעדית של מפַתח האפליקציה.

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

איך פועלת שקיפות הקוד

התהליך פועל על ידי הכללת קובץ של שקיפות קוד בחבילה לאחר מכן נבנה, אבל לפני שהוא מועלה ל-Play Console להפצה.

קובץ שקיפות הקוד הוא אסימון רשת מבוסס JSON (JWT) שמכיל רשימה של DEX הקבצים והספריות המקוריות שכלולים בחבילה, יחד עם הגיבובים שלהם. לאחר מכן הוא חתומה באמצעות מפתח שקיפות של קוד שנמצא בידי המפתח בלבד.

תרשים שקיפות של קוד

קובץ שקיפות הקוד הזה מופץ אל ה-APK הבסיסי שנוצר מהאפליקציה חבילה (במיוחד לפיצול הראשי של מודול הבסיס). לאחר מכן היא יכולה להיות אימת ש:

  • לכל קובצי ה-DEX והקודים המקוריים שקיימים בחבילות ה-APK יש גיבובים (hash) תואמים את קובץ שקיפות הקוד.
  • רכיב המפתח הציבורי של מפתח החתימה לשקיפות קוד באפליקציה תואם למפתח הציבורי של המפתח (שצריך לספק על ידי בערוץ נפרד ומאובטח).

ביחד, המידע הזה מאמת שהקוד שכלול חבילות ה-APK תואמות למה שהמפתח התכוון אליו, ושלא בוצעו בהן שינויים.

קובץ שקיפות הקוד לא מאמת משאבים, נכסים או מכשירי Android קובץ מניפסט או כל קובץ אחר שאינו קובצי DEX או ספריות מקוריות בתיקייה lib/.

אימות שקיפות הקוד משמש אך ורק למטרת בדיקה על ידי מפתחים ומשתמשי קצה, שרוצים לוודא שהקוד שהם מפעילים תואם את הקוד שנוצר במקור ונחתם על ידי מפַתח האפליקציה.

מגבלות ידועות

יש מצבים מסוימים שבהם אי אפשר להשתמש בשקיפות קוד:

  • אפליקציות שמציינות את sharedUserId במניפסט. בקשות כאלה עשויות לשתף את התהליך שלהן עם אחרים, ולכן קשה להבטיח שהם מריצים.
  • אפליקציות שמשתמשות בהגנה מפני זיוף או כל שירות אחר שמבצע שינויים בקוד אחרי שנוצר קובץ שקיפות הקוד, שקיפות הקוד תיכשל.
  • אפליקציות שמשתמשות ב-Multidex מדור קודם ברמות API שקודמות ל-21 (Android 5.0) ומשתמשים בהן של הפיצ'רים האלה. שקיפות הקוד תמשיך לפעול כשהאפליקציה מותקנת על ידי Google Play במכשירים עם Android 5.0 ואילך. שקיפות הקוד תהיה מושבת בגרסאות מערכת הפעלה ישנות יותר.

איך להוסיף שקיפות קוד

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

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

שימוש בפלאגין של Android Gradle

כדי לתמוך בשקיפות קוד נדרשת גרסה 7.1.0-alpha03 של הפלאגין Android Gradle או גרסה חדשה יותר. כדי להגדיר את המפתח שמשמש לחתימה על שקיפות קוד, צריך להוסיף את עוקבים בבלוק bundle.

מגניב

// In your app module's build.gradle file:
android {
    ...
    bundle {
        codeTransparency {
            signing {
                keyAlias = "ALIAS"
                keyPassword = "PASSWORD"
                storeFile = file("path/to/keystore")
                storePassword = "PASSWORD"
            }
        }
        ...
    }
}

Kotlin

// In your app module's build.gradle.kts file:
android {
    ...
    bundle {
        codeTransparency {
            signing {
                keyAlias = "ALIAS"
                keyPassword = "PASSWORD"
                storeFile = file("path/to/keystore")
                storePassword = "PASSWORD"
            }
        }
        ...
    }
}

המפתח שמשתמשים בו חייב להיות מפתח שישמש אתכם רק לצורך שקיפות קוד. ולא חתימת האפליקציה שמשמשת את חתימת האפליקציה ב-Play.

שימוש ב-bundletool בשורת הפקודה

לתמיכה בשקיפות קוד נדרשת Bundletool בגרסה 1.7.0 ואילך, יכולים להוריד מ-GitHub.

מריצים את הפקודה הבאה כדי להוסיף שקיפות קוד לקובץ Android App Bundle. המפתח שמשתמשים בו חייב להיות מפתח שישמש אתכם רק לצורך שקיפות קוד. ולא חתימת האפליקציה שמשמשת את חתימת האפליקציה ב-Play.

bundletool add-transparency \
  --bundle=/MyApp/my_app.aab \
  --output=/MyApp/my_app_with_transparency.aab \
  --ks=/MyApp/keystore.jks \
  --ks-pass=file:/MyApp/keystore.pwd \
  --ks-key-alias=MyKeyAlias \
  --key-pass=file:/MyApp/key.pwd

לחלופין, אם ברצונך להשתמש בכלי חתימה משלך, אפשר להשתמש ב-bundletool כדי ליצור את קובץ השקיפות של הקוד הלא חתום, חותמים עליו ולהחדיר את החתימה לחבילה:

# Generate code transparency file
bundletool add-transparency \
  --mode=generate_code_transparency_file \
  --bundle=/MyApp/my_app.aab \
  --output=/MyApp/code_transparency_file.jwt \
  --transparency-key-certificate=/MyApp/transparency.cert

# Add code transparency signature to the bundle
bundletool add-transparency \
  --mode=inject_signature \
  --bundle=/MyApp/my_app.aab \
  --output=/MyApp/my_app_with_transparency.aab \
  --transparency-key-certificate=/MyApp/transparency.cert \
  --transparency-signature=/MyApp/signature

אימות שקיפות הקוד של האפליקציה

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

שימוש ב-Bundtool כדי לבדוק קבוצת App Bundle או APK

אפשר להשתמש ב-bundletool כדי לאמת שקיפות קוד ב-App Bundle או ב-APK הוגדרה. משתמשים בפקודה check-transparency כדי להדפיס את טביעת האצבע לאישור הציבורי:

# For checking a bundle:
bundletool check-transparency \
  --mode=bundle \
  --bundle=/MyApp/my_app_with_transparency.aab

No APK present. APK signature was not checked.
Code transparency signature is valid. SHA-256 fingerprint of the code transparency key certificate (must be compared with the developer's public key manually): 01 23 45 67 89 AB CD EF ..
Code transparency verified: code related file contents match the code transparency file.


# For checking a ZIP containing app's APK splits:
bundletool check-transparency \
  --mode=apk \
  --apk-zip=/MyApp/my_app_with_transparency.zip

APK signature is valid. SHA-256 fingerprint of the apk signing key certificate (must be compared with the developer's public key manually): 02 34 E5 98 CD A7 B2 12 ..
Code transparency signature is valid. SHA-256 fingerprint of the code transparency key certificate (must be compared with the developer's public key manually): 01 23 45 67 89 AB CD EF ..
Code transparency verified: code related file contents match the code transparency file.

אפשר לציין את האישור הציבורי שאותו רוצים לאמת. Bundle או APK לפיהם, כך שלא יהיה צורך להשוות את הגיבובים באופן ידני:

bundletool check-transparency \
  --mode=bundle \
  --bundle=/MyApp/my_app_with_transparency.aab \
  --transparency-key-certificate=/MyApp/transparency.cert

No APK present. APK signature was not checked.
Code transparency signature verified for the provided code transparency key certificate.
Code transparency verified: code related file contents match the code transparency file.


bundletool check-transparency \
  --mode=apk \
  --apk-zip=/MyApp/my_app_with_transparency.zip \
  --apk-signing-key-certificate=/MyApp/apk.cert \
  --transparency-key-certificate=/MyApp/transparency.cert

APK signature verified for the provided apk signing key certificate.
Code transparency signature verified for the provided code transparency key certificate.
Code transparency verified: code related file contents match the code transparency file.

שימוש ב-Bundtool כדי לבדוק אפליקציה שמותקנת במכשיר

כדי לבדוק אפליקציה שהותקנה במכשיר Android, מוודאים המכשיר מחובר למחשב דרך ADB ושולח את הפקודה הבאה:

bundletool check-transparency \
  --mode=connected_device \
  --package-name="com.my.app"

APK signature is valid. SHA-256 fingerprint of the apk signing key certificate (must be compared with the developer's public key manually): 02 34 E5 98 CD A7 B2 12 ..
Code transparency signature is valid. SHA-256 fingerprint of the code transparency key certificate (must be compared with the developer's public key manually): 01 23 45 67 89 AB CD EF ..
Code transparency verified: code related file contents match the code transparency file.

בדיקת השקיפות של המכשיר המחובר יכולה גם לאמת את החתימה מול מפתח ציבורי שציינתם:

bundletool check-transparency \
  --mode=connected-device \
  --package-name="com.my.app" \
  --apk-signing-key-certificate=/MyApp/apk.cert \
  --transparency-key-certificate=/MyApp/transparency.cert

APK signature verified for the provided apk signing key certificate.
Code transparency signature verified for the provided code transparency key certificate.
Code transparency verified: code related file contents match the code transparency file.