Android की ओर से सुरक्षा की पुष्टि

Android 9 (एपीआई लेवल 28) या इसके बाद के वर्शन पर काम करने वाले डिवाइसों पर, Android Protected Confirmation का इस्तेमाल किया जा सकता है. इससे, उपयोगकर्ताओं के किसी संवेदनशील लेन-देन (जैसे, पेमेंट करने) की पुष्टि करने में मदद मिलती है. इस वर्कफ़्लो का इस्तेमाल करने पर, आपका ऐप्लिकेशन उपयोगकर्ता को एक प्रॉम्प्ट दिखाता है. इसमें उपयोगकर्ता से एक छोटे स्टेटमेंट को स्वीकार करने के लिए कहा जाता है. इस स्टेटमेंट से, संवेदनशील लेन-देन को पूरा करने के उपयोगकर्ता के इंटेंट की पुष्टि होती है.

अगर उपयोगकर्ता स्टेटमेंट स्वीकार करता है, तो आपका ऐप्लिकेशन डायलॉग बॉक्स में दिखाए गए मैसेज पर हस्ताक्षर करने के लिए, Android Keystore में मौजूद किसी पासकोड का इस्तेमाल कर सकता है. हस्ताक्षर में दी गई जानकारी से पता चलता है कि यह भरोसा होता है कि उपयोगकर्ता ने स्टेटमेंट देख लिया है और वह उससे सहमत है.

चेतावनी: Android Protected Confirmation, उपयोगकर्ता को जानकारी का सुरक्षित चैनल उपलब्ध नहीं कराता. आपका ऐप्लिकेशन यह नहीं मान सकता कि Android प्लैटफ़ॉर्म पर दी जाने वाली जानकारी के अलावा, गोपनीयता की गारंटी भी दी जाती है. तय सीमा में खास तौर पर, इस वर्कफ़्लो का इस्तेमाल ऐसी संवेदनशील जानकारी को दिखाने के लिए न करें जिसे आम तौर पर, उपयोगकर्ता के डिवाइस पर नहीं दिखती है.

उपयोगकर्ता के मैसेज की पुष्टि करने के बाद, मैसेज की पूरी सुरक्षा की गारंटी मिल जाती है. हालांकि, हस्ताक्षर किए गए मैसेज की गोपनीयता बनाए रखने के लिए, आपके ऐप्लिकेशन को अब भी ट्रांसफ़र के दौरान डेटा को एन्क्रिप्ट (सुरक्षित) करने के तरीके का इस्तेमाल करना होगा.

अपने ऐप्लिकेशन में, उपयोगकर्ता की पुष्टि करने के लिए ज़्यादा भरोसेमंद तरीका इस्तेमाल करने की सुविधा देने के लिए, यह तरीका अपनाएं:

  1. एसिमेट्रिक साइनिंग पासकोड जनरेट करना इसका इस्तेमाल करके KeyGenParameterSpec.Builder क्लास. कुंजी बनाते समय, true को setUserConfirmationRequired(). साथ ही, setAttestationChallenge() पर कॉल करें, भरोसेमंद पक्ष से मिली ज़रूरत के मुताबिक चैलेंज वैल्यू पास करना.

  2. जनरेट की गई नई कुंजी और उसके प्रमाणित करने के सर्टिफ़िकेट को इस कोड की मदद से रजिस्टर करें के हिसाब से सही है.

  3. अपने सर्वर को लेन-देन की जानकारी भेजें और अपने सर्वर पर अतिरिक्त डेटा का बाइनरी लार्ज ऑब्जेक्ट (बीएलओबी). अतिरिक्त डेटा में ऐसा डेटा जिसकी पुष्टि होनी चाहिए या पार्स करने से जुड़े संकेत, जैसे कि प्रॉम्प्ट स्ट्रिंग की स्थान-भाषा.

    ज़्यादा सुरक्षित तरीके से लागू करने के लिए, ब्लॉब में क्रिप्टोग्राफ़िक वन्सिस्ट (nonce) होना चाहिए. इससे, रीप्ले अटैक से सुरक्षा मिलती है और लेन-देन के बीच अंतर किया जा सकता है.

  4. ConfirmationCallback ऑब्जेक्ट सेट अप करें. इससे आपके ऐप्लिकेशन को यह पता चलता है कि उपयोगकर्ता ने पुष्टि करने वाले डायलॉग में दिखाए गए प्रॉम्प्ट को स्वीकार कर लिया है या नहीं:

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

    अगर उपयोगकर्ता डायलॉग को मंज़ूरी देता है, तो onConfirmed() कॉलबैक यह होता है कॉल किया गया. dataThatWasConfirmed BLOB, CBOR डेटा स्ट्रक्चर, जिसमें यह शामिल हो, अन्य जानकारी के साथ-साथ, उपयोगकर्ता ने प्रॉम्प्ट के जिस टेक्स्ट को देखा वह डेटा जिसे आपने ConfirmationPrompt बिल्डर. हस्ताक्षर करने के लिए पहले से बनाई गई कुंजी का उपयोग करें dataThatWasConfirmed BLOB, फिर इस BLOB को पास करें हस्ताक्षर और लेन-देन की जानकारी, भरोसेमंद पक्ष को दें.

    Android Protected की सुरक्षा का पूरा इस्तेमाल करने के लिए पुष्टि करने से जुड़े ऑफ़र के लिए, भरोसेमंद पक्ष को ये चरण पूरे करने होंगे हमें हस्ताक्षर किया गया मैसेज मिला है:

    1. मैसेज पर हस्ताक्षर की जांच करें. साथ ही, हस्ताक्षर करने वाली कुंजी के पुष्टि करने वाले सर्टिफ़िकेट की चेन की भी जांच करें.
    2. देखें कि पुष्टि करने वाले सर्टिफ़िकेट में TRUSTED_CONFIRMATION_REQUIRED फ़्लैग सेट है या नहीं. इससे पता चलता है कि हस्ताक्षर करने वाली कुंजी के लिए, भरोसेमंद उपयोगकर्ता की पुष्टि ज़रूरी है. अगर हस्ताक्षर करने वाली कुंजी आरएसए पासकोड है, तो देखें कि उसमें PURPOSE_ENCRYPT या PURPOSE_DECRYPT प्रॉपर्टी न हो.
    3. extraData की जांच करके पक्का करें कि पुष्टि करने वाला यह मैसेज इससे जुड़ा है नया अनुरोध किया गया है. इसे अभी तक प्रोसेस नहीं किया गया है. यह चरण, रिप्ले हमलों से बचाता है.
    4. पुष्टि की गई कार्रवाई या अनुरोध के बारे में जानकारी के लिए, promptText को पार्स करें. याद रखें कि promptText ही मैसेज का वह हिस्सा होता है जिसमें उपयोगकर्ता ने असल में पुष्टि की है. भरोसा करने वाले पक्ष को यह कभी नहीं मानना चाहिए कि extraData में शामिल किया गया कन्फ़र्म डेटा, promptText से मेल खाता है.
  5. डायलॉग को खुद दिखाने के लिए, नीचे दिए गए कोड स्निपेट में दिखाए गए लॉजिक के जैसे लॉजिक जोड़ें:

    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);

अन्य संसाधन

Android की सुरक्षा की पुष्टि के बारे में ज़्यादा जानकारी के लिए, ये देखें संसाधन.

ब्लॉग