অ্যান্ড্রয়েড সিস্টেম কী যাচাইকারী

অ্যান্ড্রয়েডের জন্য কী যাচাইকারী ব্যবহারকারীদের আপনার এন্ড-টু-এন্ড এনক্রিপ্টেড (E2EE) অ্যাপে সঠিক ব্যক্তির সাথে যোগাযোগ করছে তা যাচাই করার জন্য একটি একীভূত এবং নিরাপদ উপায় প্রদান করে। এটি ব্যবহারকারীদের একটি বিশ্বস্ত, এবং সামঞ্জস্যপূর্ণ সিস্টেম UI এর মাধ্যমে একটি পরিচিতির সর্বজনীন এনক্রিপশন কীগুলির সত্যতা নিশ্চিত করার অনুমতি দিয়ে ম্যান-ইন-দ্য-মিডল আক্রমণ থেকে রক্ষা করে৷

এই বৈশিষ্ট্যটি কী যাচাইকারী দ্বারা সরবরাহ করা হয়, একটি সিস্টেম পরিষেবা যা Google সিস্টেম পরিষেবাগুলির অংশ এবং প্লে স্টোর ব্যবহার করে বিতরণ করা হয়৷ এটি E2EE পাবলিক কীগুলির জন্য একটি কেন্দ্রীভূত, অন-ডিভাইস সংগ্রহস্থল হিসাবে কাজ করে।

কেন আপনার কী যাচাইকারীর সাথে একীভূত করা উচিত

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

মূল পদ

  • lookupKey: পরিচিতির জন্য একটি অস্বচ্ছ, অবিরাম শনাক্তকারী, পরিচিতি প্রদানকারীর LOOKUP_KEY কলামে সংরক্ষিত। একটি contact ID থেকে ভিন্ন, একটি lookupKey স্থিতিশীল থাকে এমনকি যদি অন্তর্নিহিত যোগাযোগের বিশদ পরিবর্তন বা একত্রিত করা হয়, এটি একটি পরিচিতি উল্লেখ করার প্রস্তাবিত উপায় করে তোলে।
  • accountId: একটি ডিভাইসে ব্যবহারকারীর অ্যাকাউন্টের জন্য একটি অ্যাপ-নির্দিষ্ট শনাক্তকারী। এই আইডিটি আপনার অ্যাপ দ্বারা সংজ্ঞায়িত করা হয়েছে এবং একক ব্যবহারকারীর একাধিক অ্যাকাউন্টের মধ্যে পার্থক্য করতে সাহায্য করে। এটি UI-তে ব্যবহারকারীর কাছে প্রদর্শিত হয়, এটি একটি ফোন নম্বর, ইমেল ঠিকানা বা ব্যবহারকারীর হ্যান্ডেলের মতো অর্থপূর্ণ কিছু ব্যবহার করার পরামর্শ দেওয়া হয়
  • deviceId: ব্যবহারকারীর অ্যাকাউন্টের সাথে যুক্ত একটি নির্দিষ্ট ডিভাইসের জন্য একটি অনন্য শনাক্তকারী। এটি একটি ব্যবহারকারীর একাধিক ডিভাইস থাকতে দেয়, প্রতিটির নিজস্ব ক্রিপ্টোগ্রাফিক কীগুলির সেট রয়েছে। অগত্যা একটি শারীরিক ডিভাইসের প্রতিনিধিত্ব করে না, তবে একই অ্যাকাউন্টের জন্য ব্যবহৃত একাধিক কীগুলির মধ্যে পার্থক্য করার একটি উপায় হতে পারে

শুরু হচ্ছে

আপনি শুরু করার আগে, কী যাচাইকারী পরিষেবার সাথে যোগাযোগ করতে আপনার অ্যাপ সেট আপ করুন৷

অনুমতি ঘোষণা করুন: আপনার AndroidManifest.xml-এ, নিম্নলিখিত অনুমতিগুলি ঘোষণা করুন৷ রানটাইমে আপনাকে অবশ্যই ব্যবহারকারীর কাছ থেকে এগুলি অনুরোধ করতে হবে।

<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />

ক্লায়েন্ট ইনস্ট্যান্স পান: ContactKeys এর একটি উদাহরণ পান, যা API-তে আপনার এন্ট্রি পয়েন্ট।

import com.google.android.gms.contactkeys.ContactKeys

val contactKeyClient = ContactKeys.getClient(context)

মেসেজিং অ্যাপ ডেভেলপারদের জন্য নির্দেশিকা

একজন মেসেজিং অ্যাপ ডেভেলপার হিসেবে, আপনার প্রাথমিক ভূমিকা হল আপনার ব্যবহারকারীদের সর্বজনীন কী এবং তাদের পরিচিতির কীগুলি কী যাচাইকারী পরিষেবাতে প্রকাশ করা।

একজন ব্যবহারকারীর পাবলিক কী প্রকাশ করুন

অন্যদের আপনার ব্যবহারকারীকে খুঁজে পেতে এবং যাচাই করার অনুমতি দিতে, তাদের সর্বজনীন কীটি ডিভাইসের সংগ্রহস্থলে প্রকাশ করুন। অতিরিক্ত নিরাপত্তার জন্য, Android কীস্টোরে কী তৈরি করার কথা বিবেচনা করুন।

import com.google.android.gms.contactkeys.ContactKeyClient
import com.google.android.gms.tasks.Tasks

suspend fun publishSelfKey(
    contactKeyClient: ContactKeyClient,
    accountId: String,
    deviceId: String,
    publicKey: ByteArray
) {
    try {
        Tasks.await(
          contactKeyClient.updateOrInsertE2eeSelfKey(
            deviceId,
            accountId,
            publicKey
          )
        )
        // Self key published successfully.
    } catch (e: Exception) {
        // Handle error.
    }
}

পরিচিতিগুলির সাথে সর্বজনীন কীগুলি সংযুক্ত করুন৷

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

import com.google.android.gms.contactkeys.ContactKeyClient
import com.google.android.gms.tasks.Tasks

suspend fun storeContactKey(
    contactKeyClient: ContactKeyClient,
    contactLookupKey: String,
    contactAccountId: String,
    contactDeviceId: String,
    contactPublicKey: ByteArray
) {
    try {
        Tasks.await(
            contactKeyClient.updateOrInsertE2eeContactKey(
                contactLookupKey,
                contactDeviceId,
                contactAccountId,
                contactPublicKey
            )
        )
        // Contact's key stored successfully.
    } catch (e: Exception) {
        // Handle error.
    }
}

কী এবং যাচাইকরণ স্থিতি পুনরুদ্ধার করুন

আপনি কী প্রকাশ করার পরে, ব্যবহারকারীরা ব্যক্তিগত QR কোড স্ক্যানিংয়ের মাধ্যমে সেগুলি যাচাই করতে পারে। একটি কথোপকথন একটি যাচাই কী ব্যবহার করছে কিনা তা আপনার অ্যাপের UI প্রতিফলিত করা উচিত। প্রতিটি কীর একটি যাচাইকরণ স্থিতি রয়েছে যা আপনি আপনার UI কে জানাতে ব্যবহার করতে পারেন।

যাচাইকরণের শর্তগুলি বুঝুন:

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

  • VERIFIED : এই স্ট্যাটাসটি উচ্চ স্তরের আস্থা নির্দেশ করে। এর অর্থ হল ব্যবহারকারী সফলভাবে একটি যাচাইকরণ প্রবাহ সম্পন্ন করেছেন (যেমন একটি QR কোড স্ক্যান) এবং নিশ্চিত করেছেন যে কীটি উদ্দেশ্যমূলক যোগাযোগের অন্তর্গত। আপনার UI-তে, আপনাকে একটি পরিষ্কার, ইতিবাচক সূচক প্রদর্শন করা উচিত, যেমন একটি সবুজ চেকমার্ক বা ঢাল।

  • VERIFICATION_FAILED : এটি একটি সতর্কতা অবস্থা। এর মানে পরিচিতির সাথে যুক্ত কীটি পূর্বে যাচাই করা কীটির সাথে মেলে না। একটি পরিচিতি একটি নতুন ডিভাইস পেলে এটি ঘটতে পারে, তবে এটি একটি সম্ভাব্য নিরাপত্তা ঝুঁকিও নির্দেশ করতে পারে। আপনার UI-তে, ব্যবহারকারীকে একটি বিশিষ্ট সতর্কবার্তা দিয়ে সতর্ক করুন এবং সংবেদনশীল তথ্য পাঠানোর আগে তাদের পুনরায় যাচাই করার পরামর্শ দিন।

আপনি একটি পরিচিতির সাথে যুক্ত সমস্ত কীগুলির জন্য একটি সমষ্টিগত স্থিতি পুনরুদ্ধার করতে পারেন৷ আমরা একাধিক কী উপস্থিত থাকলে স্থিতি সমাধান করতে VerificationState.leastVerifiedFrom() ব্যবহার করার পরামর্শ দিই, কারণ এটি সঠিকভাবে VERIFICATION_FAILED VERIFIED চেয়ে অগ্রাধিকার দেবে।

  • একটি পরিচিতি স্তরে সামগ্রিক স্থিতি পাওয়া
import com.google.android.gms.contactkeys.ContactKeyClient
import com.google.android.gms.contactkeys.constants.VerificationState
import com.google.android.gms.tasks.Tasks

suspend fun displayContactVerificationStatus(
    contactKeyClient: ContactKeyClient,
    contactLookupKey: String
) {
    try {
        val keysResult = Tasks.await(contactKeyClient.getAllE2eeContactKeys(contactLookupKey))
        val states =
          keysResult.keys.map { VerificationState.fromState(it.localVerificationState) }
        val contactStatus = VerificationState.leastVerifiedFrom(states)
        updateUi(contactLookupKey, contactStatus)
    } catch (e: Exception) {
        // Handle error.
    }
}
  • একটি অ্যাকাউন্ট স্তরে সামগ্রিক স্থিতি পাওয়া
import com.google.android.gms.contactkeys.ContactKeyClient
import com.google.android.gms.contactkeys.constants.VerificationState
import com.google.android.gms.tasks.Tasks

suspend fun displayAccountVerificationStatus(
    contactKeyClient: ContactKeyClient,
    accountId: String
) {
    try {
        val keys = Tasks.await(contactKeyClient.getE2eeAccountKeysForAccount(accountId))
        val states = keys.map { VerificationState.fromState(it.localVerificationState) }
        val accountStatus = VerificationState.leastVerifiedFrom(states)
        updateUi(accountId, accountStatus)
    } catch (e: Exception) {
        // Handle error.
    }
}

রিয়েল টাইমে মূল পরিবর্তনগুলি পর্যবেক্ষণ করুন

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

  • ব্যবহারকারী সফলভাবে একটি যাচাইকরণ প্রবাহ সম্পন্ন করে (উদাহরণস্বরূপ, QR কোড স্ক্যান)।
  • একটি পরিচিতির কী পরিবর্তন করা হয়েছে, যার ফলে এটি আর আগের যাচাইকৃত মানের সাথে মেলে না।
fun observeKeyUpdates(contactKeyClient: ContactKeyClient, accountIds: List<String>) {
    lifecycleScope.launch {
        contactKeyClient.getAccountContactKeysFlow(accountIds)
            .collect { updatedKeys ->
                // A key was added, removed, or updated.
                // Refresh your app's UI and internal state.
                refreshUi(updatedKeys)
            }
    }
}

ব্যক্তিগত কী যাচাইকরণ সম্পাদন করুন

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

  • ব্যবহারকারী-নির্বাচিত পরিচিতির জন্য মূল যাচাইকরণ প্রক্রিয়া শুরু করুন নির্বাচিত পরিচিতির lookupKey ব্যবহার করে getScanQrCodeIntent দ্বারা প্রদত্ত PendingIntent চালু করুন। UI ব্যবহারকারীকে প্রদত্ত পরিচিতির জন্য সমস্ত কী যাচাই করতে দেয়।
import android.app.ActivityOptions
import android.app.PendingIntent
import com.google.android.gms.contactkeys.ContactKeyClient
import com.google.android.gms.tasks.Tasks

suspend fun initiateVerification(contactKeyClient: ContactKeyClient, lookupKey: String) {
    try {
        val pendingIntent = Tasks.await(contactKeyClient.getScanQrCodeIntent(lookupKey))
        val options =
          ActivityOptions.makeBasic()
            .setPendingIntentBackgroundActivityStartMode(
              ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOWED
            )
            .toBundle()
        pendingIntent.send(options)
    } catch (e: Exception) {
        // Handle error.
    }
}
  • একটি ব্যবহারকারী-নির্বাচিত অ্যাকাউন্টের জন্য মূল যাচাইকরণ প্রক্রিয়া শুরু করুন ব্যবহারকারী যদি একটি অ্যাকাউন্ট যাচাই করতে চান যা সরাসরি কোনো পরিচিতির সাথে লিঙ্ক করা হয়নি (বা কোনো পরিচিতির একটি নির্দিষ্ট অ্যাকাউন্ট), আপনি getScanQrCodeIntentForAccount দ্বারা প্রদত্ত PendingIntent চালু করতে পারেন। এটি সাধারণত আপনার নিজের অ্যাপের প্যাকেজের নাম এবং অ্যাকাউন্ট আইডির জন্য ব্যবহৃত হয়।
import android.app.ActivityOptions
import android.app.PendingIntent
import com.google.android.gms.contactkeys.ContactKeyClient
import com.google.android.gms.tasks.Tasks

suspend fun initiateVerification(contactKeyClient: ContactKeyClient, packageName: String, accountId: String) {
    try {
        val pendingIntent = Tasks.await(contactKeyClient.getScanQrCodeIntentForAccount(packageName, accountId))
        // Allow activity start from background on Android SDK34+
        val options =
          ActivityOptions.makeBasic()
            .setPendingIntentBackgroundActivityStartMode(
              ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOWED
            )
            .toBundle()
        pendingIntent.send(options)
    } catch (e: Exception) {
        // Handle error.
    }
}