امضای برنامه

امضای برنامه به توسعه دهندگان این امکان را می دهد که نویسنده برنامه را شناسایی کرده و برنامه خود را بدون ایجاد رابط ها و مجوزهای پیچیده به روز کنند. هر برنامه ای که بر روی پلتفرم اندروید اجرا می شود باید توسط توسعه دهنده امضا شود . برنامه‌هایی که سعی می‌کنند بدون امضا نصب شوند، توسط Google Play یا نصب‌کننده بسته در دستگاه Android رد می‌شوند.

در Google Play، امضای برنامه، اعتمادی را که گوگل به توسعه‌دهنده دارد و اعتمادی که توسعه‌دهنده به برنامه خود دارد، پیوند می‌دهد. توسعه دهندگان می دانند که برنامه آنها بدون تغییر در دستگاه Android ارائه شده است. و توسعه دهندگان را می توان برای رفتار برنامه خود پاسخگو دانست.

در اندروید، امضای برنامه اولین قدم برای قرار دادن یک برنامه در Application Sandbox آن است. گواهی برنامه امضا شده مشخص می کند که کدام شناسه کاربری با کدام برنامه مرتبط است. برنامه های مختلف تحت شناسه های کاربری مختلف اجرا می شوند. امضای برنامه تضمین می کند که یک برنامه نمی تواند به هیچ برنامه دیگری دسترسی داشته باشد مگر از طریق IPC کاملاً تعریف شده.

وقتی یک برنامه (فایل APK) روی دستگاه Android نصب می‌شود، Package Manager تأیید می‌کند که APK به درستی با گواهی موجود در آن APK امضا شده است. اگر گواهی (یا به‌طور دقیق‌تر، کلید عمومی در گواهی) با کلید مورد استفاده برای امضای هر APK دیگری در دستگاه مطابقت داشته باشد، APK جدید این گزینه را دارد که در مانیفست مشخص کند که یک UID را به طور مشابه با دیگری به اشتراک بگذارد. APKهای امضا شده

برنامه ها را می توان توسط شخص ثالث (OEM، اپراتور، بازار جایگزین) امضا کرد یا خود امضا کرد. اندروید امضای کد را با استفاده از گواهینامه‌های خودامضا ارائه می‌کند که توسعه‌دهندگان می‌توانند بدون کمک یا اجازه خارجی ایجاد کنند. درخواست ها نیازی به امضای یک مقام مرکزی ندارند. Android در حال حاضر تأیید CA را برای گواهی‌های برنامه انجام نمی‌دهد.

برنامه‌ها همچنین می‌توانند مجوزهای امنیتی را در سطح حفاظت از امضا اعلام کنند، و دسترسی را فقط به برنامه‌هایی که با همان کلید امضا شده‌اند محدود می‌کنند و در عین حال UID و Application Sandbox‌های مجزا را حفظ می‌کنند. یک رابطه نزدیکتر با یک Sandbox برنامه مشترک از طریق ویژگی UID مشترک مجاز است که در آن دو یا چند برنامه که با کلید توسعه دهنده یکسان امضا شده اند می توانند یک UID مشترک را در مانیفست خود اعلام کنند.

طرح های امضای APK

اندروید از سه طرح امضای برنامه پشتیبانی می کند:

برای حداکثر سازگاری، برنامه ها را با همه طرح ها، ابتدا با 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

شکل 1. فرآیند تأیید امضای APK

هش کل فایل APK با امضای v2+ ذخیره شده در بلوک امضای APK تأیید شده است. هش همه چیز را پوشش می دهد به جز بلوک امضای APK که حاوی امضای v2+ است. هرگونه تغییر در APK خارج از بلوک امضای APK، امضای v2+ APK را باطل می‌کند. فایل‌های APK با امضای v2+ حذف شده نیز رد می‌شوند، زیرا امضای v1 آن‌ها مشخص می‌کند که APK دارای امضای v2 است، که باعث می‌شود Android 7.0 و جدیدتر از تأیید APK با استفاده از امضای v1 خودداری کند.

برای جزئیات در مورد فرآیند تأیید امضای APK، به بخش تأیید APK Signature Scheme v2 مراجعه کنید.

،

امضای برنامه به توسعه دهندگان این امکان را می دهد که نویسنده برنامه را شناسایی کرده و برنامه خود را بدون ایجاد رابط ها و مجوزهای پیچیده به روز کنند. هر برنامه ای که بر روی پلتفرم اندروید اجرا می شود باید توسط توسعه دهنده امضا شود . برنامه‌هایی که سعی می‌کنند بدون امضا نصب شوند، توسط Google Play یا نصب‌کننده بسته در دستگاه Android رد می‌شوند.

در Google Play، امضای برنامه، اعتمادی را که گوگل به توسعه‌دهنده دارد و اعتمادی که توسعه‌دهنده به برنامه خود دارد، پیوند می‌دهد. توسعه دهندگان می دانند که برنامه آنها بدون تغییر در دستگاه Android ارائه شده است. و توسعه دهندگان را می توان برای رفتار برنامه خود پاسخگو دانست.

در اندروید، امضای برنامه اولین قدم برای قرار دادن یک برنامه در Application Sandbox آن است. گواهی برنامه امضا شده مشخص می کند که کدام شناسه کاربری با کدام برنامه مرتبط است. برنامه های مختلف تحت شناسه های کاربری مختلف اجرا می شوند. امضای برنامه تضمین می کند که یک برنامه نمی تواند به هیچ برنامه دیگری دسترسی داشته باشد مگر از طریق IPC کاملاً تعریف شده.

وقتی یک برنامه (فایل APK) روی دستگاه Android نصب می‌شود، Package Manager تأیید می‌کند که APK به درستی با گواهی موجود در آن APK امضا شده است. اگر گواهی (یا به‌طور دقیق‌تر، کلید عمومی در گواهی) با کلید مورد استفاده برای امضای هر APK دیگری در دستگاه مطابقت داشته باشد، APK جدید این گزینه را دارد که در مانیفست مشخص کند که یک UID را به طور مشابه با دیگری به اشتراک بگذارد. APKهای امضا شده

برنامه ها را می توان توسط شخص ثالث (OEM، اپراتور، بازار جایگزین) امضا کرد یا خود امضا کرد. اندروید امضای کد را با استفاده از گواهینامه‌های خودامضا ارائه می‌کند که توسعه‌دهندگان می‌توانند بدون کمک یا اجازه خارجی ایجاد کنند. درخواست ها نیازی به امضای یک مقام مرکزی ندارند. Android در حال حاضر تأیید CA را برای گواهی‌های برنامه انجام نمی‌دهد.

برنامه‌ها همچنین می‌توانند مجوزهای امنیتی را در سطح حفاظت از امضا اعلام کنند، و دسترسی را فقط به برنامه‌هایی که با همان کلید امضا شده‌اند محدود می‌کنند و در عین حال UID و Application Sandbox‌های مجزا را حفظ می‌کنند. یک رابطه نزدیکتر با یک Sandbox برنامه مشترک از طریق ویژگی UID مشترک مجاز است که در آن دو یا چند برنامه که با کلید توسعه دهنده یکسان امضا شده اند می توانند یک UID مشترک را در مانیفست خود اعلام کنند.

طرح های امضای APK

اندروید از سه طرح امضای برنامه پشتیبانی می کند:

برای حداکثر سازگاری، برنامه ها را با همه طرح ها، ابتدا با 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

شکل 1. فرآیند تأیید امضای APK

هش کل فایل APK با امضای v2+ ذخیره شده در بلوک امضای APK تأیید شده است. هش همه چیز را پوشش می دهد به جز بلوک امضای APK که حاوی امضای v2+ است. هرگونه تغییر در APK خارج از بلوک امضای APK، امضای v2+ APK را باطل می‌کند. فایل‌های APK با امضای v2+ حذف شده نیز رد می‌شوند، زیرا امضای v1 آن‌ها مشخص می‌کند که APK دارای امضای v2 است، که باعث می‌شود Android 7.0 و جدیدتر از تأیید APK با استفاده از امضای v1 خودداری کند.

برای جزئیات در مورد فرآیند تأیید امضای APK، به بخش تأیید APK Signature Scheme v2 مراجعه کنید.