আপনি যদি শুধুমাত্র স্ট্যান্ডার্ড API অনুরোধ করার পরিকল্পনা করে থাকেন, যা বেশিরভাগ ডেভেলপারদের জন্য উপযুক্ত, আপনি অখণ্ডতার রায়ে এগিয়ে যেতে পারেন। এই পৃষ্ঠাটি অখণ্ডতার রায়ের জন্য ক্লাসিক API অনুরোধ করার বর্ণনা করে, যেগুলি Android 4.4 (API স্তর 19) বা উচ্চতর সংস্করণে সমর্থিত।
বিবেচনা
স্ট্যান্ডার্ড এবং ক্লাসিক অনুরোধের তুলনা করুন
আপনি আপনার অ্যাপের নিরাপত্তা এবং অপব্যবহারের বিরোধী চাহিদার উপর নির্ভর করে স্ট্যান্ডার্ড অনুরোধ, ক্লাসিক অনুরোধ বা দুটির সংমিশ্রণ করতে পারেন। স্ট্যান্ডার্ড অনুরোধগুলি সমস্ত অ্যাপ এবং গেমের জন্য উপযুক্ত এবং Google Play-তে রিপ্লেবিলিটি এবং এক্সফিল্ট্রেশনের বিরুদ্ধে কিছু সুরক্ষা অর্পণ করার সময় যেকোনো অ্যাকশন বা সার্ভার কল আসল কিনা তা পরীক্ষা করতে ব্যবহার করা যেতে পারে। ক্লাসিক অনুরোধগুলি করা আরও ব্যয়বহুল এবং বহিঃপ্রকাশ এবং নির্দিষ্ট ধরণের আক্রমণ থেকে রক্ষা করার জন্য সেগুলি সঠিকভাবে প্রয়োগ করার জন্য আপনি দায়ী। আদর্শ অনুরোধের তুলনায় ক্লাসিক অনুরোধগুলি কম ঘন ঘন করা উচিত, উদাহরণস্বরূপ একটি অত্যন্ত মূল্যবান বা সংবেদনশীল পদক্ষেপটি সত্য কিনা তা পরীক্ষা করার জন্য মাঝে মাঝে এক-অফ হিসাবে।
নিম্নলিখিত সারণী দুটি ধরণের অনুরোধের মধ্যে মূল পার্থক্যগুলি হাইলাইট করে:
স্ট্যান্ডার্ড API অনুরোধ | ক্লাসিক API অনুরোধ | |
---|---|---|
প্রাক-প্রয়োজনীয় | ||
ন্যূনতম Android SDK সংস্করণ প্রয়োজন | Android 5.0 (API স্তর 21) বা উচ্চতর | Android 4.4 (API স্তর 19) বা উচ্চতর |
Google Play প্রয়োজনীয়তা | গুগল প্লে স্টোর এবং গুগল প্লে পরিষেবা | গুগল প্লে স্টোর এবং গুগল প্লে পরিষেবা |
ইন্টিগ্রেশন বিবরণ | ||
এপিআই ওয়ার্ম আপ প্রয়োজন | ✔️ (কয়েক সেকেন্ড) | ❌ |
সাধারণ অনুরোধ বিলম্বিত | কয়েকশ মিলিসেকেন্ড | কয়েক সেকেন্ড |
সম্ভাব্য অনুরোধের ফ্রিকোয়েন্সি | ঘন ঘন (অন-ডিমান্ড চেক কোন ক্রিয়া বা অনুরোধের জন্য) | বিরল (সর্বোচ্চ মূল্যের ক্রিয়া বা সবচেয়ে সংবেদনশীল অনুরোধের জন্য এক-বার চেক) |
টাইমআউট | বেশিরভাগ ওয়ার্ম আপের বয়স 10 এর কম কিন্তু সেগুলি একটি সার্ভার কল জড়িত, তাই একটি দীর্ঘ সময় শেষ করার সুপারিশ করা হয় (যেমন 1 মিনিট)। রায় অনুরোধ ক্লায়েন্ট-সাইড ঘটবে | বেশিরভাগ অনুরোধের বয়স 10 এর কম কিন্তু সেগুলির মধ্যে একটি সার্ভার কল জড়িত, তাই একটি দীর্ঘ সময় শেষ করার সুপারিশ করা হয় (যেমন 1 মিনিট) |
সততা রায় টোকেন | ||
ডিভাইস, অ্যাপ এবং অ্যাকাউন্টের বিবরণ রয়েছে | ✔️ | ✔️ |
টোকেন ক্যাশিং | Google Play দ্বারা সুরক্ষিত অন-ডিভাইস ক্যাশিং | সুপারিশ করা হয় না |
Google Play সার্ভারের মাধ্যমে টোকেন ডিক্রিপ্ট এবং যাচাই করুন | ✔️ | ✔️ |
সাধারণ ডিক্রিপশন সার্ভার থেকে সার্ভার অনুরোধ লেটেন্সি | তিন-নয়টি উপলব্ধতা সহ 10 সেকেন্ডের মিলিসেকেন্ড | তিন-নয়টি উপলব্ধতা সহ 10 সেকেন্ডের মিলিসেকেন্ড |
একটি সুরক্ষিত সার্ভার পরিবেশে স্থানীয়ভাবে টোকেন ডিক্রিপ্ট এবং যাচাই করুন | ❌ | ✔️ |
টোকেন ক্লায়েন্ট-সাইড ডিক্রিপ্ট এবং যাচাই করুন | ❌ | ❌ |
সততা রায় তাজাতা | Google Play দ্বারা কিছু স্বয়ংক্রিয় ক্যাশিং এবং রিফ্রেশিং | প্রতিটি অনুরোধে সমস্ত রায় পুনর্গণনা করা হয়েছে |
সীমা | ||
প্রতিদিন প্রতি অ্যাপের অনুরোধ | ডিফল্টরূপে 10,000 (একটি বৃদ্ধির অনুরোধ করা যেতে পারে) | ডিফল্টরূপে 10,000 (একটি বৃদ্ধির অনুরোধ করা যেতে পারে) |
প্রতি মিনিটে প্রতি অ্যাপের প্রতি অনুরোধ | ওয়ার্ম আপ: 5 প্রতি মিনিট সততা টোকেন: কোনো পাবলিক সীমা নেই* | ইন্টিগ্রিটি টোকেন: 5 প্রতি মিনিট |
সুরক্ষা | ||
টেম্পারিং এবং অনুরূপ আক্রমণের বিরুদ্ধে প্রশমিত করুন | requestHash ক্ষেত্র ব্যবহার করুন | অনুরোধের ডেটার উপর ভিত্তি করে কন্টেন্ট বাইন্ডিং সহ nonce ফিল্ড ব্যবহার করুন |
রিপ্লে এবং অনুরূপ আক্রমণের বিরুদ্ধে প্রশমিত করুন | Google Play দ্বারা স্বয়ংক্রিয় প্রশমন | সার্ভার সাইড লজিক সহ nonce ফিল্ড ব্যবহার করুন |
* সকল অনুরোধ, যার মধ্যে সর্বজনীন সীমা নেই, উচ্চ মূল্যে অ-সর্বজনীন প্রতিরক্ষামূলক সীমার সাপেক্ষে
কদাচিৎ ক্লাসিক অনুরোধ করুন
একটি অখণ্ডতা টোকেন তৈরি করতে সময়, ডেটা এবং ব্যাটারি ব্যবহার করা হয় এবং প্রতিটি অ্যাপ প্রতিদিন সর্বোচ্চ সংখ্যক ক্লাসিক অনুরোধ করতে পারে। তাই আপনি শুধুমাত্র সর্বোচ্চ মান পরীক্ষা করার জন্য ক্লাসিক অনুরোধ করা উচিত বা সবচেয়ে সংবেদনশীল ক্রিয়াগুলি আসল কিনা যখন আপনি একটি আদর্শ অনুরোধের অতিরিক্ত গ্যারান্টি চান। উচ্চ-ফ্রিকোয়েন্সি বা কম-মানের অ্যাকশনের জন্য আপনার ক্লাসিক অনুরোধ করা উচিত নয়। প্রতিবার অ্যাপটি ফোরগ্রাউন্ডে বা পটভূমিতে প্রতি কয়েক মিনিটের মধ্যে ক্লাসিক অনুরোধ করবেন না এবং একই সময়ে প্রচুর সংখ্যক ডিভাইস থেকে কল করা এড়িয়ে যাবেন। অনেক ক্লাসিক অনুরোধ কল করে এমন একটি অ্যাপ ব্যবহারকারীদের ভুল বাস্তবায়ন থেকে রক্ষা করতে থ্রোটল হতে পারে।
ক্যাশিং রায় এড়িয়ে চলুন
একটি রায় ক্যাশে করা আক্রমণের ঝুঁকি বাড়ায় যেমন এক্সফিল্ট্রেশন এবং রিপ্লে, যেখানে একটি ভাল রায় একটি অবিশ্বস্ত পরিবেশ থেকে পুনরায় ব্যবহার করা হয়। আপনি যদি একটি ক্লাসিক অনুরোধ করার কথা ভাবছেন এবং তারপরে এটিকে পরে ব্যবহারের জন্য ক্যাশে করার কথা ভাবছেন, তবে চাহিদা অনুযায়ী একটি আদর্শ অনুরোধ সম্পাদন করার পরিবর্তে এটি সুপারিশ করা হয়। স্ট্যান্ডার্ড অনুরোধ ডিভাইসে কিছু ক্যাশিং জড়িত কিন্তু Google Play রিপ্লে আক্রমণ এবং বহিষ্কারের ঝুঁকি কমাতে অতিরিক্ত সুরক্ষা কৌশল ব্যবহার করে।
ক্লাসিক অনুরোধ রক্ষা করতে nonce ক্ষেত্রটি ব্যবহার করুন
Play Integrity API nonce
নামক একটি ক্ষেত্র অফার করে, যা রিপ্লে এবং টেম্পারিং আক্রমণের মতো কিছু আক্রমণ থেকে আপনার অ্যাপকে আরও রক্ষা করতে ব্যবহার করা যেতে পারে। প্লে ইন্টিগ্রিটি এপিআই সাইন করা ইন্টিগ্রিটি রেসপন্সের ভিতরে এই ফিল্ডে আপনার সেট করা মান প্রদান করে। আপনার অ্যাপকে আক্রমণ থেকে রক্ষা করার জন্য কীভাবে ননস জেনারেট করবেন সেই নির্দেশিকা সাবধানে অনুসরণ করুন।
সূচকীয় ব্যাকঅফ সহ ক্লাসিক অনুরোধগুলি পুনরায় চেষ্টা করুন
পরিবেশগত অবস্থা, যেমন একটি অস্থির ইন্টারনেট সংযোগ বা একটি ওভারলোড ডিভাইস, ডিভাইসের অখণ্ডতা পরীক্ষা ব্যর্থ হতে পারে। এটি অন্যথায় বিশ্বাসযোগ্য ডিভাইসের জন্য কোনো লেবেল তৈরি করতে পারে না। এই পরিস্থিতিগুলি প্রশমিত করতে, সূচকীয় ব্যাকঅফ সহ একটি পুনরায় চেষ্টা করার বিকল্প অন্তর্ভুক্ত করুন।
ওভারভিউ
যখন ব্যবহারকারী আপনার অ্যাপে একটি উচ্চ-মূল্যের ক্রিয়া সম্পাদন করে যা আপনি একটি অখণ্ডতা পরীক্ষা দিয়ে রক্ষা করতে চান, নিম্নলিখিত পদক্ষেপগুলি সম্পূর্ণ করুন:
- আপনার অ্যাপের সার্ভার-সাইড ব্যাকএন্ড ক্লায়েন্ট-সাইড যুক্তিতে একটি অনন্য মান তৈরি করে এবং পাঠায়। অবশিষ্ট পদক্ষেপগুলি এই যুক্তিটিকে আপনার "অ্যাপ" হিসাবে উল্লেখ করে৷
- আপনার অ্যাপটি অনন্য মান এবং আপনার উচ্চ-মূল্যের ক্রিয়াকলাপের বিষয়বস্তু থেকে
nonce
তৈরি করে। এটি তখন প্লে ইন্টিগ্রিটি এপিআইকে কল করে,nonce
পাস করে। - আপনার অ্যাপটি Play Integrity API থেকে একটি স্বাক্ষরিত এবং এনক্রিপ্ট করা রায় পায়।
- আপনার অ্যাপ আপনার অ্যাপের ব্যাকএন্ডে স্বাক্ষরিত এবং এনক্রিপ্ট করা রায় পাস করে।
- আপনার অ্যাপের ব্যাকএন্ড একটি Google Play সার্ভারে রায় পাঠায়। Google Play সার্ভার ডিক্রিপ্ট করে এবং রায় যাচাই করে, ফলাফলগুলি আপনার অ্যাপের ব্যাকএন্ডে ফিরিয়ে দেয়।
- টোকেন পেলোডে থাকা সংকেতের উপর ভিত্তি করে আপনার অ্যাপের ব্যাকএন্ড কীভাবে এগিয়ে যেতে হবে তা নির্ধারণ করে।
- আপনার অ্যাপের ব্যাকএন্ড সিদ্ধান্তের ফলাফল আপনার অ্যাপে পাঠায়।
একটি nonce জেনারেট
আপনি যখন Play Integrity API-এর সাহায্যে আপনার অ্যাপে কোনো অ্যাকশন রক্ষা করেন, তখন আপনি নির্দিষ্ট ধরনের আক্রমণ যেমন ব্যক্তি-ইন-দ্য-মিডল (PITM) টেম্পারিং আক্রমণ এবং রিপ্লে আক্রমণ প্রশমিত করতে nonce
ফিল্ড ব্যবহার করতে পারেন। প্লে ইন্টিগ্রিটি এপিআই সাইন করা ইন্টিগ্রিটি রেসপন্সের ভিতরে এই ফিল্ডে আপনার সেট করা মান প্রদান করে।
nonce
ফিল্ডে সেট করা মানটি অবশ্যই সঠিকভাবে ফর্ম্যাট করা উচিত:
-
String
- URL-নিরাপদ
- বেস 64 এবং নন-র্যাপিং হিসাবে এনকোড করা হয়েছে
- ন্যূনতম ১৬টি অক্ষর
- সর্বাধিক 500টি অক্ষর
প্লে ইন্টিগ্রিটি এপিআই-এ nonce
ফিল্ড ব্যবহার করার কিছু সাধারণ উপায় নিচে দেওয়া হল। nonce
থেকে শক্তিশালী সুরক্ষা পেতে, আপনি নীচের পদ্ধতিগুলি একত্রিত করতে পারেন।
ট্যাম্পারিং থেকে রক্ষা করার জন্য একটি অনুরোধ হ্যাশ অন্তর্ভুক্ত করুন
আপনি একটি ক্লাসিক API অনুরোধে nonce
প্যারামিটারটি ব্যবহার করতে পারেন একইভাবে requestHash
প্যারামিটারের মতো একটি স্ট্যান্ডার্ড API অনুরোধে টেম্পারিংয়ের বিরুদ্ধে অনুরোধের বিষয়বস্তু রক্ষা করতে।
যখন আপনি একটি সততা রায়ের জন্য অনুরোধ করেন:
- ব্যবহারকারীর অ্যাকশন বা সার্ভারের অনুরোধ যা ঘটছে তা থেকে সমস্ত সমালোচনামূলক অনুরোধের পরামিতিগুলির একটি ডাইজেস্ট গণনা করুন (যেমন একটি স্থিতিশীল অনুরোধ ক্রমিককরণের SHA256)।
- কম্পিউটেড ডাইজেস্টের মানের সাথে
nonce
ফিল্ড সেট করতেsetNonce
ব্যবহার করুন।
যখন আপনি একটি অখণ্ডতার রায় পান:
- ডিকোড করুন এবং অখণ্ডতা টোকেন যাচাই করুন, এবং
nonce
ফিল্ড থেকে ডাইজেস্ট পান। - অ্যাপের মতো একই পদ্ধতিতে অনুরোধের একটি ডাইজেস্ট গণনা করুন (যেমন একটি স্থিতিশীল অনুরোধের ক্রমিককরণের SHA256)।
- অ্যাপ-সাইড এবং সার্ভার-সাইড ডাইজেস্টের তুলনা করুন। যদি তারা মেলে না, অনুরোধ বিশ্বাসযোগ্য নয়।
রিপ্লে আক্রমণ থেকে রক্ষা করার জন্য অনন্য মান অন্তর্ভুক্ত করুন
দূষিত ব্যবহারকারীদের Play Integrity API থেকে পূর্ববর্তী প্রতিক্রিয়াগুলি পুনরায় ব্যবহার করা থেকে বিরত করার জন্য, আপনি প্রতিটি বার্তাকে স্বতন্ত্রভাবে সনাক্ত করতে nonce
ক্ষেত্রটি ব্যবহার করতে পারেন৷
যখন আপনি একটি সততা রায়ের জন্য অনুরোধ করেন:
- দূষিত ব্যবহারকারীরা ভবিষ্যদ্বাণী করতে না পারে এমনভাবে বিশ্বব্যাপী অনন্য মান পান। উদাহরণ স্বরূপ, সার্ভার সাইডে উত্পন্ন একটি ক্রিপ্টোগ্রাফিকভাবে-সুরক্ষিত র্যান্ডম নম্বর এমন একটি মান হতে পারে, বা একটি সেশন বা একটি লেনদেন আইডির মতো একটি প্রাক-বিদ্যমান ID হতে পারে৷ একটি সহজ এবং কম নিরাপদ বৈকল্পিক হল ডিভাইসে একটি র্যান্ডম নম্বর তৈরি করা। আমরা 128 বিট বা তার চেয়ে বড় মান তৈরি করার পরামর্শ দিই।
- ধাপ 1 থেকে
nonce
ফিল্ডটিকে অনন্য মান সেট করতেsetNonce()
কল করুন।
যখন আপনি একটি অখণ্ডতার রায় পান:
- ডিকোড করুন এবং অখণ্ডতা টোকেন যাচাই করুন, এবং
nonce
ফিল্ড থেকে অনন্য মান পান। - যদি ধাপ 1 থেকে মানটি সার্ভারে জেনারেট করা হয় তবে পরীক্ষা করুন যে প্রাপ্ত অনন্য মানটি উত্পন্ন মানগুলির মধ্যে একটি ছিল এবং এটি প্রথমবারের জন্য ব্যবহার করা হচ্ছে (আপনার সার্ভারকে একটি উপযুক্ত সময়কালের জন্য উত্পন্ন মানগুলির একটি রেকর্ড রাখতে হবে ) যদি প্রাপ্ত অনন্য মানটি ইতিমধ্যেই ব্যবহৃত হয়ে থাকে বা রেকর্ডে উপস্থিত না হয় তবে অনুরোধটি প্রত্যাখ্যান করুন
- অন্যথায়, ডিভাইসে অনন্য মান তৈরি হলে, প্রাপ্ত মানটি প্রথমবার ব্যবহার করা হচ্ছে কিনা তা পরীক্ষা করে দেখুন (আপনার সার্ভারকে একটি উপযুক্ত সময়কালের জন্য ইতিমধ্যে দেখা মানগুলির রেকর্ড রাখতে হবে)। যদি প্রাপ্ত অনন্য মান ইতিমধ্যেই ব্যবহার করা হয়ে থাকে, তাহলে অনুরোধ প্রত্যাখ্যান করুন।
টেম্পারিং এবং রিপ্লে আক্রমণের বিরুদ্ধে উভয় সুরক্ষা একত্রিত করুন (প্রস্তাবিত)
একই সময়ে টেম্পারিং এবং রিপ্লে আক্রমণ উভয়ের বিরুদ্ধে সুরক্ষার জন্য nonce
ফিল্ড ব্যবহার করা সম্ভব। এটি করতে, উপরে বর্ণিত হিসাবে অনন্য মান তৈরি করুন এবং আপনার অনুরোধের অংশ হিসাবে এটি অন্তর্ভুক্ত করুন। তারপর হ্যাশের অংশ হিসাবে অনন্য মান অন্তর্ভুক্ত করার বিষয়টি নিশ্চিত করে অনুরোধ হ্যাশ গণনা করুন। একটি বাস্তবায়ন যা উভয় পন্থাকে একত্রিত করে নিম্নরূপ:
যখন আপনি একটি সততা রায়ের জন্য অনুরোধ করেন:
- ব্যবহারকারী উচ্চ-মূল্য ক্রিয়া শুরু করে।
- রিপ্লে আক্রমণ থেকে রক্ষা করার জন্য অনন্য মান অন্তর্ভুক্ত করুন এ বর্ণিত এই কর্মের জন্য একটি অনন্য মান পান।
- আপনি সুরক্ষিত করতে চান এমন একটি বার্তা প্রস্তুত করুন। বার্তায় ধাপ 2 থেকে অনন্য মান অন্তর্ভুক্ত করুন।
- আপনার অ্যাপটি যে বার্তাটি রক্ষা করতে চায় তার একটি ডাইজেস্ট গণনা করে, যেমনটি ট্যাম্পারিং থেকে রক্ষা করার জন্য একটি অনুরোধ হ্যাশ অন্তর্ভুক্ত করুন । যেহেতু বার্তাটিতে অনন্য মান রয়েছে, তাই অনন্য মানটি হ্যাশের অংশ।
- পূর্ববর্তী ধাপ থেকে গণনা করা ডাইজেস্টে
nonce
ক্ষেত্র সেট করতেsetNonce()
ব্যবহার করুন।
যখন আপনি একটি অখণ্ডতার রায় পান:
- অনুরোধ থেকে অনন্য মান প্রাপ্ত করুন
- ডিকোড করুন এবং অখণ্ডতা টোকেন যাচাই করুন, এবং
nonce
ফিল্ড থেকে ডাইজেস্ট পান। - ট্যাম্পারিং বিভাগ থেকে রক্ষা করার জন্য একটি অনুরোধ হ্যাশ অন্তর্ভুক্ত করুন- এ বর্ণিত হিসাবে, সার্ভারের পাশে ডাইজেস্টটি পুনরায় গণনা করুন এবং এটি অখণ্ডতা টোকেন থেকে প্রাপ্ত ডাইজেস্টের সাথে মেলে কিনা তা পরীক্ষা করুন৷
- রিপ্লে আক্রমণ থেকে রক্ষা করার জন্য অনন্য মান অন্তর্ভুক্ত করুন বিভাগে বর্ণিত হিসাবে, অনন্য মানটির বৈধতা পরীক্ষা করুন।
নিম্নলিখিত ক্রম চিত্রটি সার্ভার-সাইড nonce
সহ এই পদক্ষেপগুলিকে চিত্রিত করে:
একটি সততা রায় অনুরোধ
একটি nonce
জেনারেট করার পরে, আপনি Google Play থেকে একটি অখণ্ডতার রায়ের জন্য অনুরোধ করতে পারেন৷ এটি করতে, নিম্নলিখিত পদক্ষেপগুলি সম্পূর্ণ করুন:
- একটি
IntegrityManager
তৈরি করুন, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে। - একটি
IntegrityTokenRequest
তৈরি করুন, সংশ্লিষ্ট বিল্ডারেরsetNonce()
পদ্ধতির মাধ্যমেnonce
সরবরাহ করে। Google Play এবং SDK-এর বাইরে একচেটিয়াভাবে বিতরণ করা অ্যাপগুলিকেsetCloudProjectNumber()
পদ্ধতির মাধ্যমে তাদের Google ক্লাউড প্রকল্প নম্বর উল্লেখ করতে হবে। Google Play-এর অ্যাপগুলি প্লে কনসোলে একটি ক্লাউড প্রোজেক্টের সাথে লিঙ্ক করা আছে এবং অনুরোধে ক্লাউড প্রোজেক্ট নম্বর সেট করার প্রয়োজন নেই। IntegrityTokenRequest
সরবরাহ করে,requestIntegrityToken()
কে কল করতে ম্যানেজার ব্যবহার করুন।
কোটলিন
// 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(); }
নেটিভ
/// 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 ক্লাউড প্রকল্পের মধ্যে একটি পরিষেবা অ্যাকাউন্ট তৈরি করুন ।
আপনার অ্যাপের সার্ভারে,
playintegrity
স্কোপ ব্যবহার করে আপনার পরিষেবা অ্যাকাউন্টের শংসাপত্রগুলি থেকে অ্যাক্সেস টোকেন আনুন এবং নিম্নলিখিত অনুরোধ করুন:playintegrity.googleapis.com/v1/PACKAGE_NAME:decodeIntegrityToken -d \ '{ "integrity_token": "INTEGRITY_TOKEN" }'
JSON প্রতিক্রিয়া পড়ুন।
ডিক্রিপ্ট এবং স্থানীয়ভাবে যাচাই
আপনি যদি আপনার প্রতিক্রিয়া এনক্রিপশন কীগুলি পরিচালনা এবং ডাউনলোড করতে চান তবে আপনি আপনার নিজের সুরক্ষিত সার্ভার পরিবেশের মধ্যে ফিরে আসা টোকেনটিকে ডিক্রিপ্ট এবং যাচাই করতে পারেন। আপনি IntegrityTokenResponse#token()
পদ্ধতি ব্যবহার করে ফেরত টোকেন পেতে পারেন।
অ্যাপের ব্যাকএন্ডে প্লে কনসোল থেকে ভাষা-নির্দিষ্ট (জাভা প্রোগ্রামিং ভাষা, আমাদের ক্ষেত্রে) কীগুলিতে স্বাক্ষর যাচাইয়ের জন্য AES কী এবং DER-এনকোডেড পাবলিক ইসি কী কীভাবে ডিকোড করতে হয় তা নিম্নলিখিত উদাহরণে দেখানো হয়েছে। নোট করুন যে কীগুলি ডিফল্ট পতাকা ব্যবহার করে বেস64-এনকোড করা হয়।
কোটলিন
// 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();
ফলস্বরূপ পেলোড হল একটি প্লেইন-টেক্সট টোকেন যাতে অখণ্ডতার রায় রয়েছে।