امنیت و طراحی

زمانی‌ که تصمیم به استفاده از پرداخت درون برنامه‌ای در برنامه‌ٔ خود گرفتید، سعی کنید از راهکارهای امنیت و طراحی‌ که در این سند مورد بحث قرار گرفته است، بهره‌مند شوید. این راهنما برای تمامی‌ افرادی که از سرویس پرداخت درون برنامه‌ای بازار استفاده می‌کنند، پیشنهاد می‌شود.

بهترین راهکارهای امنیتی

عملیات تایید امضا را روی یک سرور انجام دهید

در عمل، شما باید تایید امضا را روی یک سرور و نه روی دستگاه انجام دهید. پیاده سازی فرآیند تایید روی یک سرور، شکستن فرآیند تایید را برای مهاجمان با مهندسی معکوس روی فایل apk مشکل می‌کند. اگر پردازش امنیتی را به سرور خود منتقل کردید، مطمئن شوید که ارتباط بین دستگاه و سرور شما امن است.

از محتوای رمزنگاری نشدهٔ خود محافظت کنید

برای جلوگیری از انتشار غیر قانونی محتوای خود توسط کاربران مخرب، سعی کنید این محتوا را درون فایل apk برنامهٔ خود قرار ندهید، در عوض، یکی‌ از این کارها را انجام دهید:

  • از یک وب سرویس real-time برای انتقال محتوا به برنامهٔ خود استفاده کنید. این کار به شما اجازه می‌دهد که هر زمان که اراده کنید محتوای جدید به کاربر ارائه کنید.
  • از یک سرور برای انتقال محتوا به برنامهٔ خود استفاده کنید.

وقتی‌ محتوا را از سرور یا یک سرویس real-time دریافت می‌کنید، می‌توانید آن را در حافظهٔ موقت دستگاه یا حافظهٔ SD کارت ذخیره کنید. اگر برای ذخیرهٔ محتوا از کارت حافظه استفاده کردید، مطمئن شوید که آن را با استفاده از یک الگوریتم منحصر به همان دستگاه رمزگذاری و ذخیره کرده‌اید.

کدهایتان را obfuscate کنید

 شما باید کد پرداخت درون برنامه‌ای خود را مبهم و به هم ریخته کنید تا کار را برای مهاجمینی که می‌خواهند از طریق مهندسی‌ معکوس پروتکل‌های امنیتی، به محتوا و سایر اجزای برنامه‌تان دسترسی پیدا کنند، سخت کنید. حداقل، ما به شما استفاده از ابزار ابهامی مثل Proguard بر روی کد را پیشنهاد می‌دهیم.

به علاوه، برای مبهم‌سازی کد پرداخت درون برنامه ای‌ به شما تکنیک‌های زیر را پیشنهاد می‌دهیم:

  • رشته‌ها را در زمان اجرا بسازید.
  • از Java Reflection برای فراخوانی متدها استفاده کنید.

استفاده از این تکنیک‌ها تعداد مهاجمین به برنامهٔ شما را کاهش می‌دهد و به تبع باعث افزایش امنیت پیاده‌سازی پرداخت درون برنامه‌ای می‌شود.

نکته: اگر از Proguard برای مبهم کردن کد استفاده می‌کنید،به فایل خود خط زیر را باید اضافه کنید:

keep class com.android.vending.billing

تمام بخش‌های برنامهٔ نمونه را تغییر دهید

برنامهٔ نمونه پرداخت درون برنامه‌ای در دسترس عموم است و می‌تواند توسط هر کسی‌ دانلود شود و این به معنی‌ آسان بودن مهندسی‌ معکوس توسط مهاجمین به برنامهٔ شما است. اگر شما از کد نمونه بطور دقیقا به همان شکلی‌ که منتشر شده است، استفاده می‌کنید، سعی کنید قبل از انتشار برنامهٔ خود آن را تغییر دهید.

مهاجمین عموما به دنبال نقاط شروع و پایان هر برنامه هستند، پس تغییر این بخش از کد‌ها که ممکن است همانند برنامهٔ نمونه باشند بسیار مهم است.

از nonce های تصادفی و امن استفاده کنید

nonce هایی که استفاده می‌کنید نباید قابل حدس زدن باشند یا دوباره استفاده شوند. همیشه از یک الگوریتمم رمزنگاری امن مانند SecureRandom برای تولید nonce ها استفاده کنید. با این کار می‌توانید از درخواست‌های تکراری جلوگیری کنید.

همچنین اگر شما صحت nonce ها را سمت سرور بررسی می‌کنید، مطمئن شوید که آن‌ها را سمت سرور ایجاد می‌کنید.

 برای درخواست خرید حتما از developer payload استفاده کنید

در API نسخه ۳ پرداخت درون برنامه‌ای شما می‌توانید همراه هر درخواست خرید یک developer payload هم به بازار ارسال کنید. این رشته می‌تواند به عنوان یک شناسهٔ منحصر به فرد از سمت شما برای این خرید در نظر گرفته شود. بازار بعد از اتمام مراحل خرید این رشته را همراه با جزئیات پرداخت به برنامهٔ شما بازمی‌گرداند.

شما باید این رشته را برای احراز هویت کاربری که درخواست خرید را داده است به بازار ارسال کنید. برای محصولات مصرف شدنی این رشته می‌تواند کاملا تصادفی ساخته شود، در حالیکه برای محصولاتی که مصرف شدنی نیستند، برای اطمینان از صحت خریده شدن محصول باید از یک رشتهٔ منحصر به فرد استفاده کنید.

وقتی‌ که پاسخ را از بازار دریافت کردید، مطمئن شوید developer payload که بازار همراه با جزئیات خرید به شما بازگردانده است، همانی است که شما برای شروع عملیات پرداخت به بازار ارسال کرده بودید. برای اطمینان از امنیت پیشنهاد می‌شود این عملیات را بر روی سرور خود انجام دهید.

اقدام علیه علامت تجاری و نقض کپی رایت

اگر می‌بینید محتوای شما در حال تکثیر و بخش در برنامه‌های دیگر است، خیلی سریع و قاطعانه این مورد را پیگیری کنید.

مجوز دسترسی کاربران به محتوای خریداری شده را همیشه بررسی کنید

اگر از یک سرور برای تامین محتوای خریداری شده به کاربران خود استفاده می‌کنید، همیشه سعی کنید مجوز دسترسی کاربران به این محتوا را بررسی کنید. بدین صورت می‌توانید هر موقع که احساس کردید دزدی یا درخواست غیر مجازی صورت گرفته است، مجوز آن کاربر را لغو کرده و جلوی دسترسی او را بگیرید.

از کلید عمومی‌ بازار محافظت کنید

برای محافظت کلید عمومی‌ از کاربران مخرب یا هکرها، سعی کنید آن را به صورت رشتهٔ ثابت درون کد قرار ندهید. در عوض، رشته را در زمان اجرا بسازید یا از جابجایی‌ بیت‌ها (مانند XOR با چند رشتهٔ دیگر) برای پنهان کردن کلید اصلی‌ استفاده کنید. کلید خودش اطلاعات محرمانه نیست، اما شما نمی‌خواهید کار را برای هکر‌ها برای جایگزینی کلید عمومی‌ با کلیدی دیگر آسان کنید.