Kullanıcılar ödeme yapma gibi hassas bir işlem başlattıklarında niyetlerini onaylamanıza yardımcı olmak için Android 9 (API düzeyi 28) veya sonraki sürümleri çalıştıran desteklenen cihazlar Android Korumalı Onayı'nı kullanmanıza izin verir. Bu iş akışını kullanırken uygulamanız kullanıcıya bir istem göstererek hassas işlemi tamamlama niyetini tekrar onaylayan kısa bir ifadeyi onaylamasını ister.
Kullanıcı ifadeyi kabul ederse uygulamanız iletişim kutusunda gösterilen mesajı imzalamak için Android Anahtar Deposu'ndan bir anahtar kullanabilir. İmza, kullanıcının ifadeyi gördüğü ve kabul ettiğine son derece emin bir şekilde belirtir.
Dikkat: Android Korumalı Onay, kullanıcı için güvenli bir bilgi kanalı sağlamaz. Uygulamanız, Android platformunun sundukları dışında hiçbir gizlilik garantisini varsayamaz. Özellikle, kullanıcının cihazında normalde göstermeyeceğiniz hassas bilgileri göstermek için bu iş akışını kullanmayın.
Kullanıcı mesajı onayladıktan sonra mesajın bütünlüğü garanti edilir ancak uygulamanızın imzalanan mesajın gizliliğini korumak için aktarım halindeki verilerde şifreleme kullanmaya devam etmesi gerekir.
Uygulamanızda yüksek güvenlikli kullanıcı onayı için destek sağlamak üzere aşağıdaki adımları tamamlayın:
KeyGenParameterSpec.Builder
sınıfını kullanarak asimetrik imzalama anahtarı oluşturun. Anahtarı oluştururkentrue
öğesinisetUserConfirmationRequired()
içine geçirin. Ayrıca,setAttestationChallenge()
numaralı telefonu arayarak bağlı tarafın sağladığı uygun bir sorgulama değerini iletin.Yeni oluşturulan anahtarı ve anahtarınızın onay sertifikasını uygun bağlı tarafa kaydettirin.
İşlem ayrıntılarını sunucunuza gönderip ekstra veriden oluşan ikili büyük bir nesne (BLOB) oluşturup döndürmesini sağlayın. Ek veriler, doğrulanacak verileri veya istem dizesinin yerel ayarı gibi ayrıştırma ipuçlarını içerebilir.
Daha güvenli bir uygulama için BLOB, tekrar oynatma saldırılarına karşı koruma sağlamak ve işlemleri netleştirmek amacıyla tek seferlik bir şifreleme tek seferlik içermelidir.
Kullanıcı, onay iletişim kutusunda gösterilen istemi kabul ettiğinde uygulamanızı bilgilendirecek
ConfirmationCallback
nesnesini ayarlayın:Kotlin
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. } }
Java
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ılır.dataThatWasConfirmed
BLOB, diğer ayrıntıların yanı sıra kullanıcının gördüğü istem metnini veConfirmationPrompt
oluşturucuya ilettiğiniz ekstra verileri içeren bir CBOR veri yapısıdır.dataThatWasConfirmed
BLOB'u imzalamak için önceden oluşturulan anahtarı kullanın, ardından bu BLOB'u imza ve işlem ayrıntılarıyla birlikte bağlı tarafa geri iletin.Android Korumalı Onay'ın sunduğu güvenlik güvencesinden tam olarak yararlanmak için bağlı taraf, imzalı bir mesaj aldıktan sonra aşağıdaki adımları uygulamalıdır:
- İletinin üzerindeki imzayı ve imzalama anahtarının onay sertifikası zincirini kontrol edin.
- Onay sertifikasında
TRUSTED_CONFIRMATION_REQUIRED
işaretinin ayarlandığından emin olun. Bu işaret, imzalama anahtarının güvenilir kullanıcı onayı gerektirdiğini gösterir. İmzalama anahtarı bir RSA anahtarıysaPURPOSE_ENCRYPT
veyaPURPOSE_DECRYPT
özelliğine sahip olmadığından emin olun. - Bu onay mesajının yeni bir isteğe ait olduğundan ve henüz işlenmediğinden emin olmak için
extraData
adresini kontrol edin. Bu adım, tekrar oynatma saldırılarına karşı koruma sağlar. - Onaylanan işlem veya istek hakkında bilgi için
promptText
öğesini ayrıştırın. Mesajda kullanıcının gerçekten onayladığı tek bölümünpromptText
olduğunu unutmayın. Bağlı taraf,extraData
kapsamındaki doğrulanan verilerinpromptText
ile aynı olduğunu hiçbir zaman varsaymamalıdır.
İletişim kutusunu görüntülemek için aşağıdaki kod snippet'inde gösterilene benzer bir mantık ekleyin:
Kotlin
// 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)
Java
// 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 kaynaklara bakın.