অ্যান্ড্রয়েডে টোকেনগুলি সুরক্ষিতভাবে সংরক্ষণ করার বিষয়ে আরও জানুন

এই নিবন্ধটির অগ্রণী হিসাবে আমি কাল্পনিক পাঠকের জন্য একটি ছোট বাক্য উদ্ধৃত করতে চাই। আমরা এগিয়ে যাওয়ার সাথে সাথে এই উদ্ধৃতিটি গুরুত্বপূর্ণ হবে।

পরম সুরক্ষার মতো কোনও জিনিস নেই is সুরক্ষা একে অপরের উপর ভিত্তি করে গড়ে তোলা এবং অনিবার্যতা ধীর করার জন্য একত্রিত করার ব্যবস্থাগুলির একটি সেট।

প্রায় তিন বছর আগে আমি অনুমানযুক্ত আক্রমণকারী যিনি আমাদের অ্যান্ড্রয়েড অ্যাপ্লিকেশনটি পচে ফেলছেন তার থেকে স্ট্রিং টোকেন কীভাবে রক্ষা করা যায় সে সম্পর্কে ধারণাগুলি সহ একটি পোস্ট লিখেছিলাম। স্মৃতির স্বার্থে এবং ইন্টারনেটের অনিবার্য মৃত্যু থেকে রক্ষা পেতে আমি এখানে কয়েকটি বিভাগ পুনরুত্পাদন করছি।

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

প্রয়োগ করতে হবে পরম প্রথম পদক্ষেপটি ক্লায়েন্ট এবং সার্ভারের মধ্যে একটি এসএসএল (সিকিউর সকেটস স্তর) সংযোগ ব্যবহার করা। আসল অফারে ফিরে যান। এটি নিখুঁত গোপনীয়তা এবং সুরক্ষার গ্যারান্টি দেয় না, যদিও এটি প্রথম কাজ ভাল।

যদি আপনি কোনও এসএসএল সংযোগ ব্যবহার করে থাকেন (যেমন আপনি যখন নিজের ব্রাউজারে লকারটি দেখেন) তবে এটি নির্দেশ করে যে আপনার এবং সার্ভারের মধ্যে সংযোগটি এনক্রিপ্ট করা আছে। তত্ত্ব অনুসারে, এই অনুরোধগুলিতে থাকা তথ্যগুলিতে কিছুই অ্যাক্সেস করতে পারে না (*)

(*) আমি কি উল্লেখ করেছি যে নিরঙ্কুশ সুরক্ষা নেই? এসএসএল সংযোগগুলি এখনও আপস করা যেতে পারে। এই নিবন্ধটি সমস্ত সম্ভাব্য আক্রমণগুলির একটি বিস্তৃত তালিকা সরবরাহ করে না, তবে কয়েকটি উপায় সম্পর্কে আপনাকে বলতে চাই। নকল এসএসএল শংসাপত্র এবং মধ্য-মধ্যের আক্রমণগুলি ব্যবহার করা যেতে পারে।

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

একটি পরবর্তী যৌক্তিক পদক্ষেপ যা আজ ব্যবহৃত হয় তা হল যোগাযোগের জন্য কোনও প্রমাণীকরণ টোকেন বা একটি API কী সরবরাহ করা। এটি এইভাবে কাজ করে। আমাদের ব্যাকএন্ড একটি আবেদন গ্রহণ করে। আমরা কীভাবে জানতে পারি যে আবেদনটি আমাদের যাচাইকৃত গ্রাহকদের মধ্য থেকে আসে এবং আমাদের এপিআই অ্যাক্সেস করার চেষ্টা করে এমন কোনও এলোমেলো লোকের কাছ থেকে আসে না? ব্যাকএন্ড পরীক্ষা করে যে ক্লায়েন্টটি একটি বৈধ API কী সরবরাহ করে। পূর্ববর্তী বিবৃতিটি সত্য হলে আমরা অনুরোধটি চালিয়ে যাচ্ছি। অন্যথায় আমরা এটিকে প্রত্যাখ্যান করি এবং আমাদের ব্যবসায়ের প্রকৃতির উপর নির্ভর করে কিছু সংশোধনমূলক ব্যবস্থা গ্রহণ করি (এই ক্ষেত্রে আমি বিশেষত গ্রাহকের আইপি ঠিকানা এবং আইডিগুলি সংরক্ষণ করতে চাই যে এটি প্রায়শই ঘটে see যদি ফ্রিকোয়েন্সি এটি অতিক্রম করে তবে এটি আমার জন্য কাম্য ভাল স্বাদ, আমি একটি নিষেধাজ্ঞার বিষয়ে চিন্তা করছি বা অভদ্র ইন্টারনেট লোকটি কী অর্জন করতে চাইছে তা ঠিক দেখছি)।

আসুন মাটি থেকে আমাদের দুর্গ তৈরি করুন। আমাদের অ্যাপ্লিকেশনটিতে আমরা সম্ভবত API_KEY নামে একটি পরিবর্তনশীল যুক্ত করব যা প্রতিটি অনুরোধের মধ্যে স্বয়ংক্রিয়ভাবে প্রবেশ করা হবে (যদি আপনি অ্যান্ড্রয়েড ব্যবহার করছেন, সম্ভবত আপনার retrofit ক্লায়েন্টে)।

ব্যক্তিগত চূড়ান্ত স্ট্যাটিক স্ট্রিং API_KEY = "67a5af7f89ah3katf7m20fdj202"

এটি দুর্দান্ত এবং যদি আমরা আমাদের গ্রাহকদের সত্যায়িত করতে চাই তবে তা কার্যকর হয়। সমস্যাটি হ'ল নিজেই খুব কার্যকর স্তর নেই।

আপনি যদি অ্যাপ্লিকোলটি অ্যাপ্লিকেশনটি ডিসম্পাইল করে স্ট্রিংগুলি অনুসন্ধান করেন তবে আপনি ফলাফল প্রাপ্ত .smali ফাইলগুলির মধ্যে একটিতে নিম্নলিখিতটি পাবেন:

কনস্ট্রিং স্ট্রিং ভি 1, "67a5af7f89ah3katf7m20fdj202"

হ্যাঁ নিশ্চিত এটি একটি বৈধতা টোকেন হিসাবে বলা হয় না, সুতরাং কীভাবে এই স্ট্রিংয়ে পৌঁছানো যায় এবং এটি প্রমাণীকরণের উদ্দেশ্যে ব্যবহার করা যায় কি না তা সিদ্ধান্ত নিতে আমাদের এখনও সতর্ক পর্যালোচনা করা দরকার। তবে আপনি জানেন যে আমি কোথায় যাচ্ছি: এটি বেশিরভাগ সময় এবং সংস্থানগুলির বিষয়।

প্রোগ্রার্ড কি আমাদের এই স্ট্রিংটি সুরক্ষিত করতে সহায়তা করতে পারে যাতে আমাদের চিন্তা করার দরকার নেই? আসলেই না। প্রোগার্ড তার এফএকিউতে উল্লেখ করে যে স্ট্রিং এনক্রিপশন পুরোপুরি সম্ভব নয়।

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

নেটিভ ডেভলপমেন্ট কিট (এনডিকে)

আমি এখানে প্রস্তাবিত মূল মডেলটি ব্রাশ করতে যাচ্ছি এবং একটি নিরাপদ বিকল্প সরবরাহ করতে আমরা কীভাবে এর মধ্য দিয়ে যেতে পারি। আসুন দুটি ফাংশন কল্পনা করুন যা আমাদের ডেটা এনক্রিপ্ট এবং ডিক্রিপ্ট করতে ব্যবহৃত হতে পারে:

এখানে বিশেষ কিছু নেই। এই উভয় ফাংশনের এনকোড বা ডিকোড করার জন্য একটি মূল মান এবং একটি স্ট্রিং দরকার। আপনি এনক্রিপ্ট করা বা ডিক্রিপ্ট করা টোকেনটি ফিরিয়ে দেন। আমরা নিম্নলিখিত ফাংশনটি নিম্নলিখিত হিসাবে কল করব:

আপনি কি অনুমান? এটা সঠিক। প্রয়োজনে আমরা এনক্রিপ্ট করতে এবং আমাদের টোকেনটি ডিক্রিপ্ট করতে পারি। এটি সুরক্ষার একটি অতিরিক্ত স্তর সরবরাহ করে: যখন কোডটি অবরুদ্ধ করা হয়, তখন স্ট্রিং অনুসন্ধান সম্পাদন করা এবং স্ট্রিংটি যে পরিবেশে অবস্থিত সে পরিবেশটি পরীক্ষা করার মতো আর সহজ হয় না। তবে আপনি কি এখনও কোনও সমস্যার সমাধান করতে পারেন যা সমাধান করা দরকার?

পারবেন তো?

আপনি যদি এখনও এটি বের না করে থাকেন তবে তাকে আরও কয়েক সেকেন্ড দিন।

হ্যাঁ, আপনি ঠিক বলেছেন। আমাদের কাছে একটি এনক্রিপশন কী রয়েছে যা স্ট্রিং হিসাবেও সংরক্ষণ করা হয়। এটি অবলম্বনের মাধ্যমে সুরক্ষা বাড়িয়ে তোলে, তবে এই টোকনটি এনক্রিপশনের জন্য ব্যবহৃত হয় বা নিজেই টোকেনের জন্য নির্বিশেষে আমাদের কাছে সরল পাঠ্যের জন্য একটি টোকন রয়েছে।

এখন আসুন এনডিকে ব্যবহার করুন এবং আমাদের সুরক্ষা প্রক্রিয়াটি পুনরাবৃত্তি করুন।

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

আমাদের সি ++ ফাংশনটি দেখতে এরকম হবে:

এটি কেবল আপনার জাভা কোডে বলা হয়:

এবং এনক্রিপশন / ডিক্রিপশন ফাংশনটিকে পরবর্তী স্নিপেটের মতো বলা হয়:

যদি আমরা জানি যে আমরা একটি এপিপি তৈরি করছি, এটি অস্পষ্ট করে দিচ্ছি, এটি ছড়িয়ে দিচ্ছি, এবং getSecretKey () নেটিভ ফাংশনটিতে থাকা স্ট্রিংটি অ্যাক্সেস করার চেষ্টা করছি, আমরা এটি খুঁজে পাচ্ছি না! জিত?

আসলেই না। এনডিকে কোডটি বাস্তবে ডিসস্যাম্বল করে চেক করা যায়। এটি আরও কঠিন হয়ে উঠবে এবং আপনার ক্রমবর্ধমান উন্নত সরঞ্জাম এবং কৌশলগুলির প্রয়োজন হবে। আপনি স্ক্রিপ্টের 95% বাচ্চাদের সরিয়ে দিয়েছেন, তবে পর্যাপ্ত সংস্থান এবং অনুপ্রেরণার একটি দল এখনও টোকেন অ্যাক্সেস করতে পারে। সেই বাক্যটি মনে আছে?

পরম সুরক্ষার মতো কোনও জিনিস নেই is সুরক্ষা একে অপরের উপর ভিত্তি করে গড়ে তোলা এবং অনিবার্যতা ধীর করার জন্য একত্রিত করার ব্যবস্থাগুলির একটি সেট।
আপনি এখনও বিযুক্ত কোড স্ট্রিং আক্ষরিক অ্যাক্সেস করতে পারেন!

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

সুতরাং কোন সমাধানটি আমরা ট্যাগ না করে একটি ব্যাকএন্ড এবং ক্লায়েন্টের মধ্যে যোগাযোগ করতে পারি?

ডিভাইসে রিয়েল টাইমে কী তৈরি করুন।

আপনার ডিভাইসে কোনও কী সংরক্ষণ করতে হবে না এবং স্ট্রিং আক্ষরিকের বিরক্তিকর সুরক্ষা মোকাবেলা করতে হবে না! এটি রিমোট কী বৈধকরণের মতো পরিষেবাদি দ্বারা ব্যবহৃত একটি অতি প্রাচীন কৌশল।

  1. ক্লায়েন্ট একটি ফাংশন () জানে যা একটি চাবি দেয়।
  2. ব্যাকএন্ড ক্লায়েন্টে প্রয়োগ করা ফাংশনটি জানে ()
  3. ক্লায়েন্ট সার্ভারে সংক্রমণিত একটি কী তৈরি করতে ফাংশন () ব্যবহার করে।
  4. সার্ভার এটি পরীক্ষা করে এবং অনুরোধটি দিয়ে চালিয়ে যায়।

আপনি কি বিন্দু সংযোগ করেন? একটি নেটিভ ফাংশন যা আপনাকে একটি স্ট্রিং দেয় (সহজেই চিহ্নিত করা যায়) পরিবর্তে, এমন কোনও ফাংশন যা আপনাকে 1 এবং 100 এর মধ্যে তিনটি এলোমেলো মৌলিক সংখ্যার যোগফল দেয় না কেন? অথবা এমন কোনও ফাংশন যা ইউনিক্স সময়ে বর্তমান দিনটি নির্দিষ্ট করে এবং প্রতিটি অঙ্কে 1 টি যুক্ত করে? ডিভাইস থেকে প্রাসঙ্গিক তথ্য কীভাবে পাওয়া যায়, উদাঃ খ। উচ্চ স্তরের এন্ট্রপি অর্জন করতে ব্যবহৃত মেমরির পরিমাণ?

শেষ অনুচ্ছেদে অনেকগুলি ধারণাগুলি রয়েছে তবে আশা করি আমাদের অনুমানের পাঠক চিহ্নটি পেয়েছেন।

সারাংশ

  1. পরম সুরক্ষার মতো কোনও জিনিস নেই is
  2. বেশ কয়েকটি প্রতিরক্ষামূলক পদক্ষেপের সংমিশ্রণ উচ্চ স্তরের সুরক্ষার মূল চাবিকাঠি।
  3. আপনার কোডে স্ট্রিং লিটারেল সংরক্ষণ করবেন না।
  4. একটি স্ব-উত্পন্ন কী তৈরি করতে এনডিকে ব্যবহার করুন।

প্রথম বাক্যটি মনে আছে?

পরম সুরক্ষার মতো কোনও জিনিস নেই is সুরক্ষা একে অপরের উপর ভিত্তি করে গড়ে তোলা এবং অনিবার্যতা ধীর করার জন্য একত্রিত করার ব্যবস্থাগুলির একটি সেট।

আমি আবারও বলতে চাই যে আপনার লক্ষ্যটি আপনার কোডটি সুরক্ষিত করা সম্ভব এবং 100% সুরক্ষা অ্যাক্সেসযোগ্য নয় এমন দৃষ্টিভঙ্গি হারানো ছাড়াই সম্ভব protect তবে, আপনি যদি আপনার কোডটি সুরক্ষিত করতে সক্ষম হন যাতে সমস্ত গুরুত্বপূর্ণ তথ্য ডিক্রিপ্ট করার জন্য সম্পদের আধিক্য প্রয়োজন, আপনি ভাল এবং নিঃশব্দে ঘুমাতে পারেন।

একটি ছোট দাবি অস্বীকার

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

মজা কোডিং আছে!

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