امضای برنامه Android: چگونه کار می کند و چرا مهم است
هر بار که برنامه ای را روی تلفن Androidی خود نصب می کنید، یک بررسی امنیتی بی صدا اما حیاتی در پس زمینه انجام می شود. تلفن شما امضای دیجیتال بسته APK را تأیید می کند. این دست دادن رمزنگاری چیزی است که از هکرهای مخرب جلوگیری می کند تا برنامه های شما را با بدافزار "مسموم" کنند و در عین حال اطمینان حاصل شود که توسعه دهندگان می توانند بدون از دست دادن هویت خود، به روز رسانی ها را انجام دهند.
اگر برنامه می نویسید، امضا کردن چیزی است که به سادگی باید درست انجام دهید. اگر فقط دوست دارید با Android سرهم کنید، یکی از رضایت بخش ترین بخش های سیستم برای درک آن است. در هر صورت، نحوه عملکرد امضای برنامه ارزش وقت شما را دارد. در زیر به بررسی این فناوری، چگونگی تکامل طرحهای امضا و نحوه گواهینامه ها را به صورت دستی تأیید کنید آنلاین میپردازیم.
- چرا هر برنامه Android باید امضا شود و رمزنگاری شامل چه مواردی است (RSA / EC).
- تفاوت بین طرحهای امضای v1 (JAR)، v2، v3 و v4 و اینکه برنامه شما امروز باید از کدام یک استفاده کند.
- چگونه Android تصمیم می گیرد که آیا به روز رسانی را بر اساس تداوم امضا مجاز کند یا خیر.
- نحوه چرخش کلید به یک برنامهنویس اجازه میدهد کلید امضای خود را بدون شکستن نصبهای موجود تغییر دهد.
- چگونه امضای هر APK را خودتان، در خط فرمان یا با تایید کننده مبتنی بر مرورگر تأیید کنید.
App Signing چیست؟
در اصل، امضای برنامه فرآیندی است که در آن یک توسعه دهنده از کلید خصوصی برای ایجاد بلوک امضا برای فایل های برنامه خود استفاده می کند. سپس کلید عمومی مربوطه در APK در پوشه META-INF جاسازی میشود. هنگامی که تلفن شما سعی می کند برنامه را نصب کند، از کلید عمومی استفاده می کند تا بررسی کند که آیا امضا با محتوای فایل مطابقت دارد یا خیر.
این دو ویژگی اصلی را ارائه می دهد:
- تغییرناپذیری: اگر یک بایت از کد برنامه تغییر کند (مثلاً توسط یک تروجان)، امضا دیگر با فایل مطابقت ندارد و Android از نصب آن امتناع میکند.
- اثبات هویت: اگر برنامه ای سعی می کند برنامه موجود را به روز کند، امضاهای آن باید مطابقت داشته باشد. به همین دلیل است که نمی توانید یک برنامه فیس بوک دستکاری شده را روی برنامه رسمی نصب کنید.
تکامل طرح های امضا
Google به طور مداوم مکانیسم امضا را برای بهبود سرعت و امنیت ارتقا داده است:
- V1 (امضای شیشه): فایل های فردی را در APK (ZIP) امضا می کند. این سرعت کند است زیرا سیستم عامل باید هر فایل را از حالت فشرده خارج کرده و بررسی کند. همچنین در برابر دستکاری های خاص ZIP آسیب پذیر است.
- V2 (طرح امضای APK): کل بلوک باینری APK را امضا می کند. برای تأیید نیازی به بازکردن زیپ نیست، و آن را فوق العاده سریع می کند. در Android 7.0 (نوقا) معرفی شد.
- V3 (چرخش کلید): V2 را با افزودن یک "نسب" از کلیدها گسترش می دهد. این به یک توسعهدهنده اجازه میدهد ثابت کند که یک کلید جدید جانشین مجاز کلید قدیمی است. در Android 9.0 (پای) معرفی شده است.
- V4 (امضای جریانی): به طور خاص برای نصب های تدریجی طراحی شده است و به برنامه ها اجازه می دهد تا زمانی که هنوز از طریق USB یا Wi-Fi دانلود می شوند تأیید شوند.
چرا گواهینامه ها برای Sideloading اهمیت دارند؟
هنگامی که یک APK را از یک منبع غیر رسمی دانلود می کنید، هش کردن گواهی بهترین دوست شماست. اثر انگشت گواهی (مانند هش SHA-256) به طور منحصر به فرد کلید امضای توسعه دهنده را شناسایی می کند. هر برنامه کلید امضای یکسانی را در تمام بهروزرسانیهای خود نگه میدارد، بنابراین میتوانید اثر انگشت یک APK را با مقدار منتشر شده توسعهدهنده مقایسه کنید تا صحت آن را تأیید کنید.
اگر شک دارید که یک APK جعلی است، باید آن را از طریق تأییدکننده APK آنلاین ما اجرا کنید. ابزار ما به شما نشان می دهد:
- نام مشترک (CN) امضاکننده (به عنوان مثال، "Android").
- دوره اعتبار گواهی.
- اثر انگشت SHA-1/SHA-256.
چگونه Android یک امضا را در زمان نصب تأیید می کند
مرحله "تأیید گواهی" به قدری نادیده گرفته می شود که ارزش آن را دارد که وقتی روی یک APK ضربه می زنید سیستم عامل واقعاً چه کاری انجام می دهد و Android تصمیم می گیرد آن را نصب کند یا خیر:
- APK را به صورت ZIP باز کنید و بلوک امضا را پیدا کنید. برای امضاهای v2/v3 که یک بلوک ساختاریافته بلافاصله قبل از دایرکتوری مرکزی است. برای طرح legacy v1، محتوای META-INF/*.RSA، *.DSA، یا *.EC است.
- خلاصه SHA-256 هر بایت دیگر APK را محاسبه کنید. بلوک امضا از خلاصه خود حذف شده است. هر چیز دیگری در تکه های تعریف شده هش شده است.
- هضم هر قطعه را در مقابل خلاصه های ثبت شده در بلوک امضا بررسی کنید. اگر از زمانی که برنامهنویس فایل را امضا کرده است، حتی یک بایت تغییر کرده باشد، خلاصهها مطابقت ندارند و نصب با یک خطای عمومی «برنامه نصب نشده است» رد میشود.
- بررسی کنید که بلوک امضای خود با کلید خصوصی گواهی تولید شده است. کلید عمومی گواهی برای بررسی امضای رمزنگاری شده در بلوک استفاده می شود. یک بررسی موفق به این معنی است که هر کسی که فایل را امضا کرده است دارای کلید خصوصی جفت شده با این گواهی است.
- اثر انگشت گواهی را با هر نصب موجود با همان نام بسته مقایسه کنید. اگر بسته قبلاً نصب شده باشد و APK جدید با گواهی دیگری امضا شده باشد، نصب با INSTALL_FAILED_UPDATE_INCOMPATIBLE رد می شود. این اصلیترین دفاع ضد جعل هویت سیستمعامل است: یک بازیگر مخرب نمیتواند برنامه بانک شما را با نسخه خود جایگزین کند، مگر اینکه کلید امضای بانک را نیز دزدیده باشد.
هیچکدام از اینها قابل اعتماد بودن توسعهدهنده را ثابت نمیکند، فقط این که فایلی که میخواهید نصب کنید با بایتی که امضا کردهاند است و هیچ طرف دیگری آن را دستکاری نکرده است. اعتماد به توسعهدهنده یک تصمیم جداگانه است و شما با تصمیمگیری در مورد اینکه از کدام منابع نصب میکنید، تصمیم میگیرید.
"عدم تطابق امضا" واقعا به چه معناست
متداول ترین غافلگیری که افراد هنگام بارگذاری جانبی با آن مواجه می شوند، خطای "عدم تطابق امضا" در به روز رسانی است. در اینجا چیزی است که در واقع اتفاق می افتد:
- شما برنامه X نسخه 1.0 را از فروشگاه Play نصب کرده اید.
- شما برنامه X نسخه 1.1 را از یک منبع غیر پلی دانلود می کنید.
- سیستم عامل همان نام بسته (com.example.app) را می بیند، اما APK با یک گواهی متفاوت امضا شده است (کلید امضای منبع جانبی، نه ناشر اصلی). از نصب امتناع می کند.
دو روش در عمل اتفاق می افتد:
- APK شخص ثالث واقعاً از ناشر دیگری است، به عنوان مثال یک کپی "Modded" یا "Patched". امتناع از نصب رفتار صحیحی است. نصب آن به معنای اعتماد به یک غریبه با همان داده هایی است که برنامه بانک شما قبلاً لمس کرده است.
- APK شخص ثالث آپلود مجدد APK رسمی است، اما سیستم Google Play App Signing بارگیری هر کاربر را با بسته بندی کلید آپلود کاربر امضا می کند. گاهی اوقات دو دستگاه میتوانند دادههای امضای متفاوتی را برای نسخه مفهومی یک برنامه ببینند. در این صورت اثر انگشت گواهی در ریشه همچنان مطابقت دارد. می توانید با تأیید کننده APK ما تأیید کنید.
اگر اثر انگشت گواهی واقعا با نصب فعلی شما متفاوت است، تنها راه پیش رو این است که ابتدا نسخه فعلی را حذف نصب کنید (داده های آن را قبل از بارگذاری جانبی جایگزین کنید) و هرگز تأیید امضا را غیرفعال نکنید.
ایجاد کلید امضای خود (برای توسعه دهندگان)
اگر در حال ساخت برنامه های Android هستید، در نهایت باید بیلدهای خود را امضا کنید. دستور استاندارد تک خطی با استفاده از keytool از Java SDK عبارت است از:
keytool -genkeypair -v \
-keystore my-release.keystore \
-alias my-app -keyalg RSA -keysize 2048 \
-validity 10000
دو نکته را باید بدانید:
- اعتبار مهم است: 10000 روز (تقریباً 27 سال) مقدار متعارفی است زیرا سیستم عامل بهروزرسانیهایی را که با یک کلید تقریباً منقضی شده یا منقضی شده امضا شدهاند، به خطر میاندازد. یکبار یک کلید با عمر طولانی تولید کنید و از آن محافظت کنید.
- پس از انتشار، نمی توانید به راحتی کلیدها را تغییر دهید. طرح امضای v3 کلید چرخش را به عنوان یک ویژگی صریح اضافه میکند: یک گواهی قدیمی از طریق یک مدرک ذخیره شده، گواهی جدید را «برکت» میدهد، و به سیستمعامل اجازه میدهد بهروزرسانیها را از کلید جدید بپذیرد و در عین حال تداوم هویت را حفظ کند. بدون نسخه 3، از دست دادن کلید اصلی به معنای یتیم شدن تمام نصب های موجود است.
برای ساختهای آزمایشی جانبی، ذخیرهسازی کلید اشکالزدایی بدون امضا خوب است. برای تولید، از یک فروشگاه کلید با اعتبار طولانی محافظت شده با رمز عبور استفاده کنید که در پشتیبان گیری آفلاین ذخیره شده است.
هویت برنامه را مانند یک حرفه ای تأیید کنید
به نام فایل های عمومی اعتماد نکنید. قلب رمزنگاری APK های خود را در چند ثانیه بررسی کنید.
اکنون گواهی ها را تأیید کنیدمشکلات رایج امضا
- گواهی های خود امضا شده: اکثر برنامه های Androidی خود امضا هستند. برخلاف SSL برای وب سایت ها، هیچ مرجع مرکزی برای امضای برنامه Android وجود ندارد. شما باید مستقیماً به توسعه دهنده اعتماد کنید.
- برنامههای گواهی های اشکال زدایی: که برای آزمایش ساخته شدهاند از کلید «اشکالزدایی» عمومی استفاده میکنند. این برنامه ها هرگز نباید برای عموم منتشر شوند و توسط بسیاری از فیلترهای امنیتی مسدود شده اند.
- از دست دادن کلید: اگر یک توسعه دهنده فروشگاه کلید خصوصی خود را از دست بدهد، می تواند هرگز برنامه خود را دوباره به روز کند. آنها باید یک برنامه "جدید" با نام بسته متفاوت منتشر کنند.
انتخاب طرح امضای مناسب برای SDK هدف شما
امضای برنامه بی سر و صدا زیربنای بسیاری از امنیت Android است. هنگامی که رابطه کلید خصوصی/عمومی کلیک شد، میتوانید یک برنامه جانبی را بر اساس شایستگیهای آن قضاوت کنید و تأیید کنید که چیزی که نصب میکنید از زمانی که توسعهدهنده آن را امضا کرده است، تغییر نکرده است. برای اطلاعات بیشتر در مورد داخلی Android، راهنمای فرمت XAPK ما را ببینید.