যখন ব্যবহারকারীরা পেমেন্ট করার মতো কোনো সংবেদনশীল লেনদেন শুরু করেন, তখন তাদের অভিপ্রায় নিশ্চিত করতে আপনাকে সাহায্য করার জন্য, Android 9 (API লেভেল 28) বা তার উচ্চতর সংস্করণে চালিত সমর্থিত ডিভাইসগুলো আপনাকে Android Protected Confirmation ব্যবহার করার সুযোগ দেয়। এই কার্যপ্রণালী ব্যবহার করার সময়, আপনার অ্যাপ ব্যবহারকারীকে একটি প্রম্পট দেখায়, যেখানে সংবেদনশীল লেনদেনটি সম্পন্ন করার অভিপ্রায় পুনর্ব্যক্ত করে একটি সংক্ষিপ্ত বিবৃতি অনুমোদন করতে বলা হয়।
যদি ব্যবহারকারী বিবৃতিটি গ্রহণ করেন, তাহলে আপনার অ্যাপ অ্যান্ড্রয়েড কীস্টোর থেকে একটি কী ব্যবহার করে ডায়ালগে দেখানো বার্তাটিতে স্বাক্ষর করতে পারে। এই স্বাক্ষরটি অত্যন্ত নিশ্চিতভাবে নির্দেশ করে যে, ব্যবহারকারী বিবৃতিটি দেখেছেন এবং এতে সম্মত হয়েছেন।
সতর্কতা: অ্যান্ড্রয়েড প্রোটেক্টেড কনফার্মেশন ব্যবহারকারীর জন্য কোনো সুরক্ষিত তথ্য চ্যানেল প্রদান করে না। অ্যান্ড্রয়েড প্ল্যাটফর্ম যে গোপনীয়তার নিশ্চয়তা দেয়, আপনার অ্যাপ তার বাইরে অন্য কোনো নিশ্চয়তা দিতে পারে না। বিশেষ করে, এমন কোনো সংবেদনশীল তথ্য প্রদর্শন করতে এই ওয়ার্কফ্লো ব্যবহার করবেন না যা আপনি সাধারণত ব্যবহারকারীর ডিভাইসে দেখান না।
ব্যবহারকারী বার্তাটি নিশ্চিত করার পর, বার্তাটির অখণ্ডতা নিশ্চিত হয়, কিন্তু স্বাক্ষরিত বার্তাটির গোপনীয়তা রক্ষা করার জন্য আপনার অ্যাপকে অবশ্যই ডেটা-ইন-ট্রানজিট এনক্রিপশন ব্যবহার করতে হবে।
আপনার অ্যাপে উচ্চ-নিশ্চয়তার ব্যবহারকারী নিশ্চিতকরণের সুবিধা যোগ করতে, নিম্নলিখিত ধাপগুলো সম্পন্ন করুন:
KeyGenParameterSpec.Builderক্লাস ব্যবহার করে একটি অ্যাসিমেট্রিক সাইনিং কী তৈরি করুন । কী তৈরি করার সময়,setUserConfirmationRequired()-এtrueপাস করুন। এছাড়াও, রিলায়িং পার্টি দ্বারা প্রদত্ত একটি উপযুক্ত চ্যালেঞ্জ ভ্যালু পাস করেsetAttestationChallenge()কল করুন।নতুন তৈরি করা কী এবং আপনার কী-এর অ্যাটেস্টেশন সার্টিফিকেটটি উপযুক্ত রিলায়িং পার্টির কাছে নথিভুক্ত করুন।
আপনার সার্ভারে লেনদেনের বিবরণ পাঠান এবং সার্ভারকে অতিরিক্ত ডেটার একটি বাইনারি লার্জ অবজেক্ট (BLOB) তৈরি করে ফেরত পাঠাতে বলুন। অতিরিক্ত ডেটার মধ্যে নিশ্চিত করার জন্য প্রয়োজনীয় তথ্য অথবা পার্সিং সংক্রান্ত ইঙ্গিত, যেমন প্রম্পট স্ট্রিং-এর লোকেল, অন্তর্ভুক্ত থাকতে পারে।
আরও সুরক্ষিত বাস্তবায়নের জন্য, রিপ্লে অ্যাটাক থেকে সুরক্ষা এবং ট্রানজ্যাকশনগুলোর মধ্যে দ্ব্যর্থতা নিরূপণ করতে BLOB-এ অবশ্যই একটি ক্রিপ্টোগ্রাফিক ননস থাকতে হবে।
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()কলব্যাকটি কল করা হয়।dataThatWasConfirmedBLOB হলো একটি CBOR ডেটা স্ট্রাকচার , যাতে অন্যান্য বিবরণের পাশাপাশি ব্যবহারকারীর দেখা প্রম্পট টেক্সট এবংConfirmationPromptবিল্ডারে আপনার দেওয়া অতিরিক্ত ডেটাও থাকে। পূর্বে তৈরি করা কী-টি ব্যবহার করেdataThatWasConfirmedBLOB-টিতে স্বাক্ষর করুন, তারপর এই BLOB-টি, স্বাক্ষর এবং লেনদেনের বিবরণসহ, রিলায়িং পার্টির কাছে ফেরত পাঠান।অ্যান্ড্রয়েড প্রোটেক্টেড কনফার্মেশন যে নিরাপত্তা নিশ্চয়তা প্রদান করে তার পূর্ণ সদ্ব্যবহার করতে, একটি স্বাক্ষরিত বার্তা পাওয়ার পর নির্ভরকারী পক্ষকে অবশ্যই নিম্নলিখিত পদক্ষেপগুলি সম্পাদন করতে হবে:
- বার্তার উপর থাকা স্বাক্ষর এবং সেইসাথে স্বাক্ষরকারী কী-এর সত্যায়ন শংসাপত্রের চেইন যাচাই করুন।
- যাচাই করুন যে অ্যাটেস্টেশন সার্টিফিকেটে
TRUSTED_CONFIRMATION_REQUIREDফ্ল্যাগটি সেট করা আছে কিনা, যা নির্দেশ করে যে সাইনিং কী-টির জন্য একজন বিশ্বস্ত ব্যবহারকারীর নিশ্চিতকরণ প্রয়োজন। যদি সাইনিং কী-টি একটি RSA কী হয়, তবে যাচাই করুন যে এতেPURPOSE_ENCRYPTবাPURPOSE_DECRYPTপ্রপার্টি নেই। - এই নিশ্চিতকরণ বার্তাটি একটি নতুন অনুরোধের অন্তর্গত এবং এখনও প্রক্রিয়া করা হয়নি, তা নিশ্চিত করতে
extraDataপরীক্ষা করুন। এই পদক্ষেপটি রিপ্লে অ্যাটাক থেকে সুরক্ষা প্রদান করে। - নিশ্চিত করা অ্যাকশন বা অনুরোধ সম্পর্কে তথ্যের জন্য
promptTextপার্স করুন। মনে রাখবেন যে,promptTextহলো বার্তার একমাত্র অংশ যা ব্যবহারকারী প্রকৃতপক্ষে নিশ্চিত করেছেন। নির্ভরকারী পক্ষকে কখনোই ধরে নেওয়া উচিত নয় যেextraDataতে অন্তর্ভুক্ত নিশ্চিত করার জন্য নির্ধারিত ডেটাpromptTextএর অনুরূপ।
ডায়ালগটি প্রদর্শন করার জন্য নিম্নলিখিত কোড স্নিপেটে দেখানো লজিকের অনুরূপ লজিক যোগ করুন:
কোটলিন
// 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);
অতিরিক্ত সম্পদ
অ্যান্ড্রয়েড প্রোটেক্টেড কনফার্মেশন সম্পর্কে আরও তথ্যের জন্য, নিম্নলিখিত রিসোর্সগুলো দেখুন।