Przejrzystość kodu w pakietach aplikacji

Przejrzystość kodu to opcjonalny mechanizm podpisywania i weryfikacji kodu w przypadku aplikacji opublikowanych za pomocą pakietu Android App Bundle. Wykorzystuje klucz podpisywania przejrzystości kodu, który jest własnością wyłącznie dewelopera aplikacji.

Przejrzystość kodu jest niezależna od schematu podpisywania używanego na potrzeby pakietów aplikacji i plików APK. Klucz przejrzystości kodu różni się od klucza podpisywania aplikacji, który podczas korzystania z podpisywania aplikacji przez Google Play jest przechowywany w bezpiecznej infrastrukturze Google.

Jak działa przejrzystość kodu

Proces ten polega na dołączeniu pliku przejrzystości kodu do pakietu po jego utworzeniu, ale przed przesłaniem go do Konsoli Play w celu dystrybucji.

Plik przejrzystości kodu to token sieciowy JSON (JWT), który zawiera listę plików DEX i bibliotek natywnych zawartych w pakiecie wraz z ich haszami. Jest on następnie podpisany za pomocą klucza przejrzystości kodu, który posiada tylko deweloper.

Diagram przejrzystości kodu

Plik przejrzystości kodu jest rozpowszechniany w podstawowym pliku APK utworzonym z pakietu aplikacji (zwłaszcza w przypadku głównego podziału modułu podstawowego). Można następnie sprawdzić, czy:

  • Wszystkie pliki DEX i kod natywny zawarte w plikach APK mają pasujące hasze w pliku przejrzystości kodu.
  • Komponent klucza publicznego klucza podpisywania przejrzystości kodu w aplikacji pasuje do klucza publicznego dewelopera (który musi zostać dostarczony przez dewelopera w osobnym, bezpiecznym kanale).

Te informacje wspólnie sprawdzają, czy kod zawarty w plikach APK jest zgodny z zamierzeniami dewelopera i czy nie został zmodyfikowany.

Plik przejrzystości kodu nie weryfikuje zasobów, zasobów, pliku manifestu Androida ani żadnych innych plików, które nie są plikami DEX ani bibliotekami natywnymi znajdującymi się w folderze lib/.

Weryfikacja przejrzystości kodu służy wyłącznie do kontroli deweloperów i użytkowników, którzy chcą mieć pewność, że uruchomiony kod jest zgodny z kodem, który został pierwotnie skompilowany i podpisany przez dewelopera aplikacji.

Znane ograniczenia

W pewnych sytuacjach nie można korzystać z przejrzystości kodu:

  • Aplikacje, które określają atrybut sharedUserId w pliku manifestu. Takie aplikacje mogą udostępniać swój proces innym aplikacjom, co utrudnia pewność co do stosowanego przez nie kodu.
  • Aplikacje korzystające z ochrony przed nieuprawnionymi modyfikacjami lub inne usługi, które wprowadzają zmiany w kodzie po wygenerowaniu pliku przejrzystości kodu, spowodują niepowodzenie weryfikacji przejrzystości kodu.
  • aplikacje korzystające ze starszej wersji Multidex na poziomach interfejsu API poniżej 21 (Android 5.0) i korzystające z modułów funkcji. Przejrzystość kodu będzie nadal działać po zainstalowaniu aplikacji przez Google Play na urządzeniach z Androidem 5.0 lub nowszym. W starszych wersjach systemu operacyjnego przejrzystość kodu będzie wyłączona.

Jak dodać przejrzystość kodu

Zanim dodasz do aplikacji funkcję przejrzystości kodu, upewnij się, że masz parę kluczy (prywatny i publiczny), których możesz używać do podpisywania przejrzystości kodu. Powinien to być unikalny klucz inny niż klucz podpisywania aplikacji, którego używasz do podpisywania aplikacji przez Google Play. Musi on być bezpiecznie przechowywany i nigdy nie udostępniany poza organizację.

Jeśli nie masz klucza, wykonaj instrukcje podane w przewodniku po podpisywaniu aplikacji, aby wygenerować go na swoim komputerze. Funkcja przejrzystości kodu korzysta ze standardowego pliku magazynu kluczy, więc nawet jeśli przewodnik dotyczy podpisywania aplikacji, proces generowania kluczy jest taki sam.

Korzystanie z wtyczki Androida do obsługi Gradle

Obsługa przejrzystości kodu wymaga wtyczki Androida do obsługi Gradle w wersji 7.1.0-alpha03 lub nowszej. Aby skonfigurować klucz używany do podpisywania przejrzystości kodu, dodaj ten kod w bloku bundle.

Odlotowy

// 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"
            }
        }
        ...
    }
}

Musi to być klucz używany tylko do zapewnienia przejrzystości kodu, a nie klucz podpisywania aplikacji używany przez funkcję podpisywania aplikacji przez Google Play.

Używanie bundletool w wierszu poleceń

Obsługa przejrzystości kodu wymaga narzędzia pakietu w wersji 1.7.0 lub nowszej, które możesz pobrać z GitHuba.

Uruchom to polecenie, aby dodać przejrzystość kodu do pakietu Android App Bundle. Musi to być klucz używany tylko do zapewnienia przejrzystości kodu, a nie klucz podpisywania aplikacji używany przez funkcję podpisywania aplikacji przez Google 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

Jeśli chcesz użyć własnych narzędzi do podpisywania, możesz użyć narzędzia pakietu, aby wygenerować plik przejrzystości kodu niepodpisanego kodu, podpisać go w osobnym środowisku i wstrzyknąć do pakietu podpis:

# 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

Sprawdzanie przezroczystości kodu aplikacji

Istnieją różne metody weryfikacji kodu za pomocą pliku przejrzystości kodu w zależności od tego, czy pliki APK są zainstalowane na urządzeniu z Androidem czy pobrane lokalnie na komputer.

sprawdzanie pakietu aplikacji lub zestawu APK za pomocą narzędzia Bundletool.

Za pomocą narzędzia packagetool możesz sprawdzić przejrzystość kodu w pakiecie aplikacji lub zestawie APK. Za pomocą polecenia check-transparency wydrukuj odcisk cyfrowy publicznego certyfikatu:

# 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.

Opcjonalnie możesz podać certyfikat publiczny, pod kątem którego chcesz zweryfikować pakiet lub plik APK, aby nie musieć porównywać haszy ręcznie:

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.

Sprawdzanie aplikacji zainstalowanej na urządzeniu za pomocą narzędzia Bundletool

Aby sprawdzić aplikację zainstalowaną na urządzeniu z Androidem, upewnij się, że urządzenie jest podłączone do komputera przez ADB i wydaj to polecenie:

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.

Kontrola przezroczystości połączonego urządzenia może też opcjonalnie zweryfikować podpis na podstawie określonego przez Ciebie klucza publicznego:

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.