Android 9 APK কী ঘূর্ণন সমর্থন করে, যা অ্যাপগুলিকে একটি APK আপডেটের অংশ হিসাবে তাদের সাইনিং কী পরিবর্তন করার ক্ষমতা দেয়৷ ঘূর্ণনকে ব্যবহারিক করার জন্য, APKগুলিকে অবশ্যই নতুন এবং পুরানো সাইনিং কী-এর মধ্যে বিশ্বাসের মাত্রা নির্দেশ করতে হবে৷ কী ঘূর্ণন সমর্থন করার জন্য, আমরা নতুন এবং পুরানো কীগুলি ব্যবহার করার অনুমতি দেওয়ার জন্য v2 থেকে v3 তে APK স্বাক্ষর স্কিম আপডেট করেছি৷ V3 সমর্থিত SDK সংস্করণ সম্পর্কে তথ্য এবং APK সাইনিং ব্লকে একটি প্রুফ-অফ-ঘূর্ণন কাঠামো যোগ করে।
APK সাইনিং ব্লক
v1 APK ফর্ম্যাটের সাথে পিছিয়ে-সামঞ্জস্য বজায় রাখতে, v2 এবং v3 APK স্বাক্ষরগুলি একটি APK সাইনিং ব্লকের মধ্যে সংরক্ষণ করা হয়, যা ZIP সেন্ট্রাল ডিরেক্টরির ঠিক আগে অবস্থিত।
v3 APK সাইনিং ব্লক ফরম্যাট v2 এর মতই । APK-এর v3 স্বাক্ষর আইডি 0xf05368c0-এর সাথে একটি ID-মান পেয়ার হিসাবে সংরক্ষণ করা হয়।
APK স্বাক্ষর স্কিম v3 ব্লক
v3 স্কিমটি v2 স্কিমের অনুরূপ ডিজাইন করা হয়েছে। এটির একই সাধারণ বিন্যাস রয়েছে এবং একই স্বাক্ষর অ্যালগরিদম আইডি , কী আকার এবং EC বক্ররেখা সমর্থন করে৷
যাইহোক, v3 স্কিম সমর্থিত SDK সংস্করণ এবং প্রুফ-অফ-ঘূর্ণন কাঠামো সম্পর্কে তথ্য যোগ করে।
বিন্যাস
APK স্বাক্ষর স্কিম v3 ব্লক আইডি 0xf05368c0 এর অধীনে APK স্বাক্ষর ব্লকের মধ্যে সংরক্ষণ করা হয়।
APK স্বাক্ষর স্কিম v3 ব্লকের বিন্যাস v2 এর অনুসরণ করে:
- দৈর্ঘ্য-প্রিফিক্সড
signerদৈর্ঘ্য-প্রিফিক্সড ক্রম:- দৈর্ঘ্য-প্রিফিক্সড
signed data:- দৈর্ঘ্য-প্রিফিক্সড
digestsদৈর্ঘ্য-প্রিফিক্সড ক্রম:-
signature algorithm ID(4 বাইট) -
digest(দৈর্ঘ্য-প্রিফিক্সড)
-
- X.509
certificatesদৈর্ঘ্য-প্রিফিক্সড ক্রম :- দৈর্ঘ্য-প্রিফিক্সড X.509
certificate(ASN.1 DER ফর্ম)
- দৈর্ঘ্য-প্রিফিক্সড X.509
-
minSDK(uint32) - প্ল্যাটফর্ম সংস্করণ এই সংখ্যার নিচে থাকলে এই স্বাক্ষরকারীকে উপেক্ষা করা উচিত। -
maxSDK(uint32) - প্ল্যাটফর্ম সংস্করণ এই সংখ্যার উপরে হলে এই স্বাক্ষরকারীকে উপেক্ষা করা উচিত। - দৈর্ঘ্য-প্রিফিক্সড
additional attributesদৈর্ঘ্য-প্রিফিক্সড ক্রম:-
ID(uint32) -
value(ভেরিয়েবল-দৈর্ঘ্য: অতিরিক্ত বৈশিষ্ট্যের দৈর্ঘ্য - 4 বাইট) -
ID - 0x3ba06f8c -
value -প্রুফ-অফ-ঘূর্ণন কাঠামো
-
- দৈর্ঘ্য-প্রিফিক্সড
-
minSDK(uint32) - স্বাক্ষরিত ডেটা বিভাগে minSDK মানের ডুপ্লিকেট - বর্তমান প্ল্যাটফর্ম পরিসরে না থাকলে এই স্বাক্ষরের যাচাইকরণ এড়িয়ে যেতে ব্যবহৃত হয়। স্বাক্ষরিত ডেটা মান অবশ্যই মেলে। -
maxSDK(uint32) - স্বাক্ষরিত ডেটা বিভাগে maxSDK মানের ডুপ্লিকেট - বর্তমান প্ল্যাটফর্ম পরিসরে না থাকলে এই স্বাক্ষরের যাচাইকরণ এড়িয়ে যেতে ব্যবহৃত হয়। স্বাক্ষরিত ডেটা মান অবশ্যই মেলে। - দৈর্ঘ্য-প্রিফিক্সড
signaturesদৈর্ঘ্য-প্রিফিক্সড ক্রম:-
signature algorithm ID(uint32) -
signed dataউপরে দৈর্ঘ্য-প্রিফিক্সডsignature
-
- দৈর্ঘ্য-প্রিফিক্সড
public key(SubjectPublicKeyInfo, ASN.1 DER ফর্ম)
- দৈর্ঘ্য-প্রিফিক্সড
প্রুফ-অফ-ঘূর্ণন এবং স্ব-বিশ্বস্ত-পুরাতন-শংসাপত্রের কাঠামো
প্রুফ-অফ রোটেশন স্ট্রাকট অ্যাপগুলিকে তাদের সাইনিং শংসাপত্র ঘোরানোর অনুমতি দেয় অন্য অ্যাপে ব্লক না করেই যার সাথে তারা যোগাযোগ করে। এটি সম্পন্ন করার জন্য, অ্যাপ স্বাক্ষরে দুটি নতুন তথ্য রয়েছে:
- তৃতীয় পক্ষের জন্য দাবি যে অ্যাপের সাইনিং শংসাপত্রটি যেখানেই তার পূর্বসূরীদের বিশ্বাস করা হয় সেখানে বিশ্বাস করা যেতে পারে
- অ্যাপের পুরনো সাইনিং শংসাপত্র যা অ্যাপ নিজেই এখনও বিশ্বাস করে
সাইনড-ডেটা বিভাগে প্রুফ-অফ-ঘূর্ণন বৈশিষ্ট্যটি একটি একক-লিঙ্কযুক্ত তালিকা নিয়ে গঠিত, প্রতিটি নোডের সাথে একটি সাইনিং শংসাপত্র রয়েছে যা অ্যাপের পূর্ববর্তী সংস্করণগুলিতে স্বাক্ষর করতে ব্যবহৃত হয়। এই বৈশিষ্ট্যটি ধারণাগত প্রমাণ-অফ-ঘূর্ণন এবং স্ব-বিশ্বস্ত-পুরাতন-সার্টিস ডেটা স্ট্রাকচার ধারণ করে। তালিকাটি রুট নোডের সাথে সম্পর্কিত প্রাচীনতম স্বাক্ষরকারী শংসাপত্র সহ সংস্করণ অনুসারে অর্ডার করা হয়েছে। প্রুফ-অফ-ঘূর্ণন ডেটা স্ট্রাকচার তৈরি করা হয় তালিকার পরের দিকে প্রতিটি নোডের চিহ্নে সার্টি দিয়ে, এবং এইভাবে প্রতিটি নতুন কীকে প্রমাণ সহ ইম্বু করে যে এটি পুরানো কী(গুলি) এর মতোই বিশ্বস্ত হওয়া উচিত।
স্ব-বিশ্বস্ত-পুরাতন-সার্টিস ডেটা স্ট্রাকচার প্রতিটি নোডে ফ্ল্যাগ যোগ করে সেটে সদস্যতা এবং বৈশিষ্ট্য নির্দেশ করে। উদাহরণস্বরূপ, একটি পতাকা উপস্থিত থাকতে পারে যা নির্দেশ করে যে প্রদত্ত নোডে স্বাক্ষরকারী শংসাপত্রটি Android স্বাক্ষর অনুমতি পাওয়ার জন্য বিশ্বস্ত। এই পতাকাটি পুরানো শংসাপত্র দ্বারা স্বাক্ষরিত অন্যান্য অ্যাপ্লিকেশনগুলিকে এখনও নতুন স্বাক্ষর শংসাপত্রের সাথে স্বাক্ষরিত একটি অ্যাপ দ্বারা সংজ্ঞায়িত একটি স্বাক্ষর অনুমতি মঞ্জুর করার অনুমতি দেয়৷ কারণ পুরো প্রমাণ-অফ-ঘূর্ণন বৈশিষ্ট্যটি v3 signer ক্ষেত্রের স্বাক্ষরিত ডেটা বিভাগে থাকে, এটি apk-এ স্বাক্ষর করতে ব্যবহৃত কী দ্বারা সুরক্ষিত।
এই বিন্যাসটি একাধিক সাইনিং কী এবং বিভিন্ন পূর্বপুরুষ স্বাক্ষরকারী শংসাপত্রের একের সাথে একত্রিত হওয়া (একটি সাধারণ সিঙ্কে একাধিক প্রারম্ভিক নোড) বাদ দেয়।
বিন্যাস
প্রুফ-অফ-ঘূর্ণন আইডি 0x3ba06f8c এর অধীনে APK স্বাক্ষর স্কিম v3 ব্লকের ভিতরে সংরক্ষণ করা হয়। এর বিন্যাস হল:
- দৈর্ঘ্য-প্রিফিক্সড
levelsদৈর্ঘ্য-প্রিফিক্সড ক্রম:- দৈর্ঘ্য-প্রিফিক্সড
signed data(আগের শংসাপত্র দ্বারা - যদি বিদ্যমান থাকে)- দৈর্ঘ্য-প্রিফিক্সড X.509
certificate(ASN.1 DER ফর্ম) -
signature algorithm ID(uint32) - পূর্ববর্তী স্তরে সার্টি দ্বারা ব্যবহৃত অ্যালগরিদম
- দৈর্ঘ্য-প্রিফিক্সড X.509
-
flags(uint32) - পতাকাগুলি নির্দেশ করে যে এই শংসাপত্রটি স্ব-বিশ্বস্ত-পুরাতন-সার্টিস স্ট্রাকটে থাকা উচিত কিনা এবং কোন কাজগুলির জন্য। -
signature algorithm ID(uint32) - পরবর্তী স্তরের স্বাক্ষরিত ডেটা বিভাগের সাথে অবশ্যই মিলবে৷ - উপরে
signed dataউপরে দৈর্ঘ্য-প্রিফিক্সডsignature
- দৈর্ঘ্য-প্রিফিক্সড
একাধিক সার্টিফিকেট
একাধিক স্বাক্ষরকারী সমর্থিত নয় এবং Google Play একাধিক শংসাপত্র সহ স্বাক্ষরিত অ্যাপ প্রকাশ করে না।
যাচাইকরণ
Android 9 এবং উচ্চতর সংস্করণে, APKগুলিকে APK স্বাক্ষর স্কিম v3, v2 স্কিম বা v1 স্কিম অনুযায়ী যাচাই করা যেতে পারে। পুরানো প্ল্যাটফর্মগুলি v3 স্বাক্ষর উপেক্ষা করে এবং v2 স্বাক্ষর যাচাই করার চেষ্টা করে, তারপর v1।

চিত্র 1. APK স্বাক্ষর যাচাইকরণ প্রক্রিয়া
APK স্বাক্ষর স্কিম v3 যাচাইকরণ
- APK সাইনিং ব্লক সনাক্ত করুন এবং যাচাই করুন যে:
- APK সাইনিং ব্লকের দুটি আকারের ক্ষেত্রে একই মান রয়েছে।
- জিপ সেন্ট্রাল ডিরেক্টরি অবিলম্বে সেন্ট্রাল ডিরেক্টরি রেকর্ডের জিপ এন্ড অনুসরণ করে।
- সেন্ট্রাল ডাইরেক্টরির জিপ এন্ডে বেশি ডেটা থাকে না।
- APK সাইনিং ব্লকের ভিতরে প্রথম APK স্বাক্ষর স্কিম v3 ব্লকটি খুঁজুন। v3 ব্লক উপস্থিত থাকলে, ধাপ 3 এ এগিয়ে যান। অন্যথায়, v2 স্কিম ব্যবহার করে APK যাচাই করতে ফিরে যান।
- APK স্বাক্ষর স্কিম v3 ব্লকে প্রতিটি
signerজন্য বর্তমান প্ল্যাটফর্মের সীমার মধ্যে একটি ন্যূনতম এবং সর্বাধিক SDK সংস্করণ সহ:-
signaturesথেকে শক্তিশালী সমর্থিতsignature algorithm IDবেছে নিন। শক্তি ক্রম প্রতিটি বাস্তবায়ন/প্ল্যাটফর্ম সংস্করণ পর্যন্ত। -
public keyব্যবহার করেsigned dataবিপরীতেsignaturesথেকে সংশ্লিষ্টsignatureযাচাই করুন। (এখনsigned dataপার্স করা নিরাপদ।) - স্বাক্ষরিত ডেটার সর্বনিম্ন এবং সর্বোচ্চ SDK সংস্করণগুলি
signerজন্য নির্দিষ্ট করাগুলির সাথে মেলে তা যাচাই করুন৷ - যাচাই করুন যে
digestsএবংsignaturesস্বাক্ষর অ্যালগরিদম আইডিগুলির অর্ডারকৃত তালিকা অভিন্ন৷ (এটি স্বাক্ষর স্ট্রিপিং/সংযোজন রোধ করার জন্য।) - স্বাক্ষর অ্যালগরিদম দ্বারা ব্যবহৃত ডাইজেস্ট অ্যালগরিদমের মতো একই ডাইজেস্ট অ্যালগরিদম ব্যবহার করে APK বিষয়বস্তুর ডাইজেস্ট গণনা করুন ৷
- যাচাই করুন যে গণনা করা ডাইজেস্ট
digestsথেকে সংশ্লিষ্টdigestসাথে অভিন্ন। -
certificatesপ্রথমcertificateSubjectPublicKeyInfopublic keyএর সাথে অভিন্ন তা যাচাই করুন। - যদি
signerজন্য প্রুফ-অফ-ঘূর্ণন বৈশিষ্ট্য বিদ্যমান থাকে তবে যাচাই করুন যে কাঠামোটি বৈধ এবং এইsignerতালিকার শেষ শংসাপত্র।
-
- যাচাই সফল হয় যদি বর্তমান প্ল্যাটফর্মের পরিসরে একজন
signerপাওয়া যায় এবং সেইsignerজন্য ধাপ 3 সফল হয়।
বৈধতা
আপনার ডিভাইসটি সঠিকভাবে v3 সমর্থন করে কিনা তা পরীক্ষা করতে, cts/hostsidetests/appsecurity/src/android/appsecurity/cts/ PkgInstallSignatureVerificationTest.java CTS পরীক্ষা চালান।