APK স্বাক্ষর স্কিম v3

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 ফর্ম)
      • 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) - পূর্ববর্তী স্তরে সার্টি দ্বারা ব্যবহৃত অ্যালগরিদম
    • flags (uint32) - পতাকাগুলি নির্দেশ করে যে এই শংসাপত্রটি স্ব-বিশ্বস্ত-পুরাতন-সার্টিস স্ট্রাকটে থাকা উচিত কিনা এবং কোন কাজগুলির জন্য।
    • signature algorithm ID (uint32) - পরবর্তী স্তরের স্বাক্ষরিত ডেটা বিভাগের সাথে অবশ্যই মিলবে৷
    • উপরে signed data উপরে দৈর্ঘ্য-প্রিফিক্সড signature

একাধিক সার্টিফিকেট

অ্যান্ড্রয়েড বর্তমানে একাধিক শংসাপত্রের সাথে স্বাক্ষরিত একটি APK কে সমন্বিত শংসাপত্র থেকে আলাদা একটি অনন্য স্বাক্ষরকারী পরিচয় হিসাবে বিবেচনা করে৷ এইভাবে, সাইনড-ডেটা বিভাগে প্রুফ-অফ-ঘূর্ণন বৈশিষ্ট্য একটি নির্দেশিত অ্যাসাইক্লিক গ্রাফ গঠন করে, যেটিকে একটি একক-সংযুক্ত তালিকা হিসাবে আরও ভালভাবে দেখা যেতে পারে, একটি প্রদত্ত সংস্করণের জন্য স্বাক্ষরকারীদের প্রতিটি সেট একটি নোডের প্রতিনিধিত্ব করে। এটি প্রুফ-অফ-ঘূর্ণন কাঠামোতে অতিরিক্ত জটিলতা যোগ করে (নীচে মাল্টি-সাইনার সংস্করণ)। বিশেষ করে, অর্ডার একটি উদ্বেগ হয়ে ওঠে. আরও কী, স্বাধীনভাবে APK-এ স্বাক্ষর করা আর সম্ভব নয়, কারণ প্রুফ-অফ-রোটেশন স্ট্রাকচারে একের পর এক স্বাক্ষর করার পরিবর্তে, নতুন শংসাপত্রে স্বাক্ষর করার জন্য পুরানো স্বাক্ষরকারী শংসাপত্র থাকতে হবে। উদাহরণস্বরূপ, A কী দ্বারা স্বাক্ষরিত একটি APK যা দুটি নতুন কী B এবং C দ্বারা স্বাক্ষরিত হতে চায় B স্বাক্ষরকারীতে কেবল A বা B দ্বারা একটি স্বাক্ষর অন্তর্ভুক্ত থাকতে পারে না, কারণ এটি B এবং C থেকে আলাদা স্বাক্ষরকারী পরিচয়। মানে এই ধরনের কাঠামো তৈরি করার আগে স্বাক্ষরকারীদের অবশ্যই সমন্বয় করতে হবে।

একাধিক স্বাক্ষরকারী প্রুফ-অফ-ঘূর্ণন বৈশিষ্ট্য

  • দৈর্ঘ্য-প্রিফিক্সড sets দৈর্ঘ্য-প্রিফিক্সড ক্রম:
    • signed data (আগের সেট দ্বারা - যদি বিদ্যমান থাকে)
      • certificates দৈর্ঘ্য-প্রিফিক্সড ক্রম
        • দৈর্ঘ্য-প্রিফিক্সড X.509 certificate (ASN.1 DER ফর্ম)
      • signature algorithm IDs ক্রম (uint32) - আগের সেট থেকে প্রতিটি শংসাপত্রের জন্য একই ক্রমে একটি।
    • flags (uint32) - শংসাপত্রের এই সেটটি স্ব-বিশ্বস্ত-পুরাতন-সার্টিস কাঠামোতে থাকা উচিত কিনা এবং কোন ক্রিয়াকলাপগুলির জন্য তা নির্দেশ করে।
    • দৈর্ঘ্য-প্রিফিক্সড signatures দৈর্ঘ্য-প্রিফিক্সড ক্রম:
      • signature algorithm ID (uint32) - অবশ্যই স্বাক্ষরিত ডেটা বিভাগের সাথে মিল থাকতে হবে
      • উপরে signed data উপরে দৈর্ঘ্য-প্রিফিক্সড signature

প্রুফ-অফ-ঘূর্ণন কাঠামোতে একাধিক পূর্বপুরুষ

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

প্রতিপাদন

Android 9 এবং উচ্চতর সংস্করণে, APKগুলিকে APK স্বাক্ষর স্কিম v3, v2 স্কিম বা v1 স্কিম অনুযায়ী যাচাই করা যেতে পারে। পুরানো প্ল্যাটফর্মগুলি v3 স্বাক্ষর উপেক্ষা করে এবং v2 স্বাক্ষর যাচাই করার চেষ্টা করে, তারপর v1।

APK স্বাক্ষর যাচাইকরণ প্রক্রিয়া

চিত্র 1. APK স্বাক্ষর যাচাইকরণ প্রক্রিয়া

APK স্বাক্ষর স্কিম v3 যাচাইকরণ

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

বৈধতা

আপনার ডিভাইসটি সঠিকভাবে v3 সমর্থন করে কিনা তা পরীক্ষা করতে, cts/hostsidetests/appsecurity/src/android/appsecurity/cts/PkgInstallSignatureVerificationTest.java CTS পরীক্ষা চালান।