এই নির্দেশিকা থেকে জানা যাবে যে কীভাবে রিলাইং পার্টি (RP) এবং রিডার ডেভেলপাররা আন্তর্জাতিক ISO/IEC 18013-5 স্ট্যান্ডার্ড অনুযায়ী Google Wallet থেকে দেখানো ডিজিটাল ক্রেডেনশিয়ালের ইন-পার্সন (অফলাইন) যাচাইকরণ প্রয়োগ করতে পারবেন।
Google Wallet-এ ডিজিটাল ক্রেডেনশিয়াল ফিজিক্যাল পরিবেশে (যেমন, পয়েন্ট-অফ-সেল টার্মিনাল, ইভেন্ট ভেন্যু, ট্রানজিট গেট, আইন এনফোর্সমেন্ট রিডার এবং মোবাইল রিডার অ্যাপ) নিরাপদে যাচাই করা যেতে পারে। এর জন্য দেখানোর সময় অ্যাক্টিভ ইন্টারনেট কানেকশনের প্রয়োজন হয় না।
অফলাইন প্রেজেন্টেশনের ওভারভিউ (ISO/IEC 18013-5)
ISO/IEC 18013-5 স্ট্যান্ডার্ড, হোল্ডার (Google Wallet চলছে এমন ব্যবহারকারীর মোবাইল ডিভাইস) এবং রিডার / যাচাইকারী (একটি ফিজিক্যাল টার্মিনাল বা কম্প্যানিয়ন মোবাইল অ্যাপ)-এর মধ্যে অফলাইন প্রেজেন্টেশনের জন্য একটি স্ট্যান্ডার্ডাইজড, ইন্টারঅপারেবল প্রোটোকল সংজ্ঞায়িত করে।
প্রেজেন্টেশনের ফ্লো বিভিন্ন পর্যায়ে হয়:
- ডিভাইস এনগেজমেন্ট: রিডার ও Wallet, NFC ট্যাপ (স্ট্যাটিক বা নেগোশিয়েটেড হ্যান্ডওভার) বা QR কোড স্ক্যান করার মাধ্যমে প্রাথমিক যোগাযোগ স্থাপন করে। এই ফেজে, ডিভাইসের এনগেজমেন্ট মেটাডেটা ও রিডারের ক্ষণস্থায়ী সর্বজনীন কী (
EReaderKey) এক্সচেঞ্জ করা হয়। - ডেটা ট্রান্সপোর্ট কানেকশন: একটি সুরক্ষিত, এনক্রিপ্ট করা ব্লুটুথ লো এনার্জি (BLE) চ্যানেল নেগোশিয়েট করা হয় (রিডার সেন্ট্রাল ক্লায়েন্ট বা পেরিফেরাল সার্ভার মোডে কাজ করে)।
- ডিভাইস অনুরোধ: রিডার CBOR-এনকোড করা
DeviceRequestট্রান্সমিট করে, যা অনুরোধ করা ডকুমেন্টের ধরন (যেমনorg.iso.18013.5.1.mDL) এবং অনুরোধ করা নির্দিষ্ট নেমস্পেস ও ডেটা এলিমেন্ট উল্লেখ করে। - ব্যবহারকারীর সম্মতি ও ডিভাইস যাচাইকরণ: Google Wallet ব্যবহারকারীকে অনুরোধ করা ডেটা এলিমেন্ট পর্যালোচনা করতে এবং বায়োমেট্রিক যাচাইকরণ বা স্ক্রিন লক ব্যবহার করে শেয়ার করার বিষয়টি কনফার্ম করতে প্রম্পট করে।
- ডিভাইসের উত্তর ও ক্রিপ্টোগ্রাফিক যাচাইকরণ: ওয়ালেট CBOR-এনকোড করা
DeviceResponseফেরত পাঠায় যাতে স্বাক্ষরিত মোবাইল নিরাপত্তা অবজেক্ট (MSO) ও ডিভাইস-স্বাক্ষরিত ডেটা এলিমেন্ট থাকে। রিডার বিশ্বস্ত রুট সার্টিফিকেটের সাথে ক্রিপ্টোগ্রাফিক স্বাক্ষর যাচাই করে।
Multipaz ওপেন-সোর্স SDK
রিডার বা যাচাইকারী অ্যাপ্লিকেশন প্রয়োগ করতে, Google Multipaz ব্যবহার করার সাজেশন দেয়, এটি একটি ওপেন-সোর্স Kotlin Multiplatform (KMP) SDK যা মূলত Google ডেভেলপ করেছে এবং OpenWallet Foundation (OWF)-এ কন্ট্রিবিউট করেছে।
Multipaz, ISO/IEC 18013-5 রিডার ও ওয়ালেট প্রোটোকল, ক্রিপ্টোগ্রাফিক যাচাইকরণ পাইপলাইন, CBOR এনকোডিং/ডিকোডিং এবং এক্সটেনসিবল ডকুমেন্ট টাইপ স্কিমার প্রোডাকশন-রেডি ইমপ্লিমেন্টেশন প্রদান করে।
আপনার রিডার অ্যাপে Multipaz ইন্টিগ্রেট করা
নিম্নলিখিত ধাপগুলি দেখায় যে কীভাবে Multipaz SDK একটি Android রিডার অ্যাপ্লিকেশনে ইন্টিগ্রেট করা যায়।
ধাপ ১: ডিপেন্ডেন্সি যোগ করুন
Multipaz লাইব্রেরি Maven Central-এ প্রকাশ করা হয়। আপনার অ্যাপ্লিকেশনের build.gradle.kts ফাইলে প্রয়োজনীয় মডিউল যোগ করুন:
// build.gradle.kts
dependencies {
// Core Multipaz library (protocol engine, CBOR, crypto)
implementation("org.multipaz:multipaz:0.100.0")
// Android-specific platform bindings (NFC, BLE, Keystore)
implementation("org.multipaz:multipaz-android:0.100.0")
// Standardized document types (mDL, EU PID, etc.)
implementation("org.multipaz:multipaz-doctypes:0.100.0")
}
ধাপ ২: Android-এর অনুমতি কনফিগার করা
ব্যক্তিগতভাবে যাচাইকরণের জন্য NFC এনগেজমেন্ট, ক্যামেরা স্ক্যানিং (QR এনগেজমেন্টের জন্য) এবং ব্লুটুথ লো এনার্জি ডেটা ট্রান্সপোর্টের জন্য হার্ডওয়্যার অনুমতির প্রয়োজন। আপনার AndroidManifest.xml-এ নিম্নলিখিত অনুমতি যোগ করুন:
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<!-- NFC Engagement -->
<uses-permission android:name="android.permission.NFC" />
<uses-feature android:name="android.hardware.nfc" android:required="false" />
<!-- Camera for QR Code Engagement -->
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" android:required="false" />
<!-- Bluetooth Low Energy Transport (Android 12+) -->
<uses-permission android:name="android.permission.BLUETOOTH_SCAN"
android:usesPermissionFlags="neverForLocation" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" />
<!-- Legacy Bluetooth Permissions for Android 11 and lower -->
<uses-permission android:name="android.permission.BLUETOOTH"
android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"
android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"
android:maxSdkVersion="30" />
</manifest>
ধাপ ৩: যাচাইকরণ ইঞ্জিন শুরু করা
এনগেজমেন্ট ইভেন্ট ম্যানেজ করতে এবং BLE কমিউনিকেশন লাইফসাইকেল ম্যানেজ করতে Multipaz-এর VerificationHelper বা Reader কানেকশন অ্যাবস্ট্রাকশন ব্যবহার করুন:
import org.multipaz.verification.VerificationHelper
import org.multipaz.cbor.Cbor
import org.multipaz.crypto.Crypto
class ReaderManager(private val context: android.content.Context) {
private var verificationHelper: VerificationHelper? = null
fun startListeningForEngagement() {
verificationHelper = VerificationHelper.Builder(
context = context,
listener = object : VerificationHelper.Listener {
override fun onDeviceConnected() {
// BLE channel established, send request
sendDeviceRequest()
}
override fun onResponseReceived(deviceResponseBytes: ByteArray) {
// Process and verify the received credential payload
handleDeviceResponse(deviceResponseBytes)
}
override fun onError(error: Throwable) {
// Handle transport or protocol errors
}
override fun onDeviceDisconnected(transportTransportSpecificTermination: Boolean) {
// Connection closed
}
}
).build()
}
}
ধাপ ৪: DeviceRequest তৈরি করা
আপনার অ্যাপ্লিকেশনকে যাচাই করতে হবে এমন ডকুমেন্টের ধরন এবং ব্যক্তিগত ডেটা এলিমেন্ট উল্লেখ করুন। সবসময় ন্যূনতম তথ্য প্রকাশ করার নীতি প্রয়োগ করুন (যেমন, বয়স যাচাই করার সময় সম্পূর্ণ birth_date-এর পরিবর্তে শুধু age_over_21-এর জন্য অনুরোধ করা):
fun sendDeviceRequest() {
// Specify the DocType and requested elements
val docType = "org.iso.18013.5.1.mDL"
val namespace = "org.iso.18013.5.1"
// Map of requested elements: elementName -> intentToRetain
val requestedElements = mapOf(
"family_name" to false,
"given_name" to false,
"age_over_21" to false,
"portrait" to false,
"driving_privileges" to false
)
// Build ISO/IEC 18013-5 DeviceRequest structure
val deviceRequestBytes = verificationHelper?.buildDeviceRequest(
docType = docType,
itemsToRequest = mapOf(namespace to requestedElements)
)
if (deviceRequestBytes != null) {
verificationHelper?.sendDeviceRequest(deviceRequestBytes)
}
}
অতিরিক্ত ডকুমেন্ট টাইপ (DocTypes) সাপোর্ট করা
Multipaz স্ট্যান্ডার্ডাইজড ক্রেডেনশিয়ালকে আউট-অফ-দ্য-বক্স হিসেবে সাপোর্ট করে এবং কাস্টম বা ডোমেন-নির্দিষ্ট ডকুমেন্টের ধরন অনুরোধ করার জন্য একটি এক্সটেনসিবল আর্কিটেকচার প্রদান করে।
১. বিল্ট-ইন স্ট্যান্ডার্ড ডকুমেন্টের ধরন
multipaz-doctypes লাইব্রেরি স্ট্যান্ডার্ড ক্রেডেনশিয়ালের জন্য আগে থেকে নির্ধারিত স্কিমা মডেল প্রদান করে:
| ডকুমেন্টের ধরন শনাক্তকারী | স্ট্যান্ডার্ড / স্কোপ | সাধারণ নেমস্পেস | সাধারণ এলিমেন্ট |
|---|---|---|---|
org.iso.18013.5.1.mDL |
ISO/IEC 18013-5 মোবাইল ড্রাইভিং লাইসেন্স | org.iso.18013.5.1 |
family_name, given_name, birth_date, issue_date, expiry_date, issuing_authority, document_number, portrait, driving_privileges, age_over_18, age_over_21 |
eu.europa.ec.eudi.pid.1 |
EU ডিজিটাল আইডেন্টিটি ওয়ালেট (EUDIW) ব্যক্তির শনাক্তকরণ ডেটা | eu.europa.ec.eudi.pid.1 |
family_name, first_name, birth_date, nationality, issuing_country, issuing_authority, personal_administrative_number |
com.google.wallet.idcard.1 |
Google Wallet ID পাস / টেস্ট আইডি | com.google.wallet.idcard.1 |
given_name, family_name, birth_date, document_number, portrait |
২. কাস্টম ডকুমেন্টের ধরন সম্পর্কে অনুরোধ করা হচ্ছে
কাস্টম ডকুমেন্টের ধরন সম্পর্কে অনুরোধ করতে, DeviceRequest তৈরি করার সময় টার্গেট docType স্ট্রিং ও সংশ্লিষ্ট নেমস্পেস ম্যাপিং নির্ধারণ করুন:
// Example: Requesting a custom event ticket credential
val customDocType = "com.example.events.ticket"
val customNamespace = "com.example.events.ticket.1"
val customRequestedItems = mapOf(
"ticket_id" to false,
"event_name" to false,
"seat_section" to false,
"vip_access" to false
)
val multiDocRequestBytes = verificationHelper?.buildMultiDocDeviceRequest(
documents = listOf(
DocumentRequest(
docType = customDocType,
namespaces = mapOf(customNamespace to customRequestedItems)
)
)
)
ক্রিপ্টোগ্রাফিক যাচাইকরণ ও ট্রাস্ট ম্যানেজমেন্ট
উত্তর পেলোড পাওয়া হল প্রথম ধাপ। পাঠকদের অবশ্যই চার-ধাপের ক্রিপ্টোগ্রাফিক যাচাইকরণ করতে হবে যাতে উপস্থাপিত ক্রেডেনশিয়ালের সত্যতা এবং সততা যাচাই করা যায়।
| যাচাইকরণের ধাপ | যাচাইকরণের টার্গেট |
|---|---|
| ১. ইস্যুকারী যাচাইকরণ | বিশ্বস্ত IACA রুট সার্টিফিকেটের সাথে IssuerAuth (COSE_Sign1) যাচাই করুন |
| ২. বৈধতার উইন্ডো চেক | নিশ্চিত করুন যে validFrom ≤ বর্তমান সময় ≤ validUntil |
| ৩. ডেটা ইন্টিগ্রিটি চেক | ফেরত পাঠানো এলিমেন্টের SHA-256 ডাইজেস্ট গণনা করুন এবং MSO ValueDigests-এর সাথে ম্যাচ করুন |
| ৪. ডিভাইস যাচাইকরণ | SessionTranscript-এর সাথে বাউন্ড করা DeviceKey ব্যবহার করে DeviceSigned সিগনেচার বা MAC যাচাই করুন |
১. ৪-ধাপে যাচাইকরণ পাইপলাইন
- ইস্যুকারী যাচাইকরণ (
IssuerAuth):- মোবাইল নিরাপত্তা অবজেক্ট (MSO) ইস্যুকারী কর্তৃপক্ষ (
IssuerAuthপেলোড) দ্বারা স্বাক্ষরিত হয়। - রিডার ডকুমেন্ট সাইনার সার্টিফিকেট ব্যবহার করে
COSE_Sign1-এর স্বাক্ষর যাচাই করে এবং নিশ্চিত করে যে সার্টিফিকেটটি একটি বিশ্বস্ত ইস্যুকারী কর্তৃপক্ষ CA (IACA) রুট সার্টিফিকেটের সাথে যুক্ত।
- মোবাইল নিরাপত্তা অবজেক্ট (MSO) ইস্যুকারী কর্তৃপক্ষ (
- বৈধতার উইন্ডো যাচাইকরণ:
- ক্রেডেনশিয়ালের মেয়াদ শেষ হয়ে যায়নি তা নিশ্চিত করতে, রিডার, MSO-তে
validityInfo.validFromএবংvalidityInfo.validUntilটাইমস্ট্যাম্প রিডারের বর্তমান ঘড়ির সাথে মিলিয়ে দেখে।
- ক্রেডেনশিয়ালের মেয়াদ শেষ হয়ে যায়নি তা নিশ্চিত করতে, রিডার, MSO-তে
- ডেটা ইন্টিগ্রিটি যাচাইকরণ (
ValueDigests):- প্রতিটি প্রাপ্ত
IssuerSignedItem-এর জন্য, রিডার তার ডাইজেস্ট (যেমন SHA-256) গণনা করে এবং যাচাই করে যে এটি MSO-এরValueDigestsডিকশনারিতে সংশ্লিষ্ট হ্যাশ এন্ট্রির সাথে মেলে।
- প্রতিটি প্রাপ্ত
- ডিভাইস যাচাইকরণ (
DeviceSigned):- রিডার যাচাই করে যে ক্রেডেনশিয়াল দেখানো ডিভাইসে সাইন করা MSO-এর মধ্যে প্রকাশিত
DeviceKey-এর সাথে সম্পর্কিত ব্যক্তিগত কী আছে। SessionTranscript-এর মাধ্যমেDeviceAuth(DeviceSignatureঅথবাDeviceMac) যাচাই করে, সেশনকে রিডারের ক্ষণস্থায়ী 'কী'-এর সাথে বাইন্ড করে এবং রিপ্লে ও ম্যান-ইন-দ্য-মিডল অ্যাটাক প্রতিরোধ করে এটি করা হয়।
- রিডার যাচাই করে যে ক্রেডেনশিয়াল দেখানো ডিভাইসে সাইন করা MSO-এর মধ্যে প্রকাশিত
২. বিশ্বস্ত IACA রুট সার্টিফিকেট ম্যানেজ করা
প্রোডাকশন রিডারকে অবশ্যই একটি সুরক্ষিত, স্থানীয় ট্রাস্ট স্টোর বজায় রাখতে হবে যাতে বিশ্বস্ত IACA রুট সার্টিফিকেট থাকে:
- প্রোডাকশন IACA সার্টিফিকেট: অফিসিয়াল ইস্যুকারী কর্তৃপক্ষের থেকে রুট সার্টিফিকেট ডাউনলোড ও কনফিগার করুন। আমাদের কাজ করে এমন ইস্যুকারী এবং IACA সার্টিফিকেট-এর তালিকা দেখুন।
- AAMVA VICAL: মার্কিন যুক্তরাষ্ট্রের বিচারব্যবস্থার জন্য, রিডার সিস্টেমগুলি আমেরিকান অ্যাসোসিয়েশন অফ মোটর ভেহিকেল অ্যাডমিনিস্ট্রেটর (AAMVA) ভেরিফায়েড ইস্যুকারী সার্টিফিকেট অথরিটি লিস্ট (VICAL) পরিষেবার সাথে ইন্টিগ্রেট করতে পারে যাতে স্টেট ট্রাস্ট অ্যাঙ্করগুলি অটোমেটিক সিঙ্ক করা যায়।
- স্যান্ডবক্স টেস্টিং রুট: স্যান্ডবক্স ক্রেডেনশিয়ালের সাথে তুলনা করে পরীক্ষা করার সময়, রিডার যাতে Google Sandbox IACA রুট বিশ্বাস করে তা নিশ্চিত করুন।
import org.multipaz.crypto.X509Cert
// Configure trusted IACA certificates in the trust store
val trustedCertificates = mutableListOf<X509Cert>()
// Add official state IACA certificates
trustedCertificates.add(X509Cert.fromPem(sampleStateIacaPem))
// Add Google Sandbox IACA root certificate for testing
trustedCertificates.add(X509Cert.fromPem(googleSandboxIacaPem))
val verifier = MultipazVerifier(trustStore = trustedCertificates)
val verificationResult = verifier.verify(deviceResponseBytes, sessionTranscript)
if (verificationResult.isIssuerAuthorized && verificationResult.isDeviceAuthenticated) {
// Credential is valid and authentic
} else {
// Reject presentation: cryptographic validation failed
}
পাঠক যাচাইকরণ (সাজেস্ট করা হয়েছে)
রিডার যাচাইকরণ, রিডার অ্যাপ্লিকেশনকে অনুমোদিত X.509 রিডার সার্টিফিকেট ব্যবহার করে ReaderAuthentication স্ট্রাকচারে স্বাক্ষর করার মাধ্যমে Google Wallet-এ ক্রিপ্টোগ্রাফিকভাবে তার পরিচয় প্রমাণ করার অনুমতি দেয়।
- এটি কেন সাজেস্ট করা হয়: রিডার যাচাইকরণ আপনার রিডার অ্যাপ বা টার্মিনালকে ব্যবহারকারীর কাছে একটি বিশ্বস্ত পরিচয় উপস্থাপন করার অনুমতি দেয়। সাধারণ পাবলিক অ্যাট্রিবিউটের (যেমন,
age_over_21যাচাই করা) জন্য এটি ঐচ্ছিক হলেও, ব্যবহারকারীর বিশ্বাস বাড়াতে রিডার ইন্টিগ্রেশনের জন্য এটি করার ব্যাপারে বিশেষভাবে সাজেস্ট করা হয় এবং সংবেদনশীল অ্যাট্রিবিউটের (যেমন, সম্পূর্ণ সোশ্যাল সিকিউরিটি নম্বর, আবাসিক ঠিকানা বা নির্দিষ্ট স্টেট এন্ডোর্সমেন্ট) জন্য অনুরোধ করার সময় এটি আইনি বা নীতিগতভাবে প্রয়োজনীয় হতে পারে। - এটি কীভাবে কাজ করে: রিডার তার সার্টিফিকেট চেইন অন্তর্ভুক্ত করে এবং সেশন ট্রান্সক্রিপ্টে স্বাক্ষর করে। ডেটা রিলিজ করার আগে Google Wallet সম্মতি স্ক্রিনে ব্যবহারকারীকে রিডারের যাচাই করা পরিচয় এবং প্রতিষ্ঠানের নাম দেখায়।
টেস্টিং ও ডেভেলপমেন্ট টুল
ইন্টিগ্রেশন আরও দ্রুত করতে, নিম্নলিখিত ডেভেলপার টুল ও রেফারেন্স ইমপ্লিমেন্টেশন ব্যবহার করুন:
- Multipaz রেফারেন্স অ্যাপ:
- Multipaz রিপোজিটরি ক্লোন করুন এবং ফিজিক্যাল যাচাইকরণ ফ্লো পরীক্ষা করতে
IdentityReaderAndroid স্যাম্পেল অ্যাপ চালান।
- Multipaz রিপোজিটরি ক্লোন করুন এবং ফিজিক্যাল যাচাইকরণ ফ্লো পরীক্ষা করতে
- Google Wallet-এ টেস্ট আইডি তৈরি করুন:
- Utopia ePassport Simulator ব্যবহার করে Google Wallet-এ সিমুলেটেড টেস্ট ক্রেডেনশিয়াল যোগ করতে, আমাদের Google Wallet-এ টেস্ট ID পাস তৈরি করুন নির্দেশিকা অনুসরণ করুন।
- ওয়েব-ভিত্তিক যাচাইকারী টেস্টিং:
- CBOR অনুরোধ পরীক্ষা করতে, দাবি সংক্রান্ত কোয়েরি এক্সপ্লোর করতে এবং W3C / ISO 18013-7 ওয়েব-ভিত্তিক প্রেজেন্টেশন পরীক্ষা করতে verifier.multipaz.org ব্যবহার করুন।
সমস্যার সমাধান ও ফিল্ড ডায়াগনস্টিকস
অফলাইন যাচাইকরণের সময় যেসব সাধারণ সমস্যা দেখা যায় এবং সেগুলির জন্য যেসব সমাধান সাজেস্ট করা হয়, তা নিচের সারণীতে তালিকাভুক্ত করা হয়েছে:
| সমস্যা / লক্ষণ | মূল কারণ | সাজেস্ট করা রেজোলিউশন |
|---|---|---|
| BLE কানেকশন টাইম-আউট / কানেক্ট করা যায়নি |
|
|
| NFC ট্যাপ এনগেজমেন্ট কাজ না করা বা ড্রপ করা | BLE হ্যান্ডওভার রেকর্ড সম্পূর্ণভাবে ট্রান্সফার হওয়ার আগেই ব্যবহারকারী রিডার অ্যান্টেনা থেকে মোবাইল ডিভাইস সরিয়ে নেন। |
|
UNTRUSTED_ISSUER / সার্টিফিকেট চেন সংক্রান্ত সমস্যা |
ডকুমেন্ট সাইনার সার্টিফিকেট রিডারের লোকাল ট্রাস্ট স্টোরে কোনও বিশ্বস্ত IACA সার্টিফিকেটের সাথে লিঙ্ক করা নেই। |
|
INVALID_VALIDITY_INFO / মেয়াদ শেষ হয়ে যাওয়া MSO |
|
|
DEVICE_AUTHENTICATION_FAILED |
রিডার ও Wallet-এর মধ্যে সেশন ট্রান্সক্রিপ্ট মিলছে না অথবা ক্ষণস্থায়ী ডিভাইস সিগনেচার ভুল। |
|
| Android 12+ অনুমতি ক্র্যাশ | রানটাইম অনুমতি ছাড়াই অ্যাপ্লিকেশন BLE-এর মাধ্যমে স্ক্যান বা বিজ্ঞাপন দেখানোর চেষ্টা করেছে। |
|
ইন-পার্সন রিডারের জন্য UX ও গোপনীয়তা নির্দেশিকা
ফিজিক্যাল রিডার ও কম্প্যানিয়ন অ্যাপ ডিজাইন করার সময়:
- UI-তে বেছে নেওয়া তথ্য প্রকাশ করার পদ্ধতি অনুসরণ করুন: অপারেটরকে শুধুমাত্র সিদ্ধান্ত বা ন্যূনতম প্রয়োজনীয় অ্যাট্রিবিউট দেখান (যেমন, ব্যবহারকারীর সম্পূর্ণ জন্মতারিখ, ঠিকানা এবং লাইসেন্স নম্বর দেখানোর পরিবর্তে একটি বিশিষ্ট সবুজ টিকচিহ্ন এবং "২১+ বছর বয়স যাচাই করা হয়েছে" দেখান)।
- স্পষ্ট ফিজিক্যাল ইন্টার্যাকশন ইন্ডিকেটর: NFC টার্গেট জোন স্পষ্টভাবে লেবেল করুন এবং প্রতিটি ধাপ দেখানোর জন্য ভিজ্যুয়াল কিউ (যেমন, অ্যানিমেশন বা প্রগ্রেস বার) দেখান: ট্যাপ / স্ক্যান → কানেক্ট করা হচ্ছে → যাচাই করা হচ্ছে → সম্পূর্ণ হয়েছে।
- ক্ষণস্থায়ী ডেটা ম্যানেজ করা: প্রযোজ্য আইন অনুযায়ী স্পষ্টভাবে প্রয়োজন না হলে এবং
intentToRetain = true-এর মাধ্যমে প্রকাশ করা না হলে, ওয়ালেট থেকে পাওয়া ব্যক্তিগত ডেটা এলিমেন্ট স্টোর বা লগ করবেন না।