پرداخت درون‌برنامه‌ای بازار  

ملاحظات امنیتی

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


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

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


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

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

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

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


کدهایتان را مبهم و به هم ریخته کنید

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

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

  • متدها را درون متدهای دیگر قرار دهید (Inline methods).
  • به جای اینکه رشته‌ها را به صورت ثابت تعریف کنید آن‌ها را در زمان اجرا بسازید.
  • از Java Reflection برای فراخوانی متدها استفاده کنید.

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

نکته: اگر از Proguard برای مبهم کردن کد استفاده می‌کنید، بایستی خط زیر را به فایل تنظیمات Proguard اضافه کنید:
keep class com.android.vending.billing


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

اگر از کدهای برنامهٔ نمونهٔ پرداخت درون برنامه‌ای (TrivialDrive) برای پیاده‌سازی پرداخت درون‌برنامه‌ای استفاده کرده‌اید لطفاً توجه داشته باشید که این برنامه در دسترس عموم است و می‌تواند توسط هر کسی‌ دانلود شود. این امر به معنی‌ این است که مهندسی‌ معکوس برنامهٔ شما توسط مهاجمین آسان‌تر خواهد شد. اگر شما از کد نمونه دقیقاً به همان شکلی‌ که منتشر شده است استفاده می‌کنید، سعی کنید قبل از انتشار برنامهٔ خود، آن را تغییر دهید. برای مثال می‌توانید نام مِتد‌های درون کلاس‌های کمکی موجود در پوشهٔ util را تغییر دهید. همچنین از آن‌جایی که مهاجمین عموماً به دنبال نقاط شروع و پایان شناخته شدهٔ هر برنامه هستند، تغییر این بخش از کد‌ها که همانند برنامهٔ نمونه هستند بسیار مهم است.


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

nonce هایی که استفاده می‌کنید نباید قابل حدس زدن باشند یا دوباره استفاده شوند. همیشه از یک الگوریتم رمزنگاری امن مانند SecureRandom برای تولید nonce ها استفاده کنید. با این کار می‌توانید از حملات replay یا playback جلوگیری کنید.
همچنین اگر صحت nonce ها را سمت سِرور بررسی می‌کنید، حتماً آن‌ها را سمت سِرور ایجاد کنید.

یادآوری: nonce در بحث امنیت عدد اختیاری است که تنها یک مرتبه در یک ارتباط رمزنگاری شده استفاده می‌شود. اغلب یک عدد تصادفی یا شبه‌تصادفی است که در پروتکل احرازهویت می‌آید (برای اطمینان از این که ارتباطات قبلی نمی‌توانند در حملات replay مجدداً استفاده شوند).


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

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

توجه: از آن‌جایی که برنامهٔ شما به اطلاعات حساب کاربر در بازار دسترسی ندارد، در این‌جا منظور کاربر برنامهٔ خودتان است (البته در صورتی که در برنامه‌تان امکان ایجاد حساب کاربری وجود داشته باشد).

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


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

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


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

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


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

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