Android Korumalı Onayı

Android 9 (API düzeyi 28) veya sonraki sürümlerin yüklü olduğu desteklenen cihazlar, ödeme yapma gibi hassas işlemler başlatan kullanıcıların niyetlerini doğrulamanıza yardımcı olmak için Android Korumalı Onayı'nı kullanmanıza olanak tanır. Bu iş akışı kullanıldığında uygulamanız, kullanıcıya hassas işlemi tamamlama niyetini yeniden doğrulayan kısa bir ifadeyi onaylamasını isteyen bir istem gösterir.

Kullanıcı beyanı kabul ederse uygulamanız, iletişim kutusunda gösterilen mesajı imzalamak için Android Keystore'daki bir anahtarı kullanabilir. İmza çok yüksek oranda kullanıcının açıklamayı gördüğü ve kabul ettiği anlamına gelir.

Dikkat: Android Korumalı Onayı, kullanıcı için güvenli bilgi kanalı. Uygulamanız, Android platformunun sunduğundan daha fazla gizlilik garantisi veremez. Özellikle, normalde kullanıcının cihazında göstermeyeceğiniz hassas bilgileri göstermek için bu iş akışını kullanmayın.

Kullanıcı iletiyi onayladıktan sonra ileti bütünlüğü sağlanır ancak uygulamanızın, imzalanmış iletilerin gizliliğini korumak için aktarma sürecindeki verileri şifrelemeye devam etmesi gerekir.

Uygulamanızda yüksek güvenilirlikli kullanıcı onayı için destek sağlamak üzere aşağıdaki adımları tamamlayın:

  1. Asimetrik imzalama anahtarı oluşturma her bir arama terimi için KeyGenParameterSpec.Builder sınıfını kullanır. Anahtarı oluştururken true öğesini şuraya geçirin: setUserConfirmationRequired() Ayrıca setAttestationChallenge() numaralı telefonu arayın, uygun bir meydan okuma değerinin iletilmesidir.

  2. Yeni oluşturulan anahtarı ve anahtarınızın onay sertifikasını uygun olan taraftır.

  3. İşlem ayrıntılarını sunucunuza gönderin ve ek veri içeren bir ikili büyük nesne (BLOB) oluşturmasını ve döndürmesini sağlayın. Ek veriler şunları içerebilir: emin olun.

    Daha güvenli bir uygulama için BLOB'ta şifrelemenin bir tek seferlik rastgele sayı saldırıları tekrarlama ve işlemleri belirginleştirmesidir.

  4. Kullanıcı bir onay iletişim kutusunda gösterilen isteği kabul ettiğinde uygulamanızı bilgilendiren ConfirmationCallback nesnesini ayarlayın:

    KotlinJava
    class MyConfirmationCallback : ConfirmationCallback() {
    
          override fun onConfirmed(dataThatWasConfirmed: ByteArray?) {
              super.onConfirmed(dataThatWasConfirmed)
              // Sign dataThatWasConfirmed using your generated signing key.
              // By completing this process, you generate a signed statement.
          }
    
          override fun onDismissed() {
              super.onDismissed()
              // Handle case where user declined the prompt in the
              // confirmation dialog.
          }
    
          override fun onCanceled() {
              super.onCanceled()
              // Handle case where your app closed the dialog before the user
              // responded to the prompt.
          }
    
          override fun onError(e: Exception?) {
              super.onError(e)
              // Handle the exception that the callback captured.
          }
      }
    public class MyConfirmationCallback extends ConfirmationCallback {
    
      @Override
      public void onConfirmed(@NonNull byte[] dataThatWasConfirmed) {
          super.onConfirmed(dataThatWasConfirmed);
          // Sign dataThatWasConfirmed using your generated signing key.
          // By completing this process, you generate a signed statement.
      }
    
      @Override
      public void onDismissed() {
          super.onDismissed();
          // Handle case where user declined the prompt in the
          // confirmation dialog.
      }
    
      @Override
      public void onCanceled() {
          super.onCanceled();
          // Handle case where your app closed the dialog before the user
          // responded to the prompt.
      }
    
      @Override
      public void onError(Throwable e) {
          super.onError(e);
          // Handle the exception that the callback captured.
      }
    }

    Kullanıcı iletişim kutusunu onaylarsa onConfirmed() geri çağırması çağrıldı. dataThatWasConfirmed BLOB bir Şunları içeren CBOR veri yapısı: kullanıcının gördüğü istem metni ve ek açıklama gibi oluşturduğunuz veriler ConfirmationPrompt oluşturucu. dataThatWasConfirmed BLOB, ardından bu BLOB'ı ve bağımlı tarafa iletilecek.

    Android Korumalı Onay tekliflerinde, bağlı taraf, aşağıdaki adımları uygulamalıdır: imzalı bir ileti alındığında:

    1. İletinin üzerindeki imzanın yanı sıra imzalama anahtarının doğrulama sertifikası zincirini kontrol edin.
    2. Onay sertifikasının TRUSTED_CONFIRMATION_REQUIRED işareti ayarlandı. Bu işaret, imzalama işleminin anahtarı için güvenilir kullanıcı onayı gerekir. İmzalama anahtarı RSA anahtarıysa olmadığını kontrol edin. PURPOSE_ENCRYPT veya PURPOSE_DECRYPT
    3. Bu onay mesajının şuna ait olduğundan emin olmak için extraData kontrol edin: ve henüz işleme konmamış yeni bir istek. Bu adım, yeniden oynatma saldırılarına karşı koruma sağlar.
    4. Onaylanmış işlem veya istek hakkında bilgi edinmek için promptText öğesini ayrıştırın. promptText değerinin, mesajın kullanıcı tarafından onaylanan tek parçası olduğunu unutmayın. Güvenen taraf, extraData'e dahil edilen onaylanacak verilerin promptText'a karşılık geldiğini hiçbir zaman varsayamaz.
  5. Aşağıdaki kod snippet'inde gösterilene benzer bir mantık uygulayarak iletişim kutusunu açar:

    KotlinJava
    // This data structure varies by app type. This is an example.
      data class ConfirmationPromptData(val sender: String,
              val receiver: String, val amount: String)
    
      val myExtraData: ByteArray = byteArrayOf()
      val myDialogData = ConfirmationPromptData("Ashlyn", "Jordan", "$500")
      val threadReceivingCallback = Executor { runnable -> runnable.run() }
      val callback = MyConfirmationCallback()
    
      val dialog = ConfirmationPrompt.Builder(context)
              .setPromptText("${myDialogData.sender}, send
                              ${myDialogData.amount} to
                              ${myDialogData.receiver}?")
              .setExtraData(myExtraData)
              .build()
      dialog.presentPrompt(threadReceivingCallback, callback)
      // This data structure varies by app type. This is an example.
      class ConfirmationPromptData {
          String sender, receiver, amount;
          ConfirmationPromptData(String sender, String receiver, String amount) {
              this.sender = sender;
              this.receiver = receiver;
              this.amount = amount;
          }
      };
      final int MY_EXTRA_DATA_LENGTH = 100;
      byte[] myExtraData = new byte[MY_EXTRA_DATA_LENGTH];
      ConfirmationPromptData myDialogData = new ConfirmationPromptData("Ashlyn", "Jordan", "$500");
      Executor threadReceivingCallback = Runnable::run;
      MyConfirmationCallback callback = new MyConfirmationCallback();
      ConfirmationPrompt dialog = (new ConfirmationPrompt.Builder(getApplicationContext()))
              .setPromptText("${myDialogData.sender}, send ${myDialogData.amount} to ${myDialogData.receiver}?")
              .setExtraData(myExtraData)
              .build();
      dialog.presentPrompt(threadReceivingCallback, callback);

Ek kaynaklar

Android Korumalı Onayı hakkında daha fazla bilgi için aşağıdaki konulara bakın kaynaklar.

Bloglar