Przejrzystość kodu w pakietach aplikacji

Przejrzystość kodu to opcjonalny mechanizm podpisywania i weryfikacji kodu opublikowane w ramach pakietu Android App Bundle. Wykorzystuje przejrzystość kodu Klucz podpisywania, który należy wyłącznie do dewelopera aplikacji.

Przejrzystość kodu jest niezależna od schematu podpisywania używanego w pakietach aplikacji i plików APK. Klucz przejrzystości kodu jest niezależny od klucza podpisywania aplikacji. który jest przechowywany w bezpiecznej infrastrukturze Google podczas korzystania z podpisywania aplikacji przez Google Play.

Jak działa przejrzystość kodu

Ten proces polega na umieszczeniu pliku przejrzystości kodu w pakiecie za nim ale przed przesłaniem do Konsoli Play w celu dystrybucji.

Plik przejrzystości kodu to token sieciowy JSON (JWT) zawierający listę plików DEX plików i bibliotek natywnych zawartych w pakiecie oraz ich hasze. To wtedy przy użyciu klucza przejrzystości kodu, posiadanego wyłącznie przez dewelopera.

Diagram przejrzystości kodu

Ten plik przejrzystości kodu jest rozpowszechniany do podstawowego pliku APK utworzonego na podstawie aplikacji (zwłaszcza głównego podziału modułu podstawowego). Można wtedy Sprawdź, czy:

  • Wszystkie pliki DEX i pliki z kodem natywnym obecne w pakietach APK mają pasujące hasze w pliku przejrzystości kodu.
  • Komponent klucza publicznego klucza podpisywania przejrzystości kodu w aplikacji jest zgodny z kluczem publicznym dewelopera (który musi zostać udostępniony przez przez oddzielny, bezpieczny kanał).

Te informacje łącznie potwierdzają, że kod zawarty w Pliki APK są zgodne z zamierzeniami dewelopera i nie zostały zmienione.

Plik przejrzystości kodu nie weryfikuje zasobów, zasobów, Manifest lub inne pliki, które nie są plikami DEX ani bibliotekami natywnymi znajdujące się w folderze lib/.

Weryfikacja przejrzystości kodu jest używana wyłącznie do kontroli przez programistów i użytkowników, którzy chcą mieć pewność, że używany przez nich kod jest zgodny kod stworzony i podpisany przez dewelopera aplikacji.

Znane ograniczenia

W niektórych sytuacjach nie można korzystać z przejrzystości kodu:

  • Aplikacje, które mają określone sharedUserId w pliku manifestu. Takie aplikacje mogą udostępniać informacje o swoich procesach w przypadku innych zastosowań, co utrudnia uzyskanie pewności co do tego, uruchamiany przez nich kod.
  • aplikacje korzystające z ochrony przed nieuprawnionymi modyfikacjami lub innych usług, które wprowadzają zmiany w kodzie; po wygenerowaniu pliku przejrzystości kodu spowoduje że weryfikacja się nie powiedzie.
  • Aplikacje, które korzystają ze starszej wersji Multidex na poziomach API poniżej 21 (Android 5.0) i korzystają modułów funkcji. Przejrzystość kodu będzie nadal działać, gdy aplikacja zainstalowane z Google Play na urządzeniach z Androidem 5.0 lub nowszym. Przejrzystość kodu będzie wyłączone w starszych wersjach systemów operacyjnych.

Jak dodać przezroczystość kodu

Zanim dodasz do aplikacji przejrzystość kodu, musisz skonfigurować para kluczy (prywatny i publiczny), której możesz używać do podpisywania funkcji Code Transparency. Ten powinien być unikalnym kluczem innym niż używany klucz podpisywania aplikacji do podpisywania aplikacji przez Google Play. Należy przechowywać je w bezpieczny sposób i nigdy nie udostępniać poza w Twojej organizacji.

Jeśli nie masz klucza, możesz wykonać czynności opisane w artykule Podpisywanie aplikacji. . Przejrzystość kodu wykorzystuje standardowy i tak samo jest w przypadku podpisywania aplikacji, jest taka sama.

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-alfa03 lub nowsza. Aby skonfigurować klucz używany do podpisywania funkcji Code Transparency, dodaj do w bloku bundle.

Odlotowe

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

Używany klucz musi być używany wyłącznie do przejrzystości kodu, a nie klucza podpisywania aplikacji używanego przez podpisywanie aplikacji przez Google Play.

Użycie bundletool w wierszu poleceń

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

Aby dodać przejrzystość kodu do pakietu Android App Bundle, uruchom to polecenie. Używany klucz musi być używany wyłącznie do przejrzystości kodu, a nie klucza podpisywania aplikacji używanego przez podpisywanie 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 bundletool, aby wygenerować niepodpisany plik przejrzystości kodu, podpisz go i wstaw podpis do pakietu:

# 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 pod kątem przejrzystości kodu w zależności od tego, czy masz zainstalowane pliki APK na urządzeniu z Androidem czy pobrane lokalnie na komputer.

Sprawdzanie pakietu aplikacji lub zestawu plików APK za pomocą narzędzia Bundletool

Użyj narzędzia bundletool, aby sprawdzić przejrzystość kodu w pakiecie aplikacji lub pliku APK ustawiony. Aby wydrukować publiczny odcisk cyfrowy certyfikatu, użyj polecenia 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.

Możesz opcjonalnie podać certyfikat publiczny, który chcesz zweryfikować pakietu lub pliku APK, więc nie trzeba 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ę, podłączone do komputera przez ADB i uruchamia się następujące 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 z określonym kluczem publicznym:

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.