जब उपयोगकर्ता कोई संवेदनशील लेन-देन शुरू करते हैं, जैसे कि पेमेंट करना, तो Android Protected Confirmation की सुविधा का इस्तेमाल करके, यह पुष्टि की जा सकती है कि उपयोगकर्ता ने जान-बूझकर ऐसा किया है. यह सुविधा, Android 9 (एपीआई लेवल 28) या उसके बाद के वर्शन पर काम करने वाले डिवाइसों पर उपलब्ध है. इस वर्कफ़्लो का इस्तेमाल करने पर, आपका ऐप्लिकेशन उपयोगकर्ता को एक प्रॉम्प्ट दिखाता है. इसमें उपयोगकर्ता से एक छोटे से स्टेटमेंट को स्वीकार करने के लिए कहा जाता है. इस स्टेटमेंट में, संवेदनशील लेन-देन को पूरा करने के उसके इरादे की पुष्टि की जाती है.
अगर उपयोगकर्ता इस स्टेटमेंट को स्वीकार करता है, तो आपका ऐप्लिकेशन Android Keystore से किसी कुंजी का इस्तेमाल करके, डायलॉग में दिखाए गए मैसेज पर हस्ताक्षर कर सकता है. हस्ताक्षर से यह पता चलता है कि उपयोगकर्ता ने स्टेटमेंट पढ़ लिया है और वह इससे सहमत है.
चेतावनी: Android Protected Confirmation, उपयोगकर्ता के लिए सुरक्षित जानकारी चैनल उपलब्ध नहीं कराता है. आपका ऐप्लिकेशन, Android प्लैटफ़ॉर्म की ओर से दी जाने वाली गारंटी के अलावा, किसी भी तरह की निजता की गारंटी नहीं दे सकता. खास तौर पर, इस वर्कफ़्लो का इस्तेमाल ऐसी संवेदनशील जानकारी दिखाने के लिए न करें जिसे आम तौर पर उपयोगकर्ता के डिवाइस पर नहीं दिखाया जाता.
उपयोगकर्ता के मैसेज की पुष्टि करने के बाद, मैसेज की इंटिग्रिटी (मैसेज में कोई बदलाव नहीं किया गया है) की पुष्टि हो जाती है. हालांकि, आपके ऐप्लिकेशन को अब भी ट्रांसफ़र के दौरान डेटा एन्क्रिप्ट (सुरक्षित) करने के तरीके का इस्तेमाल करना होगा, ताकि हस्ताक्षर किए गए मैसेज की गोपनीयता को सुरक्षित रखा जा सके.
अपने ऐप्लिकेशन में, उपयोगकर्ता की पुष्टि करने के लिए ज़्यादा सुरक्षा वाली सुविधा उपलब्ध कराने के लिए, यह तरीका अपनाएं:
KeyGenParameterSpec.Builder
क्लास का इस्तेमाल करके, एसिमेट्रिक साइनिंग कुंजी जनरेट करें. की बनाते समय,true
कोsetUserConfirmationRequired()
में पास करें. इसके अलावा,setAttestationChallenge()
को कॉल करें और भरोसा करने वाली पार्टी की ओर से दी गई चुनौती की सही वैल्यू पास करें.नई जनरेट की गई कुंजी और कुंजी के अटेस्टेशन सर्टिफ़िकेट को, भरोसेमंद पार्टी के साथ रजिस्टर करें.
अपने सर्वर को लेन-देन की जानकारी भेजें. इसके बाद, सर्वर को अतिरिक्त डेटा का बाइनरी लार्ज ऑब्जेक्ट (बीएलओबी) जनरेट करने और उसे वापस भेजने के लिए कहें. अतिरिक्त डेटा में, पुष्टि किया जाने वाला डेटा या पार्सिंग के बारे में जानकारी शामिल हो सकती है. जैसे, प्रॉम्प्ट स्ट्रिंग की स्थान-भाषा.
ज़्यादा सुरक्षित तरीके से लागू करने के लिए, BLOB में क्रिप्टोग्राफ़िक नॉनस होना चाहिए, ताकि रीप्ले अटैक से सुरक्षा की जा सके और लेन-देन को अलग-अलग किया जा सके.
ConfirmationCallback
ऑब्जेक्ट सेट अप करें. यह ऑब्जेक्ट, आपके ऐप्लिकेशन को यह सूचना देता है कि उपयोगकर्ता ने पुष्टि करने वाले डायलॉग में दिखाए गए प्रॉम्प्ट को स्वीकार कर लिया है: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. } }
अगर उपयोगकर्ता डायलॉग को स्वीकार करता है, तो
onConfirmed()
कॉलबैक को कॉल किया जाता है.dataThatWasConfirmed
BLOB, CBOR डेटा स्ट्रक्चर होता है. इसमें अन्य जानकारी के साथ-साथ, वह प्रॉम्प्ट टेक्स्ट भी शामिल होता है जो उपयोगकर्ता को दिखता है. साथ ही, इसमें वह अतिरिक्त डेटा भी शामिल होता है जिसे आपनेConfirmationPrompt
बिल्डर में पास किया था. पहले बनाई गई कुंजी का इस्तेमाल करके,dataThatWasConfirmed
BLOB पर हस्ताक्षर करें. इसके बाद, इस BLOB को हस्ताक्षर और लेन-देन की जानकारी के साथ, वापस रिलाइंग पार्टी को भेजें.Android Protected Confirmation की सुरक्षा से जुड़े फ़ायदे पाने के लिए, हस्ताक्षर किया गया मैसेज मिलने पर, रिलाइंग पार्टी को यह तरीका अपनाना होगा:
- मैसेज पर मौजूद हस्ताक्षर के साथ-साथ, साइनिंग की के अटेस्टेशन सर्टिफ़िकेट चेन की जांच करें.
- जांच करें कि अटेस्टेशन सर्टिफ़िकेट में
TRUSTED_CONFIRMATION_REQUIRED
फ़्लैग सेट हो. इससे पता चलता है कि हस्ताक्षर करने वाले कुंजी को भरोसेमंद उपयोगकर्ता की पुष्टि की ज़रूरत है. अगर हस्ताक्षर करने वाली कुंजी, आरएसए कुंजी है, तो देखें कि इसमेंPURPOSE_ENCRYPT
याPURPOSE_DECRYPT
प्रॉपर्टी मौजूद न हो. extraData
देखें. इससे यह पक्का किया जा सकेगा कि पुष्टि करने वाला यह मैसेज, नए अनुरोध से जुड़ा है और इस पर अब तक कार्रवाई नहीं की गई है. इस चरण से, रीप्ले हमलों से सुरक्षा मिलती है.- पुष्टि की गई कार्रवाई या अनुरोध के बारे में जानकारी पाने के लिए,
promptText
को पार्स करें. याद रखें किpromptText
, मैसेज का सिर्फ़ वह हिस्सा है जिसकी पुष्टि उपयोगकर्ता ने की है. भरोसा करने वाली पार्टी को कभी यह नहीं मानना चाहिए कि पुष्टि किया जाने वाला डेटा,extraData
में शामिलpromptText
से मेल खाता है.
डायलॉग को दिखाने के लिए, यहां दिए गए कोड स्निपेट में दिखाए गए लॉजिक जैसा लॉजिक जोड़ें:
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);
अन्य संसाधन
Android Protected Confirmation के बारे में ज़्यादा जानने के लिए, यहां दिए गए संसाधन देखें.