আপনি যদি শুধুমাত্র স্ট্যান্ডার্ড API অনুরোধ করার পরিকল্পনা করেন, যা বেশিরভাগ ডেভেলপারের জন্য উপযুক্ত, তাহলে আপনি ইন্টিগ্রিটি ফলাফল-এ যেতে পারেন। এই পৃষ্ঠায় ইন্টিগ্রিটি ফলাফলের জন্য ক্লাসিক API অনুরোধ করার পদ্ধতি বর্ণনা করা হয়েছে, যা Android 4.4 (API লেভেল ১৯) বা তার পরবর্তী যেকোনও ভার্সনে কাজ করে।
বিবেচ্য বিষয়
স্ট্যান্ডার্ড ও ক্লাসিক অনুরোধের তুলনা করুন
আপনার অ্যাপের নিরাপত্তা ও অপব্যবহার প্রতিরোধ সংক্রান্ত প্রয়োজনের উপর নির্ভর করে আপনি স্ট্যান্ডার্ড অনুরোধ, ক্লাসিক অনুরোধ অথবা দুটির সংমিশ্রণ করতে পারেন। স্ট্যান্ডার্ড অনুরোধ সব অ্যাপ ও গেমের জন্য উপযুক্ত এবং কোনও অ্যাকশন বা সার্ভার কল আসল কিনা তা চেক করার জন্য ব্যবহার করা যেতে পারে, একই সাথে রিপ্লেয়েবিলিটি ও এক্সফিলট্রেশনের বিরুদ্ধে কিছু সুরক্ষা Google Play-তে ডেলিগেট করা হয়। ক্লাসিক অনুরোধ তৈরি করতে আরও বেশি খরচ হয় এবং এক্সফিলট্রেশন ও নির্দিষ্ট ধরনের অ্যাটাক থেকে সুরক্ষিত রাখতে সেগুলি সঠিকভাবে প্রয়োগ করার দায়িত্ব আপনার। স্ট্যান্ডার্ড অনুরোধের তুলনায় ক্লাসিক অনুরোধ কম করা উচিত, যেমন, কোনও অত্যন্ত মূল্যবান বা সংবেদনশীল অ্যাকশন আসল কিনা তা চেক করার জন্য মাঝে মাঝে এককালীন অনুরোধ করা।
নিম্নলিখিত সারণীতে দুই ধরনের অনুরোধের মধ্যে মূল পার্থক্যগুলি হাইলাইট করা হয়েছে:
| স্ট্যান্ডার্ড API অনুরোধ | ক্লাসিক API অনুরোধ | |
|---|---|---|
| পূর্বশর্ত | ||
| Android SDK-এর ন্যূনতম ভার্সন প্রয়োজন* | Android 6.0 (API লেভেল 23) বা তার পরবর্তী যেকোনও ভার্সন | Android 6.0 (API লেভেল 23) বা তার পরবর্তী যেকোনও ভার্সন |
| Google Play সংক্রান্ত প্রয়োজনীয়তা | Google Play Store ও Google Play পরিষেবা | Google Play Store ও Google Play পরিষেবা |
| ইন্টিগ্রেশনের বিবরণ | ||
| API ওয়ার্ম আপ করতে হবে | ✔️ (কয়েক সেকেন্ড) | ❌ |
| সাধারণ অনুরোধের লেটেন্সি | কয়েকশো মিলিসেকেন্ড | কয়েক সেকেন্ড |
| সম্ভাব্য অনুরোধের ফ্রিকোয়েন্সি | ঘনঘন (কোনও অ্যাকশন বা অনুরোধের জন্য অন-ডিমান্ড চেক) | কদাচিৎ (সর্বোচ্চ ভ্যালুর অ্যাকশন বা সবচেয়ে সংবেদনশীল অনুরোধের জন্য একবার চেক করা) |
| টাইমআউট | বেশিরভাগ ওয়ার্ম আপ ১০ সেকেন্ডের কম সময় নেয়, তবে এতে সার্ভার কল অন্তর্ভুক্ত থাকে, তাই দীর্ঘ টাইমআউট (যেমন ১ মিনিট) সাজেস্ট করা হয়। ক্লায়েন্ট-সাইডে রায় সংক্রান্ত অনুরোধ করা হয় | বেশিরভাগ অনুরোধ ১০ সেকেন্ডের কম সময় নেয়, তবে এতে সার্ভার কল জড়িত থাকে, তাই দীর্ঘ টাইমআউট (যেমন ১ মিনিট) সাজেস্ট করা হয় |
| ইন্টিগ্রিটি ফলাফল টোকেন | ||
| ডিভাইস, অ্যাপ ও অ্যাকাউন্টের বিবরণ থাকে | ✔️ | ✔️ |
| টোকেন ক্যাশিং | Google Play-এর মাধ্যমে সুরক্ষিত অন-ডিভাইস ক্যাশিং | সাজেস্ট করা হয় না |
| Google Play সার্ভারের মাধ্যমে টোকেন ডিক্রিপ্ট ও যাচাই করুন | ✔️ | ✔️ |
| ডিক্রিপশন সার্ভার-টু-সার্ভার অনুরোধের সাধারণ লেটেন্সি | তিন-নয় উপলভ্যতা সহ ১০ মিলিসেকেন্ড | তিনটি নয় সহ মিলিসেকেন্ডের ১০s উপলভ্যতা |
| নিরাপদ সার্ভার এনভায়রনমেন্টে স্থানীয়ভাবে টোকেন ডিক্রিপ্ট ও যাচাই করুন | ❌ | ✔️ |
| ক্লায়েন্ট-সাইডে টোকেন ডিক্রিপ্ট ও যাচাই করুন | ❌ | ❌ |
| ইন্টিগ্রিটি ফলাফলের ফ্রেশনেস | Google Play-এর মাধ্যমে কিছু অটোমেটিক ক্যাশিং ও রিফ্রেশিং | প্রতিটি অনুরোধে সব রায় আবার গণনা করা হয়েছে |
| সীমা | ||
| অ্যাপ পিছু প্রতিদিন অনুরোধ | ডিফল্ট হিসেবে ১০,০০০ (বাড়ানোর অনুরোধ করা যেতে পারে) | ডিফল্ট হিসেবে ১০,০০০ (বাড়ানোর অনুরোধ করা যেতে পারে) |
| অ্যাপ ইনস্ট্যান্স পিছু প্রতি মিনিটে অনুরোধ | ওয়ার্ম আপ: প্রতি মিনিটে ৫টি ইন্টিগ্রিটি টোকেন: কোনও সর্বজনীন সীমা নেই** |
ইন্টিগ্রিটি টোকেন: প্রতি মিনিটে ৫টি |
| সুরক্ষা | ||
| টেম্পারিং ও একই ধরনের অ্যাটাক থেকে রক্ষা করা | requestHash ফিল্ড ব্যবহার করুন |
অনুরোধ করা ডেটার ভিত্তিতে কন্টেন্ট বাইন্ডিং সহ nonce ফিল্ড ব্যবহার করুন |
| রিপ্লে ও একই ধরনের অ্যাটাকের বিরুদ্ধে সুরক্ষা প্রদান করা | Google Play-এর মাধ্যমে অটোমেটিক মিটিগেশন | সার্ভার সাইড লজিকের সাথে nonce ফিল্ড ব্যবহার করুন |
* Play Integrity API লাইব্রেরি v1.4.0 এবং তার পরবর্তী ভার্সনের জন্য, ন্যূনতম
কাজ করে এমন Android SDK উভয় ধরনের অনুরোধের জন্য একই এবং এটি লাইব্রেরির minSdkVersion দ্বারা
নির্ধারিত হয়। v1.3.0 এবং তার আগের রিলিজের জন্য, স্ট্যান্ডার্ড API অনুরোধের জন্য ন্যূনতম
Android SDK হল Android 5.0 (API লেভেল 21) এবং
ক্লাসিক API অনুরোধের জন্য Android 4.4 (API লেভেল 19)।
** সর্বজনীন সীমা নেই এমন অনুরোধ সহ সব অনুরোধের ক্ষেত্রে সর্বজনীন নয় এমন উচ্চ মানের প্রতিরক্ষামূলক সীমা প্রযোজ্য।
ক্লাসিক অনুরোধ মাঝে মাঝে করুন
ইন্টিগ্রিটি টোকেন তৈরি করতে সময়, ডেটা ও ব্যাটারি খরচ হয় এবং প্রতিটি অ্যাপ প্রতিদিন সর্বাধিক কটি ক্লাসিক অনুরোধ করতে পারবে তার সীমা আছে। তাই, স্ট্যান্ডার্ড অনুরোধের ক্ষেত্রে অতিরিক্ত গ্যারান্টি চাইলে, সবচেয়ে বেশি ভ্যালু বা সবচেয়ে সংবেদনশীল অ্যাকশন আসল কিনা তা চেক করার জন্য শুধুমাত্র ক্লাসিক অনুরোধ করা উচিত। হাই-ফ্রিকোয়েন্সি বা কম-ভ্যালু অ্যাকশনের জন্য আপনার ক্লাসিক অনুরোধ করা উচিত নয়। অ্যাপটি প্রতিবার ফোরগ্রাউন্ডে গেলে বা ব্যাকগ্রাউন্ডে প্রতি কয়েক মিনিটে ক্লাসিক অনুরোধ করবেন না এবং একই সময়ে বিপুল সংখ্যক ডিভাইস থেকে কল করা এড়িয়ে চলুন। ভুল প্রয়োগ থেকে ব্যবহারকারীদের সুরক্ষিত রাখতে, কোনও অ্যাপ অনেক বেশি ক্লাসিক অনুরোধ কল করলে, সেটি থ্রটল করা হতে পারে।
ভার্ডিক্ট ক্যাশে করা এড়িয়ে চলুন
রায় ক্যাশে করলে এক্সফিলট্রেশন ও রিপ্লের মতো অ্যাটাকের ঝুঁকি বেড়ে যায়, যেখানে কোনও বিশ্বস্ত নয় এমন পরিবেশ থেকে ভালো রায় আবার ব্যবহার করা হয়। আপনি যদি ক্লাসিক অনুরোধ করার কথা ভাবেন এবং পরে ব্যবহারের জন্য এটি ক্যাশে করেন, তাহলে পরিবর্তে চাহিদা অনুযায়ী স্ট্যান্ডার্ড অনুরোধ করার সাজেশন দেওয়া হয়। স্ট্যান্ডার্ড অনুরোধের ক্ষেত্রে ডিভাইসে কিছু ক্যাশিং করা হয়, তবে রিপ্লে অ্যাটাক ও এক্সফিলট্রেশনের ঝুঁকি কমাতে Google Play অতিরিক্ত সুরক্ষা প্রদানকারী কৌশল ব্যবহার করে।
ক্লাসিক অনুরোধ সুরক্ষিত করতে ননস ফিল্ড ব্যবহার করুন
Play Integrity API-তে nonce নামে একটি ফিল্ড আছে, যা রিপ্লে ও টেম্পারিংয়ের মতো নির্দিষ্ট কিছু অ্যাটাক থেকে
আপনার অ্যাপকে আরও সুরক্ষিত রাখতে
ব্যবহার করা যেতে পারে। Play Integrity API, স্বাক্ষরিত ইন্টিগ্রিটি উত্তরের মধ্যে, এই ফিল্ডে আপনার সেট করা ভ্যালু
ফেরত দেয়। আপনার অ্যাপকে আক্রমণ থেকে রক্ষা করতে কীভাবে ননস
তৈরি করবেন সেই সংক্রান্ত নির্দেশিকা মনোযোগ সহকারে অনুসরণ করুন।
এক্সপোনেনশিয়াল ব্যাকঅফ সহ ক্লাসিক অনুরোধ আবার করুন
পরিবেশগত পরিস্থিতি, যেমন ইন্টারনেট কানেকশন ঠিক না থাকা বা ডিভাইসে ওভারলোড হওয়ার কারণে ডিভাইসের ইন্টিগ্রিটি চেক করার প্রসেস ব্যর্থ হতে পারে। এর ফলে, অন্যথায় বিশ্বস্ত ডিভাইসের জন্য কোনও লেবেল তৈরি নাও হতে পারে। এইসব পরিস্থিতি এড়াতে, এক্সপোনেনশিয়াল ব্যাকঅফ সহ আবার চেষ্টা করার বিকল্প অন্তর্ভুক্ত করুন।
এক নজরে
ব্যবহারকারী আপনার অ্যাপে এমন কোনও হাই-ভ্যালু অ্যাকশন করলে যা আপনি ইন্টিগ্রিটি চেকের মাধ্যমে সুরক্ষিত করতে চান, তাহলে নিম্নলিখিত ধাপগুলি সম্পূর্ণ করুন:
- আপনার অ্যাপের সার্ভার-সাইড ব্যাকএন্ড একটি অনন্য ভ্যালু তৈরি করে এবং ক্লায়েন্ট-সাইড লজিকে পাঠায়। বাকি ধাপগুলিতে এই লজিককে আপনার "অ্যাপ" হিসেবে উল্লেখ করা হয়েছে।
- আপনার অ্যাপ অনন্য ভ্যালু এবং আপনার হাই-ভ্যালু অ্যাকশনের কন্টেন্ট থেকে
nonceতৈরি করে। এরপর এটি Play Integrity API কল করে,nonce-এ পাস করে। - আপনার অ্যাপ Play Integrity API থেকে একটি স্বাক্ষরিত এবং এনক্রিপ্ট করা রায় পায়।
- আপনার অ্যাপ, অ্যাপের ব্যাকএন্ডে স্বাক্ষরিত ও এনক্রিপ্ট করা রায় পাস করে।
- আপনার অ্যাপের ব্যাকএন্ড Google Play সার্ভারে রায় পাঠায়। Google Play সার্ভার রায় ডিক্রিপ্ট ও যাচাই করে এবং আপনার অ্যাপের ব্যাকএন্ডে ফলাফল ফেরত পাঠায়।
- টোকেন পেলোডে থাকা সিগন্যালের উপর ভিত্তি করে আপনার অ্যাপের ব্যাকএন্ড নির্ধারণ করে যে কীভাবে এগোতে হবে।
- আপনার অ্যাপের ব্যাকএন্ড আপনার অ্যাপে সিদ্ধান্তের ফলাফল পাঠায়।
একটি ননস জেনারেট করুন
Play Integrity API-এর মাধ্যমে আপনার অ্যাপে কোনও অ্যাকশন সুরক্ষিত করার সময়, আপনি nonce ফিল্ড ব্যবহার করে নির্দিষ্ট কিছু ধরনের অ্যাটাক, যেমন
পার্সন-ইন-দ্য-মিডল (PITM) টেম্পারিং অ্যাটাক ও রিপ্লে অ্যাটাক প্রশমিত করতে পারবেন। Play
Integrity API, সাইন-ইন করা ইন্টিগ্রিটি রেসপন্সের মধ্যে এই ফিল্ডে আপনার সেট করা ভ্যালু
ফেরত দেয়।
nonce ফিল্ডে সেট করা ভ্যালু অবশ্যই সঠিকভাবে ফর্ম্যাট করা হতে হবে:
String- URL-নিরাপদ
- Base64 এবং নন-র্যাপিং হিসেবে এনকোড করা হয়েছে
- কমপক্ষে ১৬টি অক্ষর
- সর্বাধিক ৫০০ অক্ষরের মধ্যে লিখতে হবে
Play Integrity API-তে nonce ফিল্ড ব্যবহার করার কিছু সাধারণ উপায় নিচে দেওয়া হল। nonce থেকে সবচেয়ে শক্তিশালী সুরক্ষা পেতে, আপনি নিচে উল্লেখ করা পদ্ধতিগুলি
একসাথে ব্যবহার করতে পারেন।
টেম্পারিং থেকে সুরক্ষিত রাখতে অনুরোধের হ্যাশ অন্তর্ভুক্ত করুন
আপনি ক্লাসিক API অনুরোধে nonce প্যারামিটার ব্যবহার করতে পারেন, ঠিক যেমন স্ট্যান্ডার্ড API অনুরোধে requestHash প্যারামিটার ব্যবহার করা হয়, যাতে অনুরোধের কন্টেন্টকে টেম্পারিং থেকে রক্ষা করা যায়।
আপনি ইন্টিগ্রিটি ফলাফলের জন্য অনুরোধ করলে:
- ব্যবহারকারীর অ্যাকশন বা সার্ভার অনুরোধ থেকে সমস্ত গুরুত্বপূর্ণ অনুরোধ প্যারামিটারের (যেমন, একটি স্থিতিশীল অনুরোধ সিরিয়ালাইজেশনের SHA256) একটি ডাইজেস্ট গণনা করুন।
setNonceব্যবহার করেnonceফিল্ডে কম্পিউট করা ডাইজেস্টের ভ্যালু সেট করুন।
আপনি ইন্টিগ্রিটি ফলাফল পেলে:
- ইন্টিগ্রিটি টোকেন ডিকোড ও যাচাই করুন এবং
nonceফিল্ড থেকে ডাইজেস্ট পান। - অ্যাপে যেভাবে করা হয় ঠিক সেইভাবে অনুরোধের ডাইজেস্ট গণনা করুন (যেমন, স্টেবল অনুরোধ সিরিয়ালাইজেশনের SHA256)।
- অ্যাপ-সাইড ও সার্ভার-সাইড ডাইজেস্টের তুলনা করুন। যদি সেগুলি না মেলে, তাহলে অনুরোধটি বিশ্বাসযোগ্য নয়।
রিপ্লে অ্যাটাক থেকে সুরক্ষিত রাখতে অনন্য ভ্যালু যোগ করুন
Play Integrity API থেকে আগের উত্তর যাতে ক্ষতিকর ব্যবহারকারীরা আবার ব্যবহার করতে না পারে, তার জন্য আপনি প্রতিটি মেসেজ অনন্যভাবে শনাক্ত করতে nonce ফিল্ড ব্যবহার করতে পারেন।
আপনি ইন্টিগ্রিটি ফলাফলের জন্য অনুরোধ করলে:
- এমনভাবে বিশ্বব্যাপী অনন্য ভ্যালু পান যাতে ক্ষতিকর ব্যবহারকারীরা অনুমান করতে না পারেন। যেমন, সার্ভার-সাইডে জেনারেট করা ক্রিপ্টোগ্রাফিক্যালি-সুরক্ষিত র্যান্ডম নম্বর এই ধরনের ভ্যালু হতে পারে অথবা আগে থেকে থাকা আইডি, যেমন সেশন বা ট্রানজ্যাকশন আইডি। আরও সহজ এবং কম সুরক্ষিত বিকল্প হল ডিভাইসে একটি র্যান্ডম নম্বর জেনারেট করা। আমরা ১২৮ বিট বা তার বেশি ভ্যালু তৈরি করার সাজেশন দিই।
- ধাপ ১ থেকে অনন্য মানে
nonceফিল্ড সেট করতেsetNonce()কল করুন।
আপনি ইন্টিগ্রিটি ফলাফল পেলে:
- ইন্টিগ্রিটি টোকেন ডিকোড ও যাচাই করুন এবং
nonceফিল্ড থেকে অনন্য মান পান। - ধাপ ১-এর ভ্যালু সার্ভারে জেনারেট করা হলে, চেক করে দেখুন যে প্রাপ্ত অনন্য ভ্যালুটি জেনারেট করা ভ্যালুগুলির মধ্যে একটি কিনা এবং এটি প্রথমবার ব্যবহার করা হচ্ছে কিনা (আপনার সার্ভারকে উপযুক্ত সময়ের জন্য জেনারেট করা ভ্যালুর রেকর্ড রাখতে হবে)। প্রাপ্ত অনন্য মানটি আগে থেকেই ব্যবহার করা হয়ে থাকলে অথবা রেকর্ডে না থাকলে, অনুরোধটি বাতিল করুন
- অন্যথায়, ডিভাইসে অনন্য ভ্যালু তৈরি করা হলে, প্রাপ্ত ভ্যালু প্রথমবার ব্যবহার করা হচ্ছে কিনা তা চেক করুন (আপনার সার্ভারকে উপযুক্ত সময়সীমার জন্য আগে থেকে দেখা ভ্যালুর রেকর্ড রাখতে হবে)। প্রাপ্ত অনন্য ভ্যালু আগে ব্যবহার করা হয়ে থাকলে, অনুরোধ বাতিল করুন।
টেম্পারিং ও রিপ্লে অ্যাটাক, দুটির বিরুদ্ধেই সুরক্ষা একত্রিত করুন (সাজেস্ট করা হয়েছে)
একই সাথে টেম্পারিং ও রিপ্লে অ্যাটাক থেকে সুরক্ষিত রাখতে nonce ফিল্ড ব্যবহার করা
সম্ভব। এটি করতে, উপরে যেভাবে বর্ণনা করা হয়েছে সেইভাবে অনন্য ভ্যালু জেনারেট করুন এবং আপনার অনুরোধের অংশ হিসেবে এটি অন্তর্ভুক্ত করুন। তারপর অনুরোধের হ্যাশ গণনা করুন, হ্যাশের অংশ হিসেবে অনন্য মান অন্তর্ভুক্ত করতে ভুলবেন না। দুটি পদ্ধতিই একত্রিত করে এমন একটি
প্রয়োগ নিচে দেখানো হল:
আপনি ইন্টিগ্রিটি ফলাফলের জন্য অনুরোধ করলে:
- ব্যবহারকারী হাই-ভ্যালু অ্যাকশন শুরু করেন।
- রিপ্লে অ্যাটাক থেকে সুরক্ষিত রাখতে অনন্য ভ্যালু অন্তর্ভুক্ত করুন বিভাগে যেমন বর্ণনা করা হয়েছে, এই অ্যাকশনের জন্য একটি অনন্য ভ্যালু পান।
- আপনি যে মেসেজ সুরক্ষিত করতে চান সেটি প্রস্তুত করুন। মেসেজে ধাপ ২ থেকে অনন্য মান অন্তর্ভুক্ত করুন।
- আপনার অ্যাপ যে মেসেজ সুরক্ষিত করতে চায়, সেটির ডাইজেস্ট হিসেব করে, যেমনটি টেম্পারিংয়ের হাত থেকে সুরক্ষিত করতে অনুরোধের হ্যাশ অন্তর্ভুক্ত করুন বিভাগে বর্ণনা করা হয়েছে। মেসেজে অনন্য ভ্যালু থাকে বলে, অনন্য ভ্যালু হ্যাশের অংশ।
- আগের ধাপ থেকে গণনা করা ডাইজেস্টে
nonceফিল্ড সেট করতেsetNonce()ব্যবহার করুন।
আপনি ইন্টিগ্রিটি ফলাফল পেলে:
- অনুরোধ থেকে অনন্য ভ্যালু পান
- ইন্টিগ্রিটি টোকেন ডিকোড ও যাচাই করুন এবং
nonceফিল্ড থেকে ডাইজেস্ট পান। - টেম্পারিং থেকে সুরক্ষিত রাখতে অনুরোধের হ্যাশ অন্তর্ভুক্ত করুন বিভাগে যেমন বর্ণনা করা হয়েছে, সার্ভার সাইডে ডাইজেস্ট আবার গণনা করুন এবং এটি ইন্টিগ্রিটি টোকেন থেকে পাওয়া ডাইজেস্টের সাথে মিলছে কিনা তা চেক করুন।
- রিপ্লে অ্যাটাক থেকে সুরক্ষিত রাখতে অনন্য ভ্যালু অন্তর্ভুক্ত করুন বিভাগে যেমন বর্ণনা করা হয়েছে, অনন্য ভ্যালুর বৈধতা চেক করুন।
নিম্নলিখিত সিকোয়েন্স ডায়াগ্রামটি সার্ভার-সাইড nonce-এর মাধ্যমে এইসব ধাপ ব্যাখ্যা করে:
ইন্টিগ্রিটি ফলাফলের জন্য অনুরোধ করা
nonce জেনারেট করার পরে, আপনি Google Play থেকে ইন্টিগ্রিটি ফলাফলের জন্য অনুরোধ করতে
পারবেন। এটি করতে, নিম্নলিখিত ধাপগুলি সম্পূর্ণ করুন:
- নিচের উদাহরণে যেমন দেখানো হয়েছে, সেইভাবে একটি
IntegrityManagerতৈরি করুন। IntegrityTokenRequestতৈরি করুন, সংশ্লিষ্ট বিল্ডারেsetNonce()পদ্ধতির মাধ্যমেnonceপ্রদান করুন। Google Play এবং SDK-এর বাইরে এক্সক্লুসিভভাবে ডিস্ট্রিবিউট করা অ্যাপকেওsetCloudProjectNumber()পদ্ধতির মাধ্যমে Google Cloud প্রোজেক্ট নম্বর উল্লেখ করতে হবে। Google Play-তে থাকা অ্যাপগুলি Play Console-এ একটি ক্লাউড প্রোজেক্টের সাথে লিঙ্ক করা থাকে এবং অনুরোধে ক্লাউড প্রোজেক্ট নম্বর সেট করার প্রয়োজন হয় না।requestIntegrityToken()-কে কল করার জন্য ম্যানেজার ব্যবহার করুন,IntegrityTokenRequestপ্রদান করুন।
Kotlin
// Receive the nonce from the secure server. val nonce: String = ... // Create an instance of a manager. val integrityManager = IntegrityManagerFactory.create(applicationContext) // Request the integrity token by providing a nonce. val integrityTokenResponse: Task<IntegrityTokenResponse> = integrityManager.requestIntegrityToken( IntegrityTokenRequest.builder() .setNonce(nonce) .build())
জাভা
import com.google.android.gms.tasks.Task; ... // Receive the nonce from the secure server. String nonce = ... // Create an instance of a manager. IntegrityManager integrityManager = IntegrityManagerFactory.create(getApplicationContext()); // Request the integrity token by providing a nonce. Task<IntegrityTokenResponse> integrityTokenResponse = integrityManager .requestIntegrityToken( IntegrityTokenRequest.builder().setNonce(nonce).build());
Unity
IEnumerator RequestIntegrityTokenCoroutine() { // Receive the nonce from the secure server. var nonce = ... // Initialize the V2 manager. Requires Play Integrity Unity Plugin v2.0.0 // or higher. var integrityManager = new IntegrityManagerV2(); // Request the integrity token by providing a nonce. var tokenRequest = new IntegrityTokenRequest(nonce); var requestIntegrityTokenOperation = integrityManager.RequestIntegrityToken(tokenRequest); // Wait for PlayAsyncOperation to complete. yield return requestIntegrityTokenOperation; // Check the resulting error code. if (requestIntegrityTokenOperation.Error != null && requestIntegrityTokenOperation.Error.ErrorCode != IntegrityErrorCode.NoError) { AppendStatusLog("IntegrityAsyncOperation failed with error: " + requestIntegrityTokenOperation.Error.ErrorCode); yield break; } // Get the response. var tokenResponse = requestIntegrityTokenOperation.GetResult(); }
Unreal Engine
// .h void MyClass::OnRequestIntegrityTokenCompleted( EIntegrityErrorCode ErrorCode, UIntegrityTokenResponse* Response) { // Check the resulting error code. if (ErrorCode == EIntegrityErrorCode::Integrity_NO_ERROR) { // Get the token. FString Token = Response->Token; } } // .cpp void MyClass::RequestIntegrityToken() { // Receive the nonce from the secure server. FString Nonce = ... // Create the Integrity Token Request. FIntegrityTokenRequest Request = { Nonce }; // Create a delegate to bind the callback function. FIntegrityOperationCompletedDelegate Delegate; // Bind the completion handler (OnRequestIntegrityTokenCompleted) to the delegate. Delegate.BindDynamic(this, &MyClass::OnRequestIntegrityTokenCompleted); // Initiate the integrity token request, passing the delegate to handle the result. GetGameInstance() ->GetSubsystem<UIntegrityManager>() ->RequestIntegrityToken(Request, Delegate); }
নেটিভ
/// Create an IntegrityTokenRequest opaque object. const char* nonce = RequestNonceFromServer(); IntegrityTokenRequest* request; IntegrityTokenRequest_create(&request); IntegrityTokenRequest_setNonce(request, nonce); /// Prepare an IntegrityTokenResponse opaque type pointer and call /// IntegerityManager_requestIntegrityToken(). IntegrityTokenResponse* response; IntegrityErrorCode error_code = IntegrityManager_requestIntegrityToken(request, &response); /// ... /// Proceed to polling iff error_code == INTEGRITY_NO_ERROR if (error_code != INTEGRITY_NO_ERROR) { /// Remember to call the *_destroy() functions. return; } /// ... /// Use polling to wait for the async operation to complete. /// Note, the polling shouldn't block the thread where the IntegrityManager /// is running. IntegrityResponseStatus response_status; /// Check for error codes. IntegrityErrorCode error_code = IntegrityTokenResponse_getStatus(response, &response_status); if (error_code == INTEGRITY_NO_ERROR && response_status == INTEGRITY_RESPONSE_COMPLETED) { const char* integrity_token = IntegrityTokenResponse_getToken(response); SendTokenToServer(integrity_token); } /// ... /// Remember to free up resources. IntegrityTokenRequest_destroy(request); IntegrityTokenResponse_destroy(response); IntegrityManager_destroy();
ইন্টিগ্রিটি ফলাফল ডিক্রিপ্ট ও যাচাই করুন
আপনি ইন্টিগ্রিটি ফলাফল পাওয়ার জন্য অনুরোধ করলে, Play Integrity API একটি স্বাক্ষরিত
উত্তরের টোকেন প্রদান করে। আপনার অনুরোধে যে nonce যোগ করেন, তা রেসপন্স টোকেনের
অংশ হয়ে যায়।
টোকেন ফর্ম্যাট
টোকেনটি হল একটি নেস্টেড JSON ওয়েব টোকেন (JWT), যা JSON ওয়েব সিগনেচার (JWS)-এর JSON ওয়েব এনক্রিপশন (JWE)। JWE এবং JWS কম্পোনেন্ট কমপ্যাক্ট সিরিয়ালাইজেশন ব্যবহার করে দেখানো হয় ।
এনক্রিপশন / সাইনিং অ্যালগরিদম বিভিন্ন JWT ইমপ্লিমেন্টেশন জুড়ে ভালভাবে কাজ করে:
Google-এর সার্ভারে ডিক্রিপ্ট ও যাচাই করুন (সাজেস্ট করা হয়)
Play Integrity API আপনাকে Google-এর সার্ভারে ইন্টিগ্রিটি ফলাফল ডিক্রিপ্ট ও যাচাই করার অনুমতি দেয়, যা আপনার অ্যাপের নিরাপত্তা বাড়ায়। এটি করতে, এইসব ধাপ সম্পূর্ণ করুন:
- আপনার অ্যাপের সাথে লিঙ্ক করা Google Cloud প্রোজেক্টের মধ্যে একটি পরিষেবা অ্যাকাউন্ট তৈরি করুন।
আপনার অ্যাপের সার্ভারে,
playintegrityস্কোপ ব্যবহার করে আপনার পরিষেবা অ্যাকাউন্টের ক্রেডেনশিয়াল থেকে অ্যাক্সেস টোকেন ফেচ করুন এবং নিম্নলিখিত অনুরোধ করুন:playintegrity.googleapis.com/v1/PACKAGE_NAME:decodeIntegrityToken -d \ '{ "integrity_token": "INTEGRITY_TOKEN" }'JSON রেসপন্স পড়ুন।
লোকাল ডিভাইসে ডিক্রিপ্ট ও যাচাই করুন
আপনি যদি নিজের রেসপন্স এনক্রিপশন কী ম্যানেজ ও ডাউনলোড করার বিকল্প বেছে নেন, তাহলে আপনার নিজস্ব সুরক্ষিত সার্ভার এনভায়রনমেন্টের মধ্যে থেকে ফেরত পাঠানো টোকেন ডিক্রিপ্ট ও যাচাই করতে পারবেন।
আপনি IntegrityTokenResponse#token()
পদ্ধতি ব্যবহার করে ফেরত পাওয়া টোকেন পেতে পারেন।
Play Console থেকে ভাষা-নির্দিষ্ট (আমাদের ক্ষেত্রে Java প্রোগ্রামিং ল্যাঙ্গুয়েজ) অ্যাপের ব্যাকএন্ডে 'কী'তে স্বাক্ষর যাচাইকরণের জন্য কীভাবে AES 'কী' এবং DER-এনকোড করা পাবলিক EC 'কী' ডিকোড করতে হয় তা নিম্নলিখিত উদাহরণে দেখানো হয়েছে। মনে রাখবেন যে ডিফল্ট ফ্ল্যাগ ব্যবহার করে base64-এনকোড করা কী ব্যবহার করা হয়।
Kotlin
// base64OfEncodedDecryptionKey is provided through Play Console. var decryptionKeyBytes: ByteArray = Base64.decode(base64OfEncodedDecryptionKey, Base64.DEFAULT) // Deserialized encryption (symmetric) key. var decryptionKey: SecretKey = SecretKeySpec( decryptionKeyBytes, /* offset= */ 0, AES_KEY_SIZE_BYTES, AES_KEY_TYPE ) // base64OfEncodedVerificationKey is provided through Play Console. var encodedVerificationKey: ByteArray = Base64.decode(base64OfEncodedVerificationKey, Base64.DEFAULT) // Deserialized verification (public) key. var verificationKey: PublicKey = KeyFactory.getInstance(EC_KEY_TYPE) .generatePublic(X509EncodedKeySpec(encodedVerificationKey))
জাভা
// base64OfEncodedDecryptionKey is provided through Play Console. byte[] decryptionKeyBytes = Base64.decode(base64OfEncodedDecryptionKey, Base64.DEFAULT); // Deserialized encryption (symmetric) key. SecretKey decryptionKey = new SecretKeySpec( decryptionKeyBytes, /* offset= */ 0, AES_KEY_SIZE_BYTES, AES_KEY_TYPE); // base64OfEncodedVerificationKey is provided through Play Console. byte[] encodedVerificationKey = Base64.decode(base64OfEncodedVerificationKey, Base64.DEFAULT); // Deserialized verification (public) key. PublicKey verificationKey = KeyFactory.getInstance(EC_KEY_TYPE) .generatePublic(new X509EncodedKeySpec(encodedVerificationKey));
এরপর, প্রথমে ইন্টিগ্রিটি টোকেন (JWE অংশ) ডিক্রিপ্ট করতে এবং তারপর নেস্টেড JWS অংশ যাচাই ও এক্সট্র্যাক্ট করতে এইসব 'কী' ব্যবহার করুন।
Kotlin
val jwe: JsonWebEncryption = JsonWebStructure.fromCompactSerialization(integrityToken) as JsonWebEncryption jwe.setKey(decryptionKey) // This also decrypts the JWE token. val compactJws: String = jwe.getPayload() val jws: JsonWebSignature = JsonWebStructure.fromCompactSerialization(compactJws) as JsonWebSignature jws.setKey(verificationKey) // This also verifies the signature. val payload: String = jws.getPayload()
জাভা
JsonWebEncryption jwe = (JsonWebEncryption)JsonWebStructure .fromCompactSerialization(integrityToken); jwe.setKey(decryptionKey); // This also decrypts the JWE token. String compactJws = jwe.getPayload(); JsonWebSignature jws = (JsonWebSignature) JsonWebStructure.fromCompactSerialization(compactJws); jws.setKey(verificationKey); // This also verifies the signature. String payload = jws.getPayload();
এর ফলে যে পেলোড পাওয়া যায় তা হল প্লেন-টেক্সট টোকেন যাতে ইন্টিগ্রিটি ফলাফল থাকে।
Google Play প্রম্পটের মাধ্যমে রায় সংক্রান্ত সমস্যার সমাধান করা (ঐচ্ছিক)
আপনার সার্ভার ইন্টিগ্রিটি ফলাফল পাওয়ার পরে, সার্ভার নির্ধারণ করতে পারে যে কীভাবে এগিয়ে যেতে হবে। রায় যদি কোনও সমস্যা নির্দেশ করে—যেমন অ্যাপের লাইসেন্স না থাকা, অ্যাপের সাথে কারচুপি করা বা ডিভাইসের সাথে আপস করা—তাহলে আপনি ব্যবহারকারীদের সমস্যাটি নিজে সমাধান করার সুযোগ দিতে পারেন।
Play Integrity API-তে Google Play ডায়ালগ দেখানোর বিকল্প আছে যা ব্যবহারকারীকে অ্যাকশন নিতে প্রম্পট করে, যেমন, Google Play থেকে আপনার অ্যাপের অফিসিয়াল ভার্সন পাওয়া।
সার্ভারের উত্তরের ভিত্তিতে আপনার অ্যাপ থেকে কীভাবে এইসব ডায়ালগ ট্রিগার করবেন তা জানতে, প্রতিকার ডায়ালগ দেখুন।