امنیت اپلیکیشن موبایل

تفاوت بنیادی امنیت موبایل با وب در یک جمله: اپلیکیشن روی دستگاهی اجرا میشود که شما کنترلش نمیکنید.
فایل نصبی قابل دانلود، باز کردن و بررسی است. ترافیکش قابل شنود است. حافظهاش روی دستگاه روتشده قابل خواندن است.
از این واقعیت، یک قاعده درمیآید که همهٔ تصمیمهای بعدی از آن میآیند.
قاعدهٔ اصلی
هیچ چیزی که در اپلیکیشن است، محرمانه نیست. و هیچ بررسیای که در اپلیکیشن انجام شود، قابل اعتماد نیست.
اپ، یک مصرفکنندهٔ غیرقابلاعتماد از سرویس شماست — دقیقاً مثل مرورگر.
اشتباه رایجی که از نادیدهگرفتن این قاعده میآید: تیمی که بررسی سطح دسترسی را در اپ انجام میدهد چون «کاربر که نمیتواند اپ را عوض کند». میتواند. یا اصلاً اپ را دور میزند و مستقیم به سرویس درخواست میفرستد.
هر بررسی مهمی باید در سرور تکرار شود. بررسی در اپ فقط تجربهٔ کاربری است.
چه چیزی هرگز نباید در اپ باشد
کلید مخفی سرویسهای بیرونی. کلید درگاه پرداخت، کلید سرویس پیامک، کلید سرویس ابری. هر کلیدی که در فایل نصبی باشد، قابل استخراج است — و ابزارهایش عمومی و سادهاند.
اگر اپ باید از سرویسی استفاده کند که کلید میخواهد، درخواست باید از سرور شما رد شود، نه مستقیم از اپ.
منطق کسبوکاری حساس. محاسبهٔ قیمت نهایی، تخفیف، اعتبار. اپ میتواند نمایش دهد؛ سرور باید محاسبه و تأیید کند.
اطلاعات اتصال پایگاه داده. بدیهی به نظر میرسد و هنوز دیده میشود.
توکن را کجا نگه داریم
روی موبایل، پاسخ متفاوت از وب است:
در حافظهٔ امن سیستمعامل — Keychain روی iOS، Keystore روی اندروید. تنها جای درست.
نه در فایل تنظیمات ساده. نه در پایگاه دادهٔ محلی بدون رمزنگاری.
و همان قواعدی که در احراز هویت و SSO گفتیم اینجا هم برقرارند: توکن دسترسی عمر کوتاه، توکن تازهسازی جدا و قابل ابطال.
نکتهٔ خاص موبایل: نشستها طولانیاند. کاربر انتظار دارد ماهها وارد بماند. یعنی توکن تازهسازی شما عمر بلندی دارد و ابطال از سمت سرور، ضروری است — برای وقتی که دستگاه گم میشود.
ارتباط با سرور
فقط HTTPS. و استثنا نگذارید — نه حتی برای محیط توسعه، چون آن استثنا معمولاً به تولید میرسد.
سنجاقکردن گواهی (certificate pinning) برای اپلیکیشنهای حساس. اپ فقط به سروری اعتماد کند که گواهی مشخصی دارد.
اما بدانید چه میخرید: سنجاقکردن، شنود ترافیک را سخت میکند و هزینهاش این است که تمدید گواهی میتواند اپ را از کار بیندازد. اگر این مسیر را میروید، سازوکار بهروزرسانی گواهی و برنامهٔ اضطراری داشته باشید. برای اپلیکیشن مالی و سلامت معمولاً ارزشش را دارد؛ برای اپ فروشگاهی معمولاً نه.
داده روی دستگاه
فقط آنچه لازم است ذخیره کنید. همان اصل کمینهسازی که در امنیت داده بیمار گفتیم.
پایگاه دادهٔ محلی حساس را رمزنگاری کنید.
فایل موقت و کش را پاک کنید. تصاویری که از سرور میآیند و در کش میمانند، گاهی حساساند.
در لاگ چیزی ننویسید که نباید. لاگ اپلیکیشن روی اندروید قابل خواندن است. توکن، رمز و اطلاعات شخصی نباید در لاگ باشند — و این شایعترین نشت واقعی در اپهای ایرانی است که دیدهایم.
اسکرینشات و پیشنمایش چندوظیفهای. سیستمعامل هنگام رفتن به پسزمینه از صفحه عکس میگیرد. برای صفحات حساس، این را غیرفعال کنید.
دستگاه روتشده، و مرزی که همه اشتباه میگیرند
تشخیص روت یا جیلبریک، قابل دور زدن است. همیشه.
پس این را بهعنوان دفاع حساب نکنید. بهعنوان یک سیگنال ریسک ببینیدش: تراکنش از دستگاه روتشده را برای بررسی علامت بزنید، ولی امنیت واقعیتان به آن تکیه نکند.
همین دربارهٔ مبهمسازی کد هم صادق است: زمان مهاجم را زیاد میکند و جلویش را نمیگیرد. مفید است، دفاع نیست.
مرز درست: هر چیزی که واقعاً باید محافظت شود، در سرور محافظت میشود.
ورود و احراز هویت
ورود با موبایل و کد یکبارمصرف عملاً استاندارد بازار ایران است. دو الزام:
- محدودیت نرخ روی ارسال کد. بدون آن، هزینهٔ پیامک شما را کسی به بازی میگیرد.
- مهلت کوتاه و تعداد تلاش محدود.
احراز هویت زیستی — اثر انگشت یا چهره — برای باز کردن اپ خوب است. ولی جایگزین احراز هویت سرور نیست؛ فقط قفل محلی است.
خروج باید توکن را در سرور باطل کند، نه فقط از دستگاه پاک کند.
آنچه در بازار ایران خاص است
اپلیکیشن دستکاریشده. نسخههای تغییریافتهٔ اپ در کانالهای غیررسمی توزیع میشوند — گاهی برای دور زدن پرداخت، گاهی با کد مخرب. دفاع واقعی، همان قاعدهٔ اصلی است: اگر سرور همهچیز را بررسی کند، نسخهٔ دستکاریشده کار خاصی نمیتواند بکند.
پرداخت. اتصال به درگاه باید از سرور تأیید شود. اپی که به پیام موفقیت درگاه در سمت خودش اعتماد کند، قابل فریب است — تأیید نهایی باید سرور به سرور انجام شود.
کتابخانههای قدیمی. بهروزرسانی وابستگیها وقتی دسترسی به مخازن پایدار نیست، سختتر است — و این بدهیای است که خودش رشد میکند، همانطور که در بدهی فنی گفتیم. بهروزرسانیهای کوچک و مکرر، نه جهشهای چندساله.
چکلیست
- هیچ کلید مخفی در فایل نصبی نیست
- هر بررسی مهمی در سرور تکرار میشود
- توکن در حافظهٔ امن سیستمعامل است
- توکن دسترسی کوتاهعمر و قابل ابطال است
- فقط HTTPS، بدون استثنا
- لاگ حاوی داده حساس نیست
- پایگاه دادهٔ محلی حساس رمزنگاری شده
- محدودیت نرخ روی ارسال کد
- تأیید پرداخت سرور به سرور است
- خروج، توکن را در سرور باطل میکند
- وابستگیها بهروزند
اگر یک بند را انتخاب میکنید، بند دوم را انتخاب کنید. بقیه اهمیت دارند و هیچکدام جای آن را نمیگیرند.