যদি আপনি কেবলমাত্র স্ট্যান্ডার্ড API অনুরোধগুলি করার পরিকল্পনা করেন, যা বেশিরভাগ ডেভেলপারদের জন্য উপযুক্ত, তাহলে আপনি ইন্টিগ্রিটি রায়ডেটস এ যেতে পারেন। এই পৃষ্ঠাটি অ্যান্ড্রয়েড 4.4 (API লেভেল 19) বা উচ্চতর সংস্করণে সমর্থিত ইন্টিগ্রিটি রায়ডেটের জন্য ক্লাসিক API অনুরোধগুলি করার বর্ণনা দেয়।
বিবেচনা
স্ট্যান্ডার্ড এবং ক্লাসিক অনুরোধের তুলনা করুন
আপনার অ্যাপের নিরাপত্তা এবং অপব্যবহার বিরোধী চাহিদার উপর নির্ভর করে আপনি স্ট্যান্ডার্ড অনুরোধ, ক্লাসিক অনুরোধ, অথবা দুটির সংমিশ্রণ করতে পারেন। স্ট্যান্ডার্ড অনুরোধগুলি সমস্ত অ্যাপ এবং গেমের জন্য উপযুক্ত এবং যেকোনও অ্যাকশন বা সার্ভার কল আসল কিনা তা পরীক্ষা করতে ব্যবহার করা যেতে পারে, একই সাথে রিপ্লেবিলিটি এবং এক্সফিল্ট্রেশনের বিরুদ্ধে কিছু সুরক্ষা Google Play-তে অর্পণ করা যেতে পারে। ক্লাসিক অনুরোধগুলি করা আরও ব্যয়বহুল এবং এক্সফিল্ট্রেশন এবং নির্দিষ্ট ধরণের আক্রমণ থেকে রক্ষা করার জন্য সেগুলি সঠিকভাবে বাস্তবায়নের জন্য আপনার দায়িত্ব। ক্লাসিক অনুরোধগুলি স্ট্যান্ডার্ড অনুরোধগুলির তুলনায় কম ঘন ঘন করা উচিত, উদাহরণস্বরূপ, মাঝে মাঝে একবারের জন্য একটি অত্যন্ত মূল্যবান বা সংবেদনশীল পদক্ষেপ আসল কিনা তা পরীক্ষা করার জন্য।
নিম্নলিখিত টেবিলটি দুই ধরণের অনুরোধের মধ্যে মূল পার্থক্যগুলি তুলে ধরে:
| স্ট্যান্ডার্ড API অনুরোধ | ক্লাসিক API অনুরোধ | |
|---|---|---|
| পূর্বশর্ত | ||
| ন্যূনতম অ্যান্ড্রয়েড এসডিকে প্রয়োজন * | অ্যান্ড্রয়েড ৬.০ (এপিআই লেভেল ২৩) বা তার বেশি | অ্যান্ড্রয়েড ৬.০ (এপিআই লেভেল ২৩) বা তার বেশি |
| গুগল প্লে-এর প্রয়োজনীয়তা | গুগল প্লে স্টোর এবং গুগল প্লে পরিষেবা | গুগল প্লে স্টোর এবং গুগল প্লে পরিষেবা |
| ইন্টিগ্রেশনের বিশদ বিবরণ | ||
| API ওয়ার্ম আপ প্রয়োজন | ✔️ (কয়েক সেকেন্ড) | ❌ |
| সাধারণত অনুরোধের বিলম্ব | কয়েকশ মিলিসেকেন্ড | কয়েক সেকেন্ড |
| সম্ভাব্য অনুরোধের ফ্রিকোয়েন্সি | ঘন ঘন (যেকোনো পদক্ষেপ বা অনুরোধের জন্য চাহিদা অনুযায়ী পরীক্ষা) | বিরল (সর্বোচ্চ মূল্যের ক্রিয়া বা সবচেয়ে সংবেদনশীল অনুরোধের জন্য একবারের জন্য পরীক্ষা) |
| টাইমআউট | বেশিরভাগ ওয়ার্ম-আপ ১০ বছরের কম বয়সীদের জন্য করা হয় কিন্তু এতে সার্ভার কলের প্রয়োজন হয়, তাই দীর্ঘ সময়সীমা নির্ধারণ করা বাঞ্ছনীয় (যেমন ১ মিনিট)। রায়ের অনুরোধগুলি ক্লায়েন্ট-সাইডের মাধ্যমেই করা হয়। | বেশিরভাগ অনুরোধ ১০ বছরের কম বয়সী কিন্তু সেগুলিতে একটি সার্ভার কল জড়িত, তাই দীর্ঘ সময়সীমা (যেমন ১ মিনিট) সুপারিশ করা হয়। |
| সততার রায়ের টোকেন | ||
| ডিভাইস, অ্যাপ এবং অ্যাকাউন্টের বিবরণ রয়েছে | ✔️ | ✔️ |
| টোকেন ক্যাশিং | গুগল প্লে দ্বারা সুরক্ষিত অন-ডিভাইস ক্যাশিং | সুপারিশ করা হয় না |
| গুগল প্লে সার্ভারের মাধ্যমে টোকেন ডিক্রিপ্ট এবং যাচাই করুন | ✔️ | ✔️ |
| সাধারণ ডিক্রিপশন সার্ভার-টু-সার্ভার অনুরোধের বিলম্ব | তিন-নয় সেকেন্ডের সহজলভ্যতা সহ ১০ মিলিসেকেন্ড | তিন-নয় সেকেন্ডের সহজলভ্যতা সহ ১০ মিলিসেকেন্ড |
| একটি নিরাপদ সার্ভার পরিবেশে স্থানীয়ভাবে টোকেন ডিক্রিপ্ট এবং যাচাই করুন | ❌ | ✔️ |
| টোকেন ক্লায়েন্ট-সাইড ডিক্রিপ্ট এবং যাচাই করুন | ❌ | ❌ |
| সততা রায়ের সতেজতা | গুগল প্লে দ্বারা কিছু স্বয়ংক্রিয় ক্যাশিং এবং রিফ্রেশিং | প্রতিটি অনুরোধের ভিত্তিতে সমস্ত রায় পুনর্গণনা করা হয়েছে |
| সীমা | ||
| প্রতিদিন প্রতি অ্যাপের অনুরোধ | ডিফল্টরূপে ১০,০০০ (বৃদ্ধির অনুরোধ করা যেতে পারে) | ডিফল্টরূপে ১০,০০০ (বৃদ্ধির অনুরোধ করা যেতে পারে) |
| প্রতি মিনিটে প্রতি অ্যাপের উদাহরণের অনুরোধ | ওয়ার্ম আপ: প্রতি মিনিটে ৫ বার ইন্টিগ্রিটি টোকেন: কোনও পাবলিক সীমা নেই ** | ইন্টিগ্রিটি টোকেন: প্রতি মিনিটে ৫টি |
| সুরক্ষা | ||
| টেম্পারিং এবং অনুরূপ আক্রমণের বিরুদ্ধে প্রশমন করুন | requestHash ফিল্ড ব্যবহার করুন | অনুরোধের তথ্যের উপর ভিত্তি করে কন্টেন্ট বাইন্ডিং সহ nonce ক্ষেত্র ব্যবহার করুন |
| রিপ্লে এবং অনুরূপ আক্রমণের বিরুদ্ধে প্রশমন করুন | গুগল প্লে দ্বারা স্বয়ংক্রিয় প্রশমন | সার্ভার সাইড লজিকের সাথে 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)।
** সকল অনুরোধ, যার মধ্যে পাবলিক সীমা নেই, উচ্চ মূল্যের অ-পাবলিক প্রতিরক্ষামূলক সীমার আওতায় আসবে।
খুব কম সময়েই ক্লাসিক অনুরোধ করুন
একটি ইন্টিগ্রিটি টোকেন তৈরি করতে সময়, ডেটা এবং ব্যাটারি লাগে এবং প্রতিটি অ্যাপ প্রতিদিন সর্বোচ্চ সংখ্যক ক্লাসিক অনুরোধ করতে পারে। অতএব, যখন আপনি একটি স্ট্যান্ডার্ড অনুরোধের অতিরিক্ত গ্যারান্টি চান তখন সর্বোচ্চ মান বা সর্বাধিক সংবেদনশীল ক্রিয়াগুলি আসল কিনা তা পরীক্ষা করার জন্য আপনার কেবল ক্লাসিক অনুরোধ করা উচিত। উচ্চ-ফ্রিকোয়েন্সি বা নিম্ন-মূল্যের ক্রিয়াগুলির জন্য আপনার ক্লাসিক অনুরোধ করা উচিত নয়। অ্যাপটি ফোরগ্রাউন্ডে যাওয়ার সময় বা ব্যাকগ্রাউন্ডে প্রতি কয়েক মিনিটের মধ্যে ক্লাসিক অনুরোধ করবেন না এবং একই সাথে প্রচুর সংখ্যক ডিভাইস থেকে কল করা এড়িয়ে চলুন। ব্যবহারকারীদের ভুল বাস্তবায়ন থেকে রক্ষা করার জন্য একটি অ্যাপ অনেক বেশি ক্লাসিক অনুরোধ কল করে থ্রোটল করা হতে পারে।
রায় ক্যাশে করা এড়িয়ে চলুন
কোনও রায় ক্যাশে করলে এক্সফিল্ট্রেশন এবং রিপ্লে-এর মতো আক্রমণের ঝুঁকি বেড়ে যায়, যেখানে একটি অবিশ্বস্ত পরিবেশ থেকে একটি ভাল রায় পুনরায় ব্যবহার করা হয়। আপনি যদি একটি ক্লাসিক অনুরোধ করার এবং পরে ব্যবহারের জন্য এটি ক্যাশে করার কথা বিবেচনা করেন, তাহলে চাহিদা অনুসারে একটি স্ট্যান্ডার্ড অনুরোধ সম্পাদন করার পরামর্শ দেওয়া হয়। স্ট্যান্ডার্ড অনুরোধগুলিতে ডিভাইসে কিছু ক্যাশিং জড়িত থাকে তবে গুগল প্লে রিপ্লে আক্রমণ এবং এক্সফিল্ট্রেশনের ঝুঁকি কমাতে অতিরিক্ত সুরক্ষা কৌশল ব্যবহার করে।
ক্লাসিক অনুরোধগুলি সুরক্ষিত করতে nonce ক্ষেত্রটি ব্যবহার করুন।
Play Integrity API nonce নামে একটি ক্ষেত্র অফার করে, যা আপনার অ্যাপকে নির্দিষ্ট আক্রমণ, যেমন রিপ্লে এবং টেম্পারিং আক্রমণ থেকে আরও সুরক্ষিত করতে ব্যবহার করা যেতে পারে। Play Integrity API স্বাক্ষরিত অখণ্ডতা প্রতিক্রিয়ার ভিতরে এই ক্ষেত্রে আপনার সেট করা মান ফেরত দেয়। আক্রমণ থেকে আপনার অ্যাপকে রক্ষা করার জন্য nonces কীভাবে তৈরি করবেন সে সম্পর্কে নির্দেশিকা সাবধানতার সাথে অনুসরণ করুন।
এক্সপোনেনশিয়াল ব্যাকঅফ সহ ক্লাসিক অনুরোধগুলি পুনরায় চেষ্টা করুন
পরিবেশগত পরিস্থিতি, যেমন অস্থির ইন্টারনেট সংযোগ বা ওভারলোডেড ডিভাইস, ডিভাইসের অখণ্ডতা পরীক্ষা ব্যর্থ করতে পারে। এর ফলে এমন কোনও ডিভাইসের জন্য কোনও লেবেল তৈরি নাও হতে পারে যা অন্যথায় বিশ্বাসযোগ্য। এই পরিস্থিতিগুলি কমাতে, সূচকীয় ব্যাকঅফ সহ একটি পুনরায় চেষ্টা বিকল্প অন্তর্ভুক্ত করুন।
সংক্ষিপ্ত বিবরণ
যখন ব্যবহারকারী আপনার অ্যাপে এমন একটি উচ্চ-মূল্যের ক্রিয়া সম্পাদন করে যা আপনি একটি অখণ্ডতা পরীক্ষার মাধ্যমে সুরক্ষিত করতে চান, তখন নিম্নলিখিত পদক্ষেপগুলি সম্পূর্ণ করুন:
- আপনার অ্যাপের সার্ভার-সাইড ব্যাকএন্ড ক্লায়েন্ট-সাইড লজিকে একটি অনন্য মান তৈরি করে এবং পাঠায়। বাকি ধাপগুলি এই লজিকটিকে আপনার "অ্যাপ" হিসাবে উল্লেখ করে।
- আপনার অ্যাপটি আপনার উচ্চ-মূল্যের অ্যাকশনের অনন্য মান এবং বিষয়বস্তু থেকে
nonceতৈরি করে। এরপর এটি Play Integrity API কল করে,nonceপাস করে। - আপনার অ্যাপটি Play Integrity API থেকে একটি স্বাক্ষরিত এবং এনক্রিপ্ট করা রায় পায়।
- আপনার অ্যাপ স্বাক্ষরিত এবং এনক্রিপ্ট করা রায়টি আপনার অ্যাপের ব্যাকএন্ডে প্রেরণ করে।
- আপনার অ্যাপের ব্যাকএন্ড ফলাফলটি গুগল প্লে সার্ভারে পাঠায়। গুগল প্লে সার্ভার ফলাফলটি ডিক্রিপ্ট করে যাচাই করে, ফলাফলগুলি আপনার অ্যাপের ব্যাকএন্ডে ফিরিয়ে দেয়।
- টোকেন পেলোডে থাকা সংকেতের উপর ভিত্তি করে আপনার অ্যাপের ব্যাকএন্ড কীভাবে এগিয়ে যেতে হবে তা নির্ধারণ করে।
- আপনার অ্যাপের ব্যাকএন্ড সিদ্ধান্তের ফলাফল আপনার অ্যাপে পাঠায়।
একটি ননস তৈরি করুন
যখন আপনি আপনার অ্যাপে Play Integrity API ব্যবহার করে কোনও অ্যাকশন সুরক্ষিত করেন, তখন আপনি নির্দিষ্ট ধরণের আক্রমণ, যেমন Person-in-the-middle (PITM) টেম্পারিং আক্রমণ এবং রিপ্লে আক্রমণ, কমাতে nonce ক্ষেত্রটি ব্যবহার করতে পারেন। 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 ক্ষেত্রটি ব্যবহার করতে পারেন।
যখন আপনি একটি সততা রায়ের অনুরোধ করেন:
- বিশ্বব্যাপী অনন্য মান এমনভাবে তৈরি করুন যাতে ক্ষতিকারক ব্যবহারকারীরা ভবিষ্যদ্বাণী করতে না পারে। উদাহরণস্বরূপ, সার্ভার সাইডে তৈরি হওয়া একটি ক্রিপ্টোগ্রাফিকভাবে সুরক্ষিত র্যান্ডম নম্বর এমন একটি মান হতে পারে, অথবা একটি পূর্ব-বিদ্যমান আইডি, যেমন একটি সেশন বা একটি লেনদেন আইডি। একটি সহজ এবং কম নিরাপদ রূপ হল ডিভাইসে একটি র্যান্ডম নম্বর তৈরি করা। আমরা 128 বিট বা তার চেয়ে বড় মান তৈরি করার পরামর্শ দিই।
- ধাপ ১ থেকে
nonceফিল্ডটিকে অনন্য মানে সেট করতেsetNonce()কল করুন।
যখন আপনি একটি সততার রায় পাবেন:
- ইন্টিগ্রিটি টোকেনটি ডিকোড এবং যাচাই করুন, এবং
nonceক্ষেত্র থেকে অনন্য মানটি পান। - যদি ধাপ ১ থেকে পাওয়া মানটি সার্ভারে তৈরি করা হয়ে থাকে, তাহলে পরীক্ষা করে দেখুন যে প্রাপ্ত অনন্য মানটি তৈরি করা মানগুলির মধ্যে একটি এবং এটি প্রথমবার ব্যবহার করা হচ্ছে (আপনার সার্ভারকে উপযুক্ত সময়ের জন্য তৈরি করা মানগুলির একটি রেকর্ড রাখতে হবে)। যদি প্রাপ্ত অনন্য মানটি ইতিমধ্যেই ব্যবহার করা হয়ে থাকে বা রেকর্ডে উপস্থিত না হয়, তাহলে অনুরোধটি প্রত্যাখ্যান করুন।
- অন্যথায়, যদি ডিভাইসে অনন্য মান তৈরি করা হয়ে থাকে, তাহলে পরীক্ষা করুন যে প্রাপ্ত মানটি প্রথমবার ব্যবহার করা হচ্ছে (আপনার সার্ভারকে উপযুক্ত সময়ের জন্য ইতিমধ্যে দেখা মানগুলির একটি রেকর্ড রাখতে হবে)। যদি প্রাপ্ত অনন্য মানটি ইতিমধ্যেই ব্যবহার করা হয়ে থাকে, তাহলে অনুরোধটি প্রত্যাখ্যান করুন।
টেম্পারিং এবং রিপ্লে আক্রমণের বিরুদ্ধে উভয় সুরক্ষা একত্রিত করুন (প্রস্তাবিত)
একই সাথে টেম্পারিং এবং রিপ্লে আক্রমণ উভয় থেকে রক্ষা করার জন্য nonce ক্ষেত্রটি ব্যবহার করা সম্ভব। এটি করার জন্য, উপরে বর্ণিত অনন্য মান তৈরি করুন এবং এটি আপনার অনুরোধের অংশ হিসাবে অন্তর্ভুক্ত করুন। তারপর অনুরোধ হ্যাশ গণনা করুন, হ্যাশের অংশ হিসাবে অনন্য মান অন্তর্ভুক্ত করার বিষয়টি নিশ্চিত করুন। একটি বাস্তবায়ন যা উভয় পদ্ধতিকে একত্রিত করে তা নিম্নরূপ:
যখন আপনি একটি সততা রায়ের অনুরোধ করেন:
- ব্যবহারকারী উচ্চ-মূল্যের ক্রিয়াটি শুরু করে।
- "রিপ্লে আক্রমণ থেকে রক্ষা করার জন্য অনন্য মান অন্তর্ভুক্ত করুন" বিভাগে বর্ণিত এই ক্রিয়াকলাপের জন্য একটি অনন্য মান পান।
- আপনি যে বার্তাটি সুরক্ষিত করতে চান তা প্রস্তুত করুন। বার্তায় ধাপ ২ থেকে অনন্য মানটি অন্তর্ভুক্ত করুন।
- আপনার অ্যাপটি যে বার্তাটি সুরক্ষিত করতে চায় তার একটি ডাইজেস্ট গণনা করে, যেমনটি "ইনক্লুড এ রিকোয়েস্ট হ্যাশ টু প্রোটেক্ট এনাউন্স টেম্পারিং" বিভাগে বর্ণিত হয়েছে। যেহেতু বার্তাটিতে অনন্য মান রয়েছে, তাই অনন্য মানটি হ্যাশের অংশ।
- আগের ধাপ থেকে গণনাকৃত ডাইজেস্টে
nonceক্ষেত্রটি সেট করতেsetNonce()ব্যবহার করুন।
যখন আপনি একটি সততার রায় পাবেন:
- অনুরোধ থেকে অনন্য মানটি পান
- ইন্টিগ্রিটি টোকেনটি ডিকোড এবং যাচাই করুন, এবং
nonceফিল্ড থেকে ডাইজেস্টটি পান। - "ট্যাম্পারিং থেকে রক্ষা করার জন্য একটি অনুরোধ হ্যাশ অন্তর্ভুক্ত করুন" বিভাগে বর্ণিত হিসাবে, সার্ভার সাইডে ডাইজেস্টটি পুনরায় গণনা করুন এবং পরীক্ষা করুন যে এটি ইন্টিগ্রিটি টোকেন থেকে প্রাপ্ত ডাইজেস্টের সাথে মেলে কিনা।
- "রিপ্লে আক্রমণ থেকে রক্ষা করার জন্য অনন্য মান অন্তর্ভুক্ত করুন" বিভাগে বর্ণিত হিসাবে, অনন্য মানের বৈধতা পরীক্ষা করুন।
নিম্নলিখিত সিকোয়েন্স ডায়াগ্রামটি সার্ভার-সাইড nonce সহ এই পদক্ষেপগুলি চিত্রিত করে:
একটি সততা রায়ের জন্য অনুরোধ করুন
একটি nonce জেনারেট করার পর, আপনি Google Play থেকে একটি integrity riedut অনুরোধ করতে পারেন। এটি করার জন্য, নিম্নলিখিত পদক্ষেপগুলি সম্পূর্ণ করুন:
- নিম্নলিখিত উদাহরণগুলিতে দেখানো হিসাবে একটি
IntegrityManagerতৈরি করুন। - একটি
IntegrityTokenRequestতৈরি করুন, যা সংশ্লিষ্ট বিল্ডারেsetNonce()পদ্ধতির মাধ্যমেnonceসরবরাহ করবে। Google Play এবং SDK-এর বাইরে একচেটিয়াভাবে বিতরণ করা অ্যাপগুলিকেsetCloudProjectNumber()পদ্ধতির মাধ্যমে তাদের Google Cloud প্রকল্প নম্বর নির্দিষ্ট করতে হবে। Google Play-তে থাকা অ্যাপগুলি Play Console-এর একটি ক্লাউড প্রকল্পের সাথে লিঙ্ক করা থাকে এবং অনুরোধে ক্লাউড প্রকল্প নম্বর সেট করার প্রয়োজন হয় না। ম্যানেজার ব্যবহার করে
requestIntegrityToken()কল করুন, যাIntegrityTokenRequestসরবরাহ করবে।
কোটলিন
// 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());
ঐক্য
IEnumerator RequestIntegrityTokenCoroutine() { // Receive the nonce from the secure server. var nonce = ... // Create an instance of a manager. var integrityManager = new IntegrityManager(); // 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 != IntegrityErrorCode.NoError) { AppendStatusLog("IntegrityAsyncOperation failed with error: " + requestIntegrityTokenOperation.Error); yield break; } // Get the response. var tokenResponse = requestIntegrityTokenOperation.GetResult(); }
অবাস্তব ইঞ্জিন
// .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 বাস্তবায়নে এনক্রিপশন / সাইনিং অ্যালগরিদমগুলি ভালভাবে সমর্থিত:
গুগলের সার্ভারে ডিক্রিপ্ট এবং যাচাই করুন (প্রস্তাবিত)
Play Integrity API আপনাকে Google এর সার্ভারে ইন্টিগ্রিটি রায় ডিক্রিপ্ট এবং যাচাই করতে দেয়, যা আপনার অ্যাপের নিরাপত্তা বৃদ্ধি করে। এটি করতে, এই পদক্ষেপগুলি সম্পূর্ণ করুন:
- গুগল ক্লাউড প্রজেক্টের মধ্যে একটি পরিষেবা অ্যাকাউন্ট তৈরি করুন যা আপনার অ্যাপের সাথে লিঙ্ক করা আছে।
আপনার অ্যাপের সার্ভারে,
playintegrityস্কোপ ব্যবহার করে আপনার পরিষেবা অ্যাকাউন্টের শংসাপত্র থেকে অ্যাক্সেস টোকেনটি আনুন এবং নিম্নলিখিত অনুরোধটি করুন:playintegrity.googleapis.com/v1/PACKAGE_NAME:decodeIntegrityToken -d \ '{ "integrity_token": "INTEGRITY_TOKEN" }'JSON প্রতিক্রিয়াটি পড়ুন।
স্থানীয়ভাবে ডিক্রিপ্ট এবং যাচাই করুন
যদি আপনি আপনার রেসপন্স এনক্রিপশন কীগুলি পরিচালনা এবং ডাউনলোড করতে চান, তাহলে আপনি আপনার নিজস্ব সুরক্ষিত সার্ভার পরিবেশের মধ্যে ফিরে আসা টোকেনটি ডিক্রিপ্ট এবং যাচাই করতে পারেন। আপনি IntegrityTokenResponse#token() পদ্ধতি ব্যবহার করে ফিরে আসা টোকেনটি পেতে পারেন।
নিচের উদাহরণে দেখানো হয়েছে কিভাবে প্লে কনসোল থেকে অ্যাপের ব্যাকএন্ডে ভাষা-নির্দিষ্ট (আমাদের ক্ষেত্রে জাভা প্রোগ্রামিং ভাষা) কীগুলিতে স্বাক্ষর যাচাইয়ের জন্য AES কী এবং DER-এনকোডেড পাবলিক EC কী ডিকোড করতে হয়। মনে রাখবেন যে কীগুলি ডিফল্ট ফ্ল্যাগ ব্যবহার করে base64-এনকোডেড।
কোটলিন
// 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 অংশটি যাচাই করে বের করুন।
কোটলিন
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();
ফলস্বরূপ পেলোড হল একটি প্লেইন-টেক্সট টোকেন যাতে ইন্টিগ্রিটি রায় থাকে।
গুগল প্লে প্রম্পট ব্যবহার করে রায় সংক্রান্ত সমস্যাগুলি সমাধান করুন (ঐচ্ছিক)
আপনার সার্ভারটি একটি অখণ্ডতা রায় পাওয়ার পর, সার্ভার কীভাবে এগিয়ে যেতে হবে তা নির্ধারণ করতে পারে। যদি রায়টি নির্দেশ করে যে কোনও সমস্যা আছে — যেমন অ্যাপটি লাইসেন্সবিহীন, টেম্পারড, অথবা ডিভাইসটি আপস করা হয়েছে — তাহলে আপনি ব্যবহারকারীদের নিজেরাই সমস্যাটি সমাধান করার সুযোগ দিতে পারেন।
Play Integrity API একটি Google Play ডায়ালগ দেখানোর বিকল্প প্রদান করে যা ব্যবহারকারীকে পদক্ষেপ নিতে অনুরোধ করে, উদাহরণস্বরূপ, Google Play থেকে আপনার অ্যাপের অফিসিয়াল সংস্করণ পেতে।
সার্ভারের প্রতিক্রিয়ার উপর ভিত্তি করে আপনার অ্যাপ থেকে এই ডায়ালগগুলি কীভাবে ট্রিগার করবেন তা জানতে, Remediation ডায়ালগগুলি দেখুন।