Code Signing (কোড স্বাক্ষর) — এক্সিকিউটেবল ফাইলের জন্য ডিজিটাল স্বাক্ষর প্রক্রিয়া যা ডেভেলপারের প্রামাণিকতা এবং অ্যাপ্লিকেশনের অখণ্ডতা নিশ্চিত করে। Android-এ, প্রতিটি APK ফাইল ডিভাইসে ইনস্টল করার বা Google Play-তে প্রকাশ করার আগে একটি সার্টিফিকেট দিয়ে স্বাক্ষরিত হতে হবে। Google, 2024 অনুসারে, Android স্বাক্ষর স্কিমের চারটি প্রজন্ম সমর্থন করে: JAR-ভিত্তিক v1 থেকে স্ট্রিমিং ইনস্টলেশনের জন্য v4 পর্যন্ত।
মুখ্য বিষয়
Code Signing — একটি ক্রিপ্টোগ্রাফিক প্রক্রিয়া যেখানে ডেভেলপার তার ডিজিটাল সার্টিফিকেট দিয়ে এক্সিকিউটেবল কোডে স্বাক্ষর করে। স্বাক্ষর অ্যাসিমেট্রিক এনক্রিপশন ব্যবহার করে তৈরি করা হয়: ডেভেলপারের প্রাইভেট কী একটি ডিজিটাল স্বাক্ষর তৈরি করে, এবং পাবলিক কী সার্টিফিকেটে এম্বেড করা হয়। যে কেউ পাবলিক কী ব্যবহার করে স্বাক্ষর যাচাই করতে পারে, কিন্তু স্বাক্ষর ভঙ্গ না করে কোড পরিবর্তন করা অসম্ভব।
মোবাইল ডেভেলপমেন্টে, কোড স্বাক্ষর তিনটি কাজ করে। প্রথম — প্রমাণীকরণ: ব্যবহারকারী এবং প্ল্যাটফর্ম অ্যাপ্লিকেশন ডেভেলপারকে সনাক্ত করতে পারে। দ্বিতীয় — অখণ্ডতা: স্বাক্ষরের পরে APK-তে কোনো পরিবর্তন স্বাক্ষরকে অবৈধ করে দেয়। তৃতীয় — বিশ্বস্ত আপডেট: প্ল্যাটফর্ম শুধুমাত্র সেই APKs দিয়ে অ্যাপ্লিকেশন আপডেট করার অনুমতি দেয় যা ইনস্টল করা সংস্করণের মতো একই সার্টিফিকেট দিয়ে স্বাক্ষরিত।
Android অ্যাপ্লিকেশনের ডিজিটাল স্বাক্ষরের আইনি গুরুত্ব রয়েছে। রাশিয়ান আইন (63-FZ) এবং ইউরোপীয় eIDAS অনুসারে, যোগ্য ইলেকট্রনিক স্বাক্ষর হস্তলিখিত স্বাক্ষরের সমতুল্য। তবে, স্ব-স্বাক্ষরিত সার্টিফিকেট (Android-এ সাধারণ অভ্যাস) দিয়ে APK স্বাক্ষর করা যোগ্য নয় — এটি অখণ্ডতা নিশ্চিত করে, কিন্তু আইনি দৃষ্টিকোণ থেকে ডেভেলপারের পরিচয় নয়।
Android চারটি APK স্বাক্ষর স্কিম সমর্থন করে, প্রতিটি পূর্ববর্তী সংস্করণের সমস্যা সমাধান করে এবং নতুন ক্ষমতা যোগ করে। সমস্ত স্কিম একই APK-তে সহাবস্থান করতে পারে — পুরানো Android সংস্করণের সাথে পশ্চাদগামী সামঞ্জস্যের জন্য এটি প্রয়োজনীয়।
v1 (JAR signing) স্কিম Android 1.0-এ আবির্ভূত হয়েছিল। এটি META-INF/MANIFEST.MF-এ এন্ট্রি ব্যবহার করে APK আর্কাইভের ভিতরে পৃথক ফাইলগুলিতে স্বাক্ষর করে। ত্রুটি: আক্রমণকারী APK পরিবর্তন করতে পারে (ফাইল যোগ বা মুছে ফেলতে পারে) এবং বাকিগুলি না ছুঁয়ে শুধুমাত্র পরিবর্তিত ফাইলগুলিতে পুনরায় স্বাক্ষর করতে পারে। এটি v1-কে কিছু আক্রমণের জন্য ঝুঁকিপূর্ণ করে তোলে। v2 (APK Signature Scheme), Android 7.0-এ প্রবর্তিত, সম্পূর্ণ APK ফাইলকে সামগ্রিকভাবে স্বাক্ষর করে, স্বাক্ষর itself ছাড়া সমস্ত বাইট সহ, যা নির্বাচনী পরিবর্তনের সম্ভাবনা দূর করে।
| স্কিম | Android | বৈশিষ্ট্য | কী রোটেশন |
|---|---|---|---|
| v1 (JAR) | 1.0+ | প্রতি ফাইল স্বাক্ষর | না |
| v2 | 7.0+ | সম্পূর্ণ APK স্বাক্ষর | না |
| v3 | 9.0+ | স্বাক্ষর + রোটেশন | হ্যাঁ |
| v4 | 11.0+ | স্ট্রিমিং + ADB | হ্যাঁ |
স্কিম v3, Android 9.0-এ প্রবর্তিত, একটি দীর্ঘস্থায়ী সমস্যা সমাধান করে: স্বাক্ষর কী আপস বা মেয়াদোত্তীর্ণ হলে কী করবেন? আগে, স্বাক্ষর কী পরিবর্তনের অর্থ ছিল অ্যাপ্লিকেশনটিকে নতুন হিসাবে বিবেচনা করা হত — এটি বিদ্যমান অ্যাপ্লিকেশনের উপরে ইনস্টল করা যেত না। v3 রোটেশন প্রক্রিয়া যোগ করে: APK-তে রোটেশনের প্রমাণ (proof-of-rotation) অন্তর্ভুক্ত করা যেতে পারে, যা পুরানো কী দ্বারা স্বাক্ষরিত। সিস্টেম চেইন যাচাই করে এবং নতুন কী দিয়ে স্বাক্ষরিত অ্যাপ্লিকেশন আপডেট করার অনুমতি দেয়।
Keystore — একটি সুরক্ষিত পাত্র যা অ্যাপ্লিকেশন স্বাক্ষরের জন্য প্রাইভেট কী এবং সার্টিফিকেট ধারণ করে। Android ডেভেলপমেন্টে JKS (Java KeyStore) বা PKCS12 ফরম্যাট ব্যবহার করা হয়। Keystore keytool ইউটিলিটি দ্বারা তৈরি করা হয়, যা JDK-এর অংশ। ভান্ডারের প্রতিটি কী একটি উপনাম (alias) দ্বারা চিহ্নিত এবং পাসওয়ার্ড দ্বারা সুরক্ষিত।
Keystore-এ সার্টিফিকেটে পাবলিক কী এবং মালিকের তথ্য থাকে: সংস্থার নাম, দেশ, বৈধতা সময়কাল। Android অ্যাপ্লিকেশনের জন্য, সার্টিফিকেট স্ব-স্বাক্ষরিত হতে পারে — Google-এর সার্টিফিকেট কর্তৃপক্ষ (CA) প্রয়োজন নেই, যা Android-কে iOS থেকে আলাদা করে। তবে, সার্টিফিকেটের বৈধতা কমপক্ষে 25 বছর হতে হবে, কারণ অ্যাপ্লিকেশন একই কী দিয়ে আপডেট করা হবে।
# স্বাক্ষরের জন্য নতুন keystore তৈরি করা
keytool -genkey -v -keystore my-release.keystore \
-alias my-app-alias \
-keyalg RSA \
-keysize 2048 \
-validity 10000
# keystore বিষয়বস্তু দেখা
keytool -list -v -keystore my-release.keystore
Android স্বাক্ষর কীগুলির জন্য দুটি অ্যালগরিদম সমর্থন করে: RSA এবং ECDSA। 2048 বিট কী সাইজের RSA — ডি ফ্যাক্টো স্ট্যান্ডার্ড, সমস্ত Android সংস্করণ দ্বারা সমর্থিত। ECDSA (এলিপটিক কার্ভ ডিজিটাল সিগনেচার অ্যালগরিদম) বক্ররেখা P-256 সহ ছোট কী সাইজে একই ক্রিপ্টোগ্রাফিক শক্তি প্রদান করে। Android 9.0 থেকে, ECDSA সুপারিশ করা হয় কারণ এটি মোবাইল ডিভাইসে যাচাইকরণে দ্রুততর।
Android Gradle Plugin-এ, স্বাক্ষর মডিউল-স্তরের build.gradle-এ signingConfigs ব্লকের মাধ্যমে কনফিগার করা হয়। ডিবাগ বিল্ডের জন্য, Android Studio স্বয়ংক্রিয়ভাবে পরিচিত পাসওয়ার্ড সহ একটি ডিবাগ keystore তৈরি করে। রিলিজ বিল্ডের জন্য, ডেভেলপার তার keystore-এর পাথ, কী উপনাম এবং পাসওয়ার্ড নির্দিষ্ট করে। পাসওয়ার্ড আলাদা কনফিগারেশন ফাইলে সংরক্ষণ করার সুপারিশ করা হয়, যা সংস্করণ নিয়ন্ত্রণ থেকে বাদ দেওয়া হয়।
আধুনিক অনুশীলন — CI/CD-এর মাধ্যমে কেন্দ্রীয় স্বাক্ষর ব্যবস্থাপনা। Jenkins, GitLab CI বা GitHub Actions keystore-কে সুরক্ষিত আর্টিফ্যাক্ট এবং পাসওয়ার্ডকে পরিবেশ গোপনীয়তা হিসাবে সংরক্ষণ করতে পারে। এটি রিপোজিটরির মাধ্যমে কী ফাঁস রোধ করে এবং প্রয়োজন হলে কী রোটেশন সহজ করে।
// build.gradle (অ্যাপ-স্তর) — স্বাক্ষর কনফিগারেশন
android {
signingConfigs {
release {
storeFile file("my-release.keystore")
storePassword System.getenv("KEYSTORE_PASSWORD")
keyAlias System.getenv("KEY_ALIAS")
keyPassword System.getenv("KEY_PASSWORD")
}
}
buildTypes {
release {
signingConfig signingConfigs.release
}
}
}
সর্বাধিক সামঞ্জস্যের জন্য, APK-তে তিনটি স্কিম (v1 + v2 + v3) দিয়ে স্বাক্ষর করা উচিত। Android Gradle Plugin ডিফল্টরূপে সমস্ত স্কিম অন্তর্ভুক্ত করে। শুধুমাত্র v2 দিয়ে স্বাক্ষরিত APK Android 6.0 এবং নীচে ইনস্টল হবে না। শুধুমাত্র v1 সহ APK Android 7.0+-এ v2-এর অখণ্ডতা সুবিধা পাবে না। সমস্ত স্কিম অন্তর্ভুক্ত করলে APK-এর আকার 1-2% এর বেশি বাড়ে না এবং যেকোনো ডিভাইসের সাথে সামঞ্জস্যতা নিশ্চিত করে।
Play App Signing — Google Play পরিষেবা যা অ্যাপ্লিকেশন স্বাক্ষর কীগুলির কেন্দ্রীয়ভাবে ব্যবস্থাপনা করে। ডেভেলপার Google Play Console-এ একটি আপলোড কী (upload key) দিয়ে স্বাক্ষরিত APK আপলোড করে, এবং Google Play ব্যবহারকারীদের কাছে সরবরাহ করার আগে এটি একটি বিতরণ কী (distribution key) দিয়ে পুনরায় স্বাক্ষর করে। এটি বিতরণ কীকে ক্ষতি বা আপস থেকে রক্ষা করে।
Play App Signing-এর সুবিধা: নিরাপত্তা — বিতরণ কী Google-এর সুরক্ষিত স্টোরেজে সংরক্ষিত হয়; রোটেশন — কনসোলের মাধ্যমে কী পরিবর্তনের অনুরোধ করা যেতে পারে; পুনরুদ্ধার — আপলোড কী হারিয়ে গেলে একটি নতুন কী তৈরি করা যেতে পারে। ত্রুটি: Play App Signing চালু হওয়ার আগে বিদ্যমান অ্যাপ্লিকেশনের জন্য, মাইগ্রেশনের জন্য একটি নতুন অ্যাপ্লিকেশন তৈরি করতে হবে, কারণ পুরানো বিতরণ কী ইতিমধ্যে ব্যবহার হচ্ছে।
# সার্টিফিকেট ফিঙ্গারপ্রিন্ট পাওয়া (SHA-256)
keytool -list -v -keystore my-release.keystore \
-alias my-app-alias | grep "SHA256"
# apksigner দিয়ে APK স্বাক্ষর যাচাই করা
apksigner verify --verbose app-release.apk
যদি স্বাক্ষর কী হারিয়ে যায় এবং Play App Signing ব্যবহার না করা হয়, তাহলে অ্যাপ্লিকেশন আপডেট করার ক্ষমতা পুনরুদ্ধার করা অসম্ভব — একটি নতুন প্যাকেজ নাম সহ একটি নতুন অ্যাপ্লিকেশন তৈরি করতে হবে। Play App Signing ব্যবহার করার এটি একটি প্রধান কারণ। Google keystore-এর ব্যাকআপ কপি নিরাপদ অফলাইন স্টোরেজে (এনক্রিপ্টেড USB ড্রাইভ, ব্যাংক সেফ ডিপোজিট বক্স) রাখার সুপারিশ করে।
APK ইনস্টল করার সময়, Android বিভিন্ন ধাপে স্বাক্ষর যাচাইকরণ করে। প্রথম — সার্টিফিকেট পরীক্ষা: মেয়াদ শেষ হয়েছে কিনা, বিন্যাস সঠিক কিনা। দ্বিতীয় — স্বাক্ষর যাচাইকরণ: ক্রিপ্টোগ্রাফিক স্বাক্ষর APK বিষয়বস্তুর সাথে মেলে কিনা। তৃতীয় — ইনস্টল করা সংস্করণের সাথে সার্টিফিকেট তুলনা: যদি অ্যাপ্লিকেশনটি ইতিমধ্যে ডিভাইসে থাকে, সার্টিফিকেট মেলে কিনা, অন্যথায় ইনস্টলেশন ব্লক করা হয়।
যাচাইকরণ সিস্টেম PackageManagerService-এ নির্মিত। ইনস্টলেশন অনুরোধ প্রক্রিয়াকরণের সময়, PMS APK থেকে স্বাক্ষর বের করে, android.util.PackageParser ক্লাস ব্যবহার করে এটি যাচাই করে এবং ইনস্টল করা অ্যাপ্লিকেশন (যদি থাকে) এর সংরক্ষিত স্বাক্ষরের সাথে তুলনা করে। অমিল হলে, ব্যবহারকারী “INSTALL_FAILED_UPDATE_INCOMPATIBLE” ত্রুটি পায়। এই প্রক্রিয়া প্রতিস্থাপন আক্রমণ প্রতিরোধ করে (ম্যালওয়্যার একটি বৈধ অ্যাপ্লিকেশনকে নিজস্ব সংস্করণ দিয়ে প্রতিস্থাপন করতে পারে না)।
ডেভেলপার Android SDK Build Tools থেকে apksigner ইউটিলিটি ব্যবহার করে স্বাধীনভাবে APK স্বাক্ষর যাচাই করতে পারে। কমান্ড apksigner verify --verbose app.apk দেখায় যে APK কোন স্কিম দিয়ে স্বাক্ষরিত, সার্টিফিকেট বৈধ কিনা এবং স্বাক্ষর বিষয়বস্তুর সাথে মেলে কিনা। ইনস্টল করা অ্যাপ্লিকেশনের স্বাক্ষরের প্রোগ্রামেটিক যাচাইয়ের জন্য, GET_SIGNATURES ফ্ল্যাগ সহ PackageManager.getPackageInfo() ব্যবহার করা হয়।
// ইনস্টল করা অ্যাপ্লিকেশনের স্বাক্ষরের প্রোগ্রামেটিক যাচাইকরণ
fun getAppSignature(context: Context, packageName: String): String? {
val pm = context.packageManager
val info = pm.getPackageInfo(
packageName,
PackageManager.GET_SIGNATURES
)
return info.signatures?.firstOrNull()?.toCharsString()
}
স্বাক্ষর কী নিরাপত্তা — Android ডেভেলপমেন্টের একটি গুরুত্বপূর্ণ দিক। কী আপস আক্রমণকারীকে আপনার অ্যাপ্লিকেশনের আপডেটে নিজস্ব কোড দিয়ে স্বাক্ষর করতে দেয়। প্রধান নিয়ম: রিপোজিটরিতে কী কখনও সংরক্ষণ করবেন না, বিভিন্ন অ্যাপ্লিকেশনের জন্য এক কী ব্যবহার করবেন না, অসুরক্ষিত চ্যানেলের (ইমেল, মেসেঞ্জার) মাধ্যমে কী স্থানান্তর করবেন না।
সুপারিশকৃত অনুশীলন — কী পৃথকীকরণ। প্রতিটি অ্যাপ্লিকেশনের জন্য আলাদা কী এবং Google Play-তে আপলোডের (upload key) জন্য আলাদা কী ব্যবহার করুন। ডিবাগ বিল্ডের জন্য, Android Studio একটি শেয়ার্ড debug.keystore তৈরি করে — এটি রিলিজ বিল্ডের জন্য ব্যবহার করা যাবে না। সার্টিফিকেটের বৈধতা 25-30 বছর হওয়া উচিত (বর্তমান মান, Google দ্বারা নিশ্চিত)।
| অনুশীলন | সুপারিশ |
|---|---|
| কী সংরক্ষণ | এনক্রিপ্টেড মিডিয়া, CI/CD গোপনীয়তা |
| সার্টিফিকেট বৈধতা | কমপক্ষে 25 বছর |
| অ্যালগরিদম | RSA 2048+ বা ECDSA P-256 |
| পৃথকীকরণ | প্রতি অ্যাপ্লিকেশনে আলাদা কী |
| ব্যাকআপ | keystore-এর অফলাইন কপি |
নিয়মিতভাবে স্বাক্ষর চেইন অখণ্ডতা পরীক্ষা করুন। যখন কীগুলিতে অ্যাক্সেস আছে এমন কর্মচারী চলে যান, Google Play Console-এর মাধ্যমে আপলোড কী আপডেট করুন। আপনার অ্যাপ্লিকেশন ব্যবহারকারীদের ডিভাইসে ছাঁটাই করা হয়েছে কিনা তা যাচাই করতে Google Play Integrity API-এর মতো টুল ব্যবহার করুন। API স্বাক্ষর এবং অখণ্ডতা সম্পর্কে ডেটা ফেরত দেয়, যাচাইয়ের জন্য সার্ভারে পাঠায়।
প্রায়শই জিজ্ঞাসিত প্রশ্ন
Code Signing — একটি APK ফাইলের ডিজিটাল স্বাক্ষর যা নিশ্চিত করে যে অ্যাপ্লিকেশনটি একটি নির্দিষ্ট ডেভেলপার দ্বারা তৈরি করা হয়েছিল এবং স্বাক্ষরের পরে পরিবর্তন করা হয়নি। স্বাক্ষর ছাড়া, APK ডিভাইসে ইনস্টল হবে না।
JDK থেকে keytool ইউটিলিটি ব্যবহার করুন: keytool -genkey -v -keystore my-release.keystore -alias my-alias -keyalg RSA -keysize 2048 -validity 10000. ফলাফলকৃত keystore build.gradle-এ signingConfigs ব্লকে নির্দিষ্ট করুন।
যদি কী হারিয়ে যায় এবং আপনি Play App Signing ব্যবহার না করেন, তাহলে অ্যাপ্লিকেশন আপডেট করা অসম্ভব হয়ে পড়ে। Google Play-তে একটি নতুন প্যাকেজ নাম সহ একটি নতুন অ্যাপ্লিকেশন তৈরি করতে হবে। কী ক্ষতি থেকে রক্ষা পেতে Play App Signing ব্যবহার করুন।
v1 APK-এর ভিতরে প্রতিটি ফাইলে পৃথকভাবে স্বাক্ষর করে — আক্রমণকারী একটি ফাইল পরিবর্তন করতে পারে এবং শুধুমাত্র সেটিতে পুনরায় স্বাক্ষর করতে পারে। v2 সম্পূর্ণ APK-তে সামগ্রিকভাবে স্বাক্ষর করে — কোনো পরিবর্তন স্বাক্ষরকে অবৈধ করে, যা উচ্চতর স্তরের নিরাপত্তা প্রদান করে।
Play App Signing — একটি Google Play পরিষেবা যা কেন্দ্রীয়ভাবে অ্যাপ্লিকেশন বিতরণ কী সংরক্ষণ করে। ডেভেলপার আপলোড কী দিয়ে স্বাক্ষরিত APK আপলোড করে, এবং Google ব্যবহারকারীদের কাছে সরবরাহ করার আগে এটি পুনরায় স্বাক্ষর করে, কীকে ক্ষতি বা চুরি থেকে রক্ষা করে।
সারসংক্ষেপ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন