অ্যান্ড্রয়েড সুরক্ষিত নিশ্চিতকরণ

ব্যবহারকারীরা যখন কোনও সংবেদনশীল লেনদেন শুরু করেন, যেমন পেমেন্ট করার সময়, তখন তাদের উদ্দেশ্য নিশ্চিত করতে আপনাকে সাহায্য করার জন্য, Android 9 (API লেভেল 28) বা তার বেশি ভার্সন চালিত সমর্থিত ডিভাইসগুলি আপনাকে Android Protected Confirmation ব্যবহার করতে দেয়। এই ওয়ার্কফ্লো ব্যবহার করার সময়, আপনার অ্যাপ ব্যবহারকারীকে একটি প্রম্পট প্রদর্শন করে, যাতে তাদের সংবেদনশীল লেনদেন সম্পন্ন করার ইচ্ছাকে পুনরায় নিশ্চিত করে এমন একটি সংক্ষিপ্ত বিবৃতি অনুমোদন করতে বলা হয়।

যদি ব্যবহারকারী বিবৃতিটি গ্রহণ করেন, তাহলে আপনার অ্যাপটি ডায়ালগে প্রদর্শিত বার্তাটিতে স্বাক্ষর করার জন্য Android Keystore থেকে একটি কী ব্যবহার করতে পারে। স্বাক্ষরটি অত্যন্ত আত্মবিশ্বাসের সাথে নির্দেশ করে যে ব্যবহারকারী বিবৃতিটি দেখেছেন এবং এতে সম্মত হয়েছেন।

সতর্কতা: অ্যান্ড্রয়েড সুরক্ষিত নিশ্চিতকরণ ব্যবহারকারীর জন্য কোনও সুরক্ষিত তথ্য চ্যানেল সরবরাহ করে না। আপনার অ্যাপটি অ্যান্ড্রয়েড প্ল্যাটফর্মের অফারগুলির বাইরে কোনও গোপনীয়তার গ্যারান্টি গ্রহণ করতে পারে না। বিশেষ করে, এই ওয়ার্কফ্লো ব্যবহার করে এমন সংবেদনশীল তথ্য প্রদর্শন করবেন না যা আপনি সাধারণত ব্যবহারকারীর ডিভাইসে দেখান না।

ব্যবহারকারী বার্তাটি নিশ্চিত করার পরে, বার্তাটির অখণ্ডতা নিশ্চিত করা হয়, তবে স্বাক্ষরিত বার্তার গোপনীয়তা রক্ষা করার জন্য আপনার অ্যাপটিকে এখনও ডেটা-ইন-ট্রানজিট এনক্রিপশন ব্যবহার করতে হবে।

আপনার অ্যাপে উচ্চ-নিশ্চয়তা ব্যবহারকারী নিশ্চিতকরণের জন্য সহায়তা প্রদান করতে, নিম্নলিখিত পদক্ষেপগুলি সম্পূর্ণ করুন:

  1. KeyGenParameterSpec.Builder ক্লাস ব্যবহার করে একটি অ্যাসিমেট্রিক সাইনিং কী তৈরি করুন । কী তৈরি করার সময়, setUserConfirmationRequired() তে true পাস করুন। এছাড়াও, setAttestationChallenge() কল করুন, নির্ভরকারী পক্ষ দ্বারা প্রদত্ত একটি উপযুক্ত চ্যালেঞ্জ মান পাস করুন।

  2. নতুন তৈরি হওয়া কী এবং আপনার কী-এর প্রত্যয়ন শংসাপত্রটি উপযুক্ত নির্ভরকারী পক্ষের সাথে নথিভুক্ত করুন।

  3. আপনার সার্ভারে লেনদেনের বিবরণ পাঠান এবং এটিকে অতিরিক্ত ডেটার একটি বাইনারি লার্জ অবজেক্ট (BLOB) তৈরি করতে এবং ফেরত পাঠাতে বলুন। অতিরিক্ত ডেটাতে নিশ্চিত হতে থাকা ডেটা বা পার্সিং ইঙ্গিত অন্তর্ভুক্ত থাকতে পারে, যেমন প্রম্পট স্ট্রিংয়ের লোকেল।

    আরও নিরাপদ বাস্তবায়নের জন্য, BLOB-তে রিপ্লে আক্রমণের বিরুদ্ধে সুরক্ষা এবং লেনদেন দ্ব্যর্থতা নিরসনের জন্য একটি ক্রিপ্টোগ্রাফিক নন্স থাকতে হবে।

  4. ConfirmationCallback অবজেক্ট সেট আপ করুন যা আপনার অ্যাপকে জানিয়ে দেবে যখন ব্যবহারকারী কনফার্মেশন ডায়ালগে দেখানো প্রম্পটটি গ্রহণ করেছে:

    কোটলিন

    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টি নির্ভরকারী পক্ষের কাছে ফেরত পাঠান।

    অ্যান্ড্রয়েড প্রোটেক্টেড কনফার্মেশন যে নিরাপত্তা নিশ্চয়তা প্রদান করে তার পূর্ণ ব্যবহার করতে, নির্ভরশীল পক্ষকে স্বাক্ষরিত বার্তা পাওয়ার পর নিম্নলিখিত পদক্ষেপগুলি সম্পাদন করতে হবে:

    1. বার্তাটির উপর স্বাক্ষর এবং স্বাক্ষরকারী কী-এর প্রত্যয়ন শংসাপত্রের চেইন পরীক্ষা করুন।
    2. যাচাই করুন যে প্রত্যয়ন শংসাপত্রটিতে TRUSTED_CONFIRMATION_REQUIRED ফ্ল্যাগ সেট আছে, যা নির্দেশ করে যে স্বাক্ষরকারী কীটির জন্য বিশ্বস্ত ব্যবহারকারীর নিশ্চিতকরণ প্রয়োজন। যদি স্বাক্ষরকারী কীটি একটি RSA কী হয়, তাহলে পরীক্ষা করুন যে এতে PURPOSE_ENCRYPT বা PURPOSE_DECRYPT বৈশিষ্ট্য নেই।
    3. এই নিশ্চিতকরণ বার্তাটি একটি নতুন অনুরোধের এবং এখনও প্রক্রিয়া করা হয়নি তা নিশ্চিত করতে extraData পরীক্ষা করুন। এই পদক্ষেপটি রিপ্লে আক্রমণ থেকে রক্ষা করে।
    4. নিশ্চিত করা পদক্ষেপ বা অনুরোধ সম্পর্কে তথ্যের জন্য promptText পার্স করুন। মনে রাখবেন যে promptText হল বার্তার একমাত্র অংশ যা ব্যবহারকারী আসলে নিশ্চিত করেছেন। নির্ভরকারী পক্ষ কখনই ধরে নেবে না যে extraData তে অন্তর্ভুক্ত নিশ্চিত করা ডেটা promptText এর সাথে মিলে যায়।
  5. ডায়ালগটি প্রদর্শনের জন্য নিম্নলিখিত কোড স্নিপেটে দেখানো লজিকের অনুরূপ লজিক যুক্ত করুন:

    কোটলিন

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

অতিরিক্ত সম্পদ

অ্যান্ড্রয়েড সুরক্ষিত নিশ্চিতকরণ সম্পর্কে আরও তথ্যের জন্য, নিম্নলিখিত সংস্থানগুলি দেখুন।

ব্লগ