امضای برنامه به توسعه دهندگان این امکان را می دهد که نویسنده برنامه را شناسایی کرده و برنامه خود را بدون ایجاد رابط ها و مجوزهای پیچیده به روز کنند. هر برنامه ای که بر روی پلتفرم اندروید اجرا می شود باید توسط توسعه دهنده امضا شود. برنامههایی که سعی میکنند بدون امضا نصب شوند، توسط Google Play یا نصبکننده بسته در دستگاه Android رد میشوند.
در Google Play، امضای برنامه، اعتمادی را که Google به توسعهدهنده دارد و اعتمادی که توسعهدهنده به برنامه خود دارد، پیوند میدهد. توسعه دهندگان می دانند که برنامه آنها بدون تغییر در دستگاه Android ارائه شده است. و توسعه دهندگان را می توان در قبال رفتار برنامه خود پاسخگو دانست.
در اندروید، امضای برنامه اولین قدم برای قرار دادن یک برنامه در Application Sandbox آن است. گواهی برنامه امضا شده مشخص می کند که کدام شناسه کاربری با کدام برنامه مرتبط است. برنامه های مختلف تحت شناسه های کاربری مختلف اجرا می شوند. امضای برنامه تضمین می کند که یک برنامه نمی تواند به برنامه دیگری دسترسی داشته باشد مگر از طریق IPC کاملاً تعریف شده.
هنگامی که یک برنامه (فایل APK) روی دستگاه Android نصب می شود، Package Manager تأیید می کند که APK به درستی با گواهی موجود در آن APK امضا شده است. اگر گواهی (یا بهطور دقیقتر، کلید عمومی در گواهی) با کلید مورد استفاده برای امضای هر APK دیگری در دستگاه مطابقت داشته باشد، APK جدید این گزینه را دارد که در مانیفست مشخص کند که یک UID را با دیگری به اشتراک بگذارد. APK های امضا شده
برنامه ها را می توان توسط شخص ثالث (OEM، اپراتور، بازار جایگزین) امضا کرد یا خود امضا کرد. Android امضای کد را با استفاده از گواهینامههای خودامضا ارائه میکند که توسعهدهندگان میتوانند بدون کمک یا اجازه خارجی ایجاد کنند. درخواست ها نباید توسط یک مقام مرکزی امضا شوند. Android در حال حاضر تأیید CA را برای گواهیهای برنامه انجام نمیدهد.
برنامهها همچنین میتوانند مجوزهای امنیتی را در سطح حفاظت از امضا اعلام کنند، و دسترسی را فقط به برنامههایی که با همان کلید امضا شدهاند محدود میکنند و در عین حال UID و Application Sandboxهای مجزا را حفظ میکنند. با استفاده از ویژگی UID مشترک که در آن دو یا چند برنامه که با کلید توسعهدهنده یکسان امضا شدهاند، میتوانند یک UID مشترک را در مانیفست خود اعلام کنند، ارتباط نزدیکتر با یک Sandbox برنامه مشترک مجاز است.
طرح های امضای APK
اندروید از سه طرح امضای برنامه پشتیبانی می کند:
- طرح v1: بر اساس امضای JAR
- طرح v2: APK Signature Scheme v2 که در اندروید 7.0 معرفی شد.
- طرح v3: APK Signature Scheme v3 که در اندروید 9 معرفی شد.
برای حداکثر سازگاری، برنامه ها را با همه طرح ها، ابتدا با v1، سپس v2 و سپس v3 امضا کنید. Android نسخه 7.0 و بالاتر و دستگاههای جدیدتر، برنامههای امضاشده با طرحهای v2+ را سریعتر از برنامههایی که فقط با طرح v1 امضا شدهاند، نصب میکنند. پلتفرمهای قدیمیتر اندروید، امضاهای v2+ را نادیده میگیرند و بنابراین به برنامهها نیاز دارند که دارای امضاهای v1 باشند.
امضای JAR (طرح v1)
امضای APK از ابتدا بخشی از اندروید بوده است. این بر اساس JAR امضا شده است . برای جزئیات استفاده از این طرح، به مستندات Android Studio در امضای برنامه خود مراجعه کنید.
امضاهای v1 از برخی از بخشهای APK مانند ابرداده ZIP محافظت نمیکنند. تأییدکننده APK باید تعداد زیادی از ساختارهای داده غیرقابل اعتماد (هنوز تأیید نشده) را پردازش کند و سپس دادههایی را که توسط امضاها پوشش داده نمیشود دور بریزد. این یک سطح حمله قابل توجهی را ارائه می دهد. علاوه بر این، تأیید کننده APK باید تمام ورودی های فشرده را از حالت فشرده خارج کند و زمان و حافظه بیشتری را مصرف کند. برای رفع این مشکلات، Android 7.0 APK Signature Scheme v2 را معرفی کرد.
APK Signature Scheme نسخه 2 و نسخه 3 (طرح نسخه 2+)
دستگاههایی که Android نسخه ۷.۰ و جدیدتر دارند، از طرح امضای APK نسخه ۲ (طرح نسخه ۲) و جدیدتر پشتیبانی میکنند. (طرح v2 در اندروید 9 به نسخه 3 به روز شد تا اطلاعات بیشتری را در بلوک امضاء گنجانده باشد، اما در غیر این صورت یکسان عمل می کند.) محتویات APK هش شده و امضا می شود، سپس بلوک امضای APK ایجاد شده در APK درج می شود. برای جزئیات در مورد اعمال طرح v2+ در یک برنامه، APK Signature Scheme v2 را ببینید.
در طول اعتبارسنجی، طرح v2+ فایل APK را به عنوان یک لکه در نظر می گیرد و بررسی امضا را در کل فایل انجام می دهد. هر گونه تغییر در APK، از جمله اصلاحات فراداده ZIP، امضای APK را باطل می کند. این شکل از تأیید APK به طور قابل ملاحظهای سریعتر است و امکان شناسایی دستههای بیشتری از تغییرات غیرمجاز را فراهم میکند.
فرمت جدید با نسخه قبلی سازگار است، بنابراین فایلهای APK امضا شده با فرمت امضای جدید را میتوان در دستگاههای Android قدیمیتر (که به سادگی دادههای اضافی اضافه شده به APK را نادیده میگیرند) نصب کرد، تا زمانی که این APKها دارای امضای v1 نیز باشند.
هش کل فایل APK با امضای v2+ ذخیره شده در بلوک امضای APK تأیید شده است. هش همه چیز را پوشش می دهد به جز بلوک امضای APK که حاوی امضای v2+ است. هرگونه تغییر در APK خارج از بلوک امضای APK، امضای v2+ APK را باطل میکند. فایلهای APK با امضای v2+ حذف شده نیز رد میشوند، زیرا امضای v1 آنها مشخص میکند که APK دارای امضای v2 است، که باعث میشود اندروید 7.0 و جدیدتر از تأیید APK با استفاده از امضای v1 خودداری کند.
برای جزئیات در مورد فرآیند تأیید امضای APK، به بخش تأیید APK Signature Scheme v2 مراجعه کنید.