APK স্বাক্ষর স্কিম v2 হল একটি সম্পূর্ণ-ফাইল স্বাক্ষর স্কিম যা যাচাইকরণের গতি বাড়ায় এবং APK-এর সুরক্ষিত অংশে কোনো পরিবর্তন শনাক্ত করে অখণ্ডতার গ্যারান্টি শক্তিশালী করে ।
APK স্বাক্ষর স্কিম v2 ব্যবহার করে স্বাক্ষর করা ZIP সেন্ট্রাল ডিরেক্টরি বিভাগের ঠিক আগে APK ফাইলে একটি APK সাইনিং ব্লক সন্নিবেশিত করে। APK স্বাক্ষর ব্লকের ভিতরে, v2 স্বাক্ষর এবং স্বাক্ষরকারীর পরিচয় তথ্য একটি APK স্বাক্ষর স্কিম v2 ব্লকে সংরক্ষণ করা হয়।
Android 7.0 (Nougat) এ APK স্বাক্ষর স্কিম v2 চালু করা হয়েছিল। Android 6.0 (Marshmallow) এবং পুরানো ডিভাইসগুলিতে একটি APK ইনস্টলযোগ্য করতে, v2 স্কিমের সাথে স্বাক্ষর করার আগে APK-এ JAR স্বাক্ষর ব্যবহার করে স্বাক্ষর করা উচিত।
APK সাইনিং ব্লক
v1 APK বিন্যাসের সাথে পিছিয়ে-সামঞ্জস্য বজায় রাখতে, v2 এবং নতুন APK স্বাক্ষরগুলি একটি APK স্বাক্ষর ব্লকের মধ্যে সংরক্ষণ করা হয়, APK স্বাক্ষর স্কিম v2 সমর্থন করার জন্য একটি নতুন কন্টেনার চালু করা হয়েছে। একটি APK ফাইলে, APK সাইনিং ব্লকটি জিপ সেন্ট্রাল ডিরেক্টরির ঠিক আগে অবস্থিত, যা ফাইলের শেষে অবস্থিত।
ব্লকটিতে আইডি-মানের জোড়া এমনভাবে মোড়ানো রয়েছে যা APK-এ ব্লকটি সনাক্ত করা সহজ করে তোলে। APK-এর v2 স্বাক্ষর আইডি 0x7109871a-এর সাথে একটি ID-মান পেয়ার হিসাবে সংরক্ষণ করা হয়।
বিন্যাস
APK সাইনিং ব্লকের বিন্যাসটি নিম্নরূপ (সমস্ত সংখ্যাসূচক ক্ষেত্র সামান্য-এন্ডিয়ান):
- বাইটে
size of block
(এই ক্ষেত্র ব্যতীত) (uint64) - uint64-দৈর্ঘ্য-প্রিফিক্সড আইডি-মান জোড়ার ক্রম:
-
ID
(uint32) -
value
(পরিবর্তনশীল-দৈর্ঘ্য: জোড়ার দৈর্ঘ্য - 4 বাইট)
-
- বাইটে
size of block
-প্রথম ক্ষেত্রের মতোই (uint64) -
magic
"এপিকে সিগ ব্লক 42" (16 বাইট)
প্রথমে জিপ সেন্ট্রাল ডিরেক্টরির শুরু খোঁজার মাধ্যমে (ফাইলের শেষে সেন্ট্রাল ডিরেক্টরির রেকর্ডের ZIP এন্ড খুঁজে বের করে, তারপর রেকর্ড থেকে সেন্ট্রাল ডিরেক্টরির স্টার্ট অফসেট পড়া) দ্বারা APK পার্স করা হয়। magic
মানটি নিশ্চিত করার একটি দ্রুত উপায় প্রদান করে যে সেন্ট্রাল ডিরেক্টরির আগে যা সম্ভবত APK সাইনিং ব্লক। size of block
তারপর দক্ষতার সাথে ফাইলের ব্লকের শুরুতে নির্দেশ করে।
ব্লকটি ব্যাখ্যা করার সময় অজানা আইডি সহ ID-মান জোড়া উপেক্ষা করা উচিত।
APK স্বাক্ষর স্কিম v2 ব্লক
APK এক বা একাধিক স্বাক্ষরকারী/পরিচয় দ্বারা স্বাক্ষরিত, প্রতিটি একটি স্বাক্ষর কী দ্বারা প্রতিনিধিত্ব করা হয়। এই তথ্য একটি APK স্বাক্ষর স্কিম v2 ব্লক হিসাবে সংরক্ষণ করা হয়. প্রতিটি স্বাক্ষরকারীর জন্য, নিম্নলিখিত তথ্য সংরক্ষণ করা হয়:
- (স্বাক্ষর অ্যালগরিদম, ডাইজেস্ট, স্বাক্ষর) টিপলস। APK-এর বিষয়বস্তুগুলির অখণ্ডতা যাচাই থেকে স্বাক্ষর যাচাইকরণকে দ্বিগুণ করতে ডাইজেস্ট সংরক্ষণ করা হয়।
- X.509 শংসাপত্র চেইন স্বাক্ষরকারীর পরিচয় উপস্থাপন করে।
- কী-মান জোড়া হিসাবে অতিরিক্ত বৈশিষ্ট্য।
প্রতিটি স্বাক্ষরকারীর জন্য, প্রদত্ত তালিকা থেকে একটি সমর্থিত স্বাক্ষর ব্যবহার করে APK যাচাই করা হয়। অজানা স্বাক্ষর অ্যালগরিদম সহ স্বাক্ষর উপেক্ষা করা হয়। একাধিক সমর্থিত স্বাক্ষরের সম্মুখীন হলে কোন স্বাক্ষর ব্যবহার করবেন তা বেছে নেওয়া প্রতিটি বাস্তবায়নের উপর নির্ভর করে। এটি একটি পশ্চাদপদ-সামঞ্জস্যপূর্ণ উপায়ে ভবিষ্যতে শক্তিশালী স্বাক্ষর পদ্ধতির প্রবর্তনকে সক্ষম করে। প্রস্তাবিত পদ্ধতি হল শক্তিশালী স্বাক্ষর যাচাই করা।
বিন্যাস
APK স্বাক্ষর স্কিম v2 ব্লক আইডি 0x7109871a
এর অধীনে APK স্বাক্ষর ব্লকের মধ্যে সংরক্ষণ করা হয়।
APK স্বাক্ষর স্কিম v2 ব্লকের বিন্যাসটি নিম্নরূপ (সমস্ত সাংখ্যিক মান সামান্য-এন্ডিয়ান, সমস্ত দৈর্ঘ্য-প্রিফিক্সড ক্ষেত্র দৈর্ঘ্যের জন্য uint32 ব্যবহার করে):
- দৈর্ঘ্য-প্রিফিক্সড
signer
দৈর্ঘ্য-প্রিফিক্সড ক্রম:- দৈর্ঘ্য-প্রিফিক্সড
signed data
:- দৈর্ঘ্য-প্রিফিক্সড
digests
দৈর্ঘ্য-প্রিফিক্সড ক্রম:-
signature algorithm ID
(uint32) - (দৈর্ঘ্য-প্রিফিক্সড)
digest
— অখণ্ডতা-সুরক্ষিত বিষয়বস্তু দেখুন
-
- X.509
certificates
দৈর্ঘ্য-প্রিফিক্সড ক্রম :- দৈর্ঘ্য-প্রিফিক্সড X.509
certificate
(ASN.1 DER ফর্ম)
- দৈর্ঘ্য-প্রিফিক্সড X.509
- দৈর্ঘ্য-প্রিফিক্সড
additional attributes
দৈর্ঘ্য-প্রিফিক্সড ক্রম:-
ID
(uint32) -
value
(ভেরিয়েবল-দৈর্ঘ্য: অতিরিক্ত বৈশিষ্ট্যের দৈর্ঘ্য - 4 বাইট)
-
- দৈর্ঘ্য-প্রিফিক্সড
- দৈর্ঘ্য-প্রিফিক্সড
signatures
দৈর্ঘ্য-প্রিফিক্সড ক্রম:-
signature algorithm ID
(uint32) -
signed data
উপরে দৈর্ঘ্য-প্রিফিক্সডsignature
-
- দৈর্ঘ্য-প্রিফিক্সড
public key
(SubjectPublicKeyInfo, ASN.1 DER ফর্ম)
- দৈর্ঘ্য-প্রিফিক্সড
স্বাক্ষর অ্যালগরিদম আইডি
- 0x0101—SHA2-256 ডাইজেস্ট সহ RSASSA-PSS, SHA2-256 MGF1, লবণের 32 বাইট, ট্রেলার: 0xbc
- 0x0102—SHA2-512 ডাইজেস্ট সহ RSASSA-PSS, SHA2-512 MGF1, লবণের 64 বাইট, ট্রেলার: 0xbc
- SHA2-256 ডাইজেস্ট সহ 0x0103—RSASSA-PKCS1-v1_5। এটি এমন বিল্ড সিস্টেমের জন্য যার জন্য নির্ধারক স্বাক্ষর প্রয়োজন।
- SHA2-512 ডাইজেস্ট সহ 0x0104—RSASSA-PKCS1-v1_5। এটি এমন বিল্ড সিস্টেমের জন্য যার জন্য নির্ধারক স্বাক্ষর প্রয়োজন।
- SHA2-256 ডাইজেস্ট সহ 0x0201—ECDSA
- SHA2-512 ডাইজেস্ট সহ 0x0202—ECDSA
- 0x0301—SHA2-256 ডাইজেস্ট সহ DSA
উপরের সমস্ত স্বাক্ষর অ্যালগরিদমগুলি অ্যান্ড্রয়েড প্ল্যাটফর্ম দ্বারা সমর্থিত৷ সাইনিং টুল অ্যালগরিদমের একটি উপসেট সমর্থন করতে পারে।
সমর্থিত কী আকার এবং ইসি বক্ররেখা:
- আরএসএ: 1024, 2048, 4096, 8192, 16384
- EC: NIST P-256, P-384, P-521
- DSA: 1024, 2048, 3072
অখণ্ডতা-সুরক্ষিত বিষয়বস্তু
APK বিষয়বস্তু সুরক্ষিত করার উদ্দেশ্যে, একটি APK চারটি বিভাগ নিয়ে গঠিত:
- জিপ এন্ট্রির বিষয়বস্তু (অফসেট 0 থেকে APK সাইনিং ব্লক শুরু হওয়া পর্যন্ত)
- APK সাইনিং ব্লক
- জিপ কেন্দ্রীয় ডিরেক্টরি
- সেন্ট্রাল ডিরেক্টরির জিপ শেষ
APK স্বাক্ষর স্কিম v2 বিভাগ 1, 3, 4, এবং বিভাগ 2 এর ভিতরে থাকা APK স্বাক্ষর স্কিম v2 ব্লকের signed data
ব্লকের অখণ্ডতা রক্ষা করে।
সেকশন 1, 3, এবং 4-এর অখণ্ডতা signed data
ব্লকে সংরক্ষিত তাদের বিষয়বস্তুর এক বা একাধিক ডাইজেস্ট দ্বারা সুরক্ষিত থাকে যা এক বা একাধিক স্বাক্ষর দ্বারা সুরক্ষিত।
বিভাগ 1, 3, এবং 4 এর উপর ডাইজেস্ট নিম্নলিখিত হিসাবে গণনা করা হয়, একটি দ্বি-স্তরের মার্কেল গাছের অনুরূপ। প্রতিটি বিভাগ পরপর 1 MB (2 20 বাইট) খণ্ডে বিভক্ত। প্রতিটি বিভাগে শেষ খণ্ডটি ছোট হতে পারে। প্রতিটি খণ্ডের ডাইজেস্ট বাইট 0xa5
এর সংমিশ্রণ, বাইটে খণ্ডের দৈর্ঘ্য (লিটল-এন্ডিয়ান uint32) এবং খণ্ডের বিষয়বস্তুর উপর গণনা করা হয়। শীর্ষ-স্তরের ডাইজেস্ট বাইট 0x5a
এর সংমিশ্রণ, খণ্ডের সংখ্যা (লিটল-এন্ডিয়ান uint32) এবং খণ্ডগুলি APK-এ যে ক্রমে প্রদর্শিত হবে তার সংমিশ্রণে গণনা করা হয়। ডাইজেস্টকে সমান্তরাল করে গণনার গতি বাড়ানোর জন্য খণ্ডিত ফ্যাশনে গণনা করা হয়।
বিভাগ 4 (কেন্দ্রীয় ডিরেক্টরির জিপ শেষ) সুরক্ষা জিপ সেন্ট্রাল ডিরেক্টরির অফসেট ধারণকারী বিভাগ দ্বারা জটিল। APK সাইনিং ব্লকের আকার পরিবর্তন হলে অফসেট পরিবর্তন হয়, উদাহরণস্বরূপ, যখন একটি নতুন স্বাক্ষর যোগ করা হয়। এইভাবে, সেন্ট্রাল ডিরেক্টরির ZIP এন্ডের উপর ডাইজেস্ট কম্পিউট করার সময়, ZIP সেন্ট্রাল ডিরেক্টরির অফসেট ধারণকারী ক্ষেত্রটিকে অবশ্যই APK সাইনিং ব্লকের অফসেট ধারণ করা হবে।
রোলব্যাক সুরক্ষা
একজন আক্রমণকারী Android প্ল্যাটফর্মে v2-স্বাক্ষরিত APK যাচাই করা v1-স্বাক্ষরিত APK হিসাবে যাচাই করার চেষ্টা করতে পারে যা v2-স্বাক্ষরিত APK যাচাইকরণ সমর্থন করে। এই আক্রমণ প্রশমিত করার জন্য, v2-স্বাক্ষরিত APKগুলি যেগুলি v1-স্বাক্ষরিতও তাদের META-INF/*.SF ফাইলগুলির প্রধান বিভাগে একটি X-Android-APK-সাইনড অ্যাট্রিবিউট থাকতে হবে৷ অ্যাট্রিবিউটের মান হল APK স্বাক্ষর স্কিম আইডিগুলির একটি কমা দ্বারা পৃথক করা সেট (এই স্কিমের ID হল 2)৷ v1 স্বাক্ষর যাচাই করার সময়, APK যাচাইকারীকে সেই APKগুলিকে প্রত্যাখ্যান করতে হবে যেগুলির APK স্বাক্ষর স্কিমের জন্য একটি স্বাক্ষর নেই যা যাচাইকারী এই সেট থেকে পছন্দ করে (যেমন, v2 স্কিম)। এই সুরক্ষা এই সত্যের উপর নির্ভর করে যে বিষয়বস্তু META-INF/*.SF ফাইলগুলি v1 স্বাক্ষর দ্বারা সুরক্ষিত। JAR স্বাক্ষরিত APK যাচাইকরণের বিভাগটি দেখুন।
একজন আক্রমণকারী APK স্বাক্ষর স্কিম v2 ব্লক থেকে শক্তিশালী স্বাক্ষর ছিনিয়ে নেওয়ার চেষ্টা করতে পারে। এই আক্রমণ প্রশমিত করার জন্য, স্বাক্ষর অ্যালগরিদম আইডিগুলির তালিকা যেগুলির সাথে APK স্বাক্ষর করা হয়েছিল তা signed data
ব্লকে সংরক্ষণ করা হয়েছে যা প্রতিটি স্বাক্ষর দ্বারা সুরক্ষিত।
যাচাইকরণ
Android 7.0 এবং পরবর্তীতে, APKগুলিকে APK স্বাক্ষর স্কিম v2+ বা JAR স্বাক্ষর (v1 স্কিম) অনুযায়ী যাচাই করা যেতে পারে। পুরানো প্ল্যাটফর্ম v2 স্বাক্ষর উপেক্ষা করে এবং শুধুমাত্র v1 স্বাক্ষর যাচাই করে।
APK স্বাক্ষর স্কিম v2 যাচাইকরণ
- APK সাইনিং ব্লক সনাক্ত করুন এবং যাচাই করুন যে:
- APK সাইনিং ব্লকের দুটি আকারের ক্ষেত্রে একই মান রয়েছে।
- জিপ সেন্ট্রাল ডিরেক্টরি অবিলম্বে সেন্ট্রাল ডিরেক্টরি রেকর্ডের জিপ এন্ড অনুসরণ করে।
- সেন্ট্রাল ডাইরেক্টরির জিপ এন্ডে বেশি ডেটা থাকে না।
- APK সাইনিং ব্লকের ভিতরে প্রথম APK স্বাক্ষর স্কিম v2 ব্লক খুঁজুন। যদি v2 ব্লক থাকে, তাহলে ধাপ 3 এ এগিয়ে যান। অন্যথায়, v1 স্কিম ব্যবহার করে APK যাচাই করতে ফিরে যান।
- APK স্বাক্ষর স্কিম v2 ব্লকে প্রতিটি
signer
জন্য:-
signatures
থেকে শক্তিশালী সমর্থিতsignature algorithm ID
বেছে নিন। শক্তি ক্রম প্রতিটি বাস্তবায়ন/প্ল্যাটফর্ম সংস্করণ পর্যন্ত। -
public key
ব্যবহার করেsigned data
বিপরীতেsignatures
থেকে সংশ্লিষ্টsignature
যাচাই করুন। (এখনsigned data
পার্স করা নিরাপদ।) - যাচাই করুন যে
digests
এবংsignatures
স্বাক্ষর অ্যালগরিদম আইডিগুলির অর্ডারকৃত তালিকা অভিন্ন৷ (এটি স্বাক্ষর স্ট্রিপিং/সংযোজন রোধ করার জন্য।) - স্বাক্ষর অ্যালগরিদম দ্বারা ব্যবহৃত ডাইজেস্ট অ্যালগরিদমের মতো একই ডাইজেস্ট অ্যালগরিদম ব্যবহার করে APK বিষয়বস্তুর ডাইজেস্ট গণনা করুন ৷
- যাচাই করুন যে গণনা করা ডাইজেস্ট
digests
থেকে সংশ্লিষ্টdigest
সাথে অভিন্ন। -
certificates
প্রথমcertificate
SubjectPublicKeyInfopublic key
এর সাথে অভিন্ন তা যাচাই করুন।
-
- যাচাই সফল হয় যদি কমপক্ষে একজন
signer
পাওয়া যায় এবং প্রতিটি প্রাপ্তsigner
জন্য ধাপ 3 সফল হয়।
দ্রষ্টব্য : যদি ধাপ 3 বা 4-এ ব্যর্থতা দেখা দেয় তাহলে APK অবশ্যই v1 স্কিম ব্যবহার করে যাচাই করা উচিত নয়।
JAR-স্বাক্ষরিত APK যাচাইকরণ (v1 স্কিম)
JAR-স্বাক্ষর করা APK হল একটি প্রমিত স্বাক্ষরিত JAR , যাতে অবশ্যই META-INF/MANIFEST.MF-এ তালিকাভুক্ত এন্ট্রিগুলি থাকতে হবে এবং যেখানে সমস্ত এন্ট্রিগুলিকে অবশ্যই স্বাক্ষরকারীদের একই সেট দ্বারা স্বাক্ষর করতে হবে৷ এর অখণ্ডতা নিম্নরূপ যাচাই করা হয়:
- প্রতিটি স্বাক্ষরকারীকে একটি META-INF/<signer>.SF এবং META-INF/<signer>.(RSA|DSA|EC) JAR এন্ট্রি দ্বারা প্রতিনিধিত্ব করা হয়৷
- <signer>.(RSA|DSA|EC) হল একটি PKCS #7 CMS ContentInfo যার স্বাক্ষরিত ডেটা কাঠামো রয়েছে যার স্বাক্ষর <signer>.SF ফাইলে যাচাই করা হয়।
- <signer>.SF ফাইলটিতে META-INF/MANIFEST.MF-এর একটি সম্পূর্ণ-ফাইল ডাইজেস্ট রয়েছে এবং META-INF/MANIFEST.MF-এর প্রতিটি বিভাগের ডাইজেস্ট রয়েছে৷ MANIFEST.MF-এর সম্পূর্ণ-ফাইল ডাইজেস্ট যাচাই করা হয়েছে৷ যদি এটি ব্যর্থ হয়, প্রতিটি MANIFEST.MF বিভাগের ডাইজেস্ট পরিবর্তে যাচাই করা হয়৷
- META-INF/MANIFEST.MF তে রয়েছে, প্রতিটি অখণ্ডতা-সুরক্ষিত JAR এন্ট্রির জন্য, একটি অনুরূপভাবে নামযুক্ত বিভাগ যাতে এন্ট্রির অসঙ্কোচিত বিষয়বস্তুর ডাইজেস্ট থাকে। এই সব ডাইজেস্ট যাচাই করা হয়.
- APK যাচাইকরণ ব্যর্থ হয় যদি APK-এ JAR এন্ট্রি থাকে যা MANIFEST.MF-এ তালিকাভুক্ত নয় এবং JAR স্বাক্ষরের অংশ নয়।
এইভাবে সুরক্ষা চেইন হল <সাইনার>।(RSA|DSA|EC) -> <সাইনার>.SF -> MANIFEST.MF -> প্রতিটি অখণ্ডতা-সুরক্ষিত JAR এন্ট্রির বিষয়বস্তু।