Saya telah membaca banyak dokumen dan kode yang secara teori akan memvalidasi tanda terima dalam aplikasi dan / atau bundel.
Mengingat bahwa pengetahuan saya tentang SSL, sertifikat, enkripsi, dll., Hampir nol, semua penjelasan yang saya baca, seperti yang menjanjikan ini , saya merasa sulit untuk dipahami.
Mereka mengatakan penjelasannya tidak lengkap karena setiap orang harus mencari tahu bagaimana melakukannya, atau para peretas akan memiliki pekerjaan yang mudah untuk membuat aplikasi cracker yang dapat mengenali dan mengidentifikasi pola dan menambal aplikasi. OK, saya setuju dengan ini sampai titik tertentu. Saya pikir mereka dapat menjelaskan sepenuhnya bagaimana melakukannya dan memberikan peringatan yang mengatakan "modifikasi metode ini", "modifikasi metode lain ini", "hapus variabel ini", "ubah nama ini dan itu", dll.
Bisakah orang baik di luar sana berbaik hati untuk menjelaskan cara memvalidasi secara LOKAL, kwitansi bundel, dan kwitansi pembelian dalam aplikasi di iOS 7 karena saya berusia lima tahun (oke, jadikan 3), dari atas ke bawah, jelas?
Terima kasih!!!
Jika Anda memiliki versi yang berfungsi pada aplikasi Anda dan kekhawatiran Anda adalah bahwa peretas akan melihat bagaimana Anda melakukannya, cukup ubah metode sensitif Anda sebelum menerbitkan di sini. Mengaburkan string, mengubah urutan garis, mengubah cara Anda melakukan loop (dari menggunakan untuk memblokir enumerasi dan sebaliknya) dan hal-hal seperti itu. Jelas, setiap orang yang menggunakan kode yang dapat diposting di sini, harus melakukan hal yang sama, tidak mengambil risiko diretas dengan mudah.
sumber
Jawaban:
Berikut ini adalah langkah-langkah bagaimana saya memecahkan ini di perpustakaan pembelian dalam aplikasi RMStore saya . Saya akan menjelaskan cara memverifikasi transaksi, yang mencakup memverifikasi seluruh tanda terima.
Sekilas
Dapatkan tanda terima dan verifikasi transaksi. Jika gagal, segarkan tanda terima dan coba lagi. Ini membuat proses verifikasi tidak sinkron seperti menyegarkan tanda terima tidak sinkron.
Dari RMStoreAppReceiptVerifier :
Mendapatkan data tanda terima
Tanda terima ada di dalam
[[NSBundle mainBundle] appStoreReceiptURL]
dan sebenarnya adalah wadah PCKS7. Saya payah pada kriptografi jadi saya menggunakan OpenSSL untuk membuka wadah ini. Yang lain rupanya telah melakukannya murni dengan kerangka kerja sistem .Menambahkan OpenSSL ke proyek Anda bukanlah hal sepele. The RMStore wiki harus membantu.
Jika Anda memilih untuk menggunakan OpenSSL untuk membuka wadah PKCS7, kode Anda bisa seperti ini. Dari RMAppReceipt :
Kami akan masuk ke detail verifikasi nanti.
Mendapatkan bidang tanda terima
Tanda terima dinyatakan dalam format ASN1. Ini berisi informasi umum, beberapa bidang untuk keperluan verifikasi (kami akan membahasnya nanti) dan informasi spesifik dari setiap pembelian dalam aplikasi yang berlaku.
Sekali lagi, OpenSSL datang untuk menyelamatkan ketika datang untuk membaca ASN1. Dari RMAppReceipt , menggunakan beberapa metode pembantu:
Mendapatkan pembelian dalam aplikasi
Setiap pembelian dalam aplikasi juga dalam ASN1. Mem-parsingnya sangat mirip dengan menguraikan informasi penerimaan umum.
Dari RMAppReceipt , menggunakan metode pembantu yang sama:
Perlu dicatat bahwa pembelian dalam aplikasi tertentu, seperti barang habis pakai dan langganan tidak terbarukan, akan muncul hanya sekali dalam tanda terima. Anda harus memverifikasi ini tepat setelah pembelian (sekali lagi, RMStore membantu Anda dengan ini).
Sekilas tentang verifikasi
Sekarang kami mendapatkan semua bidang dari tanda terima dan semua pembelian dalam aplikasi. Pertama kita memverifikasi tanda terima itu sendiri, dan kemudian kita hanya memeriksa apakah tanda terima itu mengandung produk transaksi.
Di bawah ini adalah metode yang kami panggil kembali di awal. Dari RMStoreAppReceiptVerificator :
Memverifikasi tanda terima
Memverifikasi tanda terima itu sendiri bermuara ke:
5 langkah dalam kode di tingkat tinggi, dari RMStoreAppReceiptVerificator :
Mari kita telusuri langkah 2 dan 5.
Memverifikasi tanda tangan tanda terima
Kembali ketika kami mengekstraksi data, kami melirik verifikasi tanda tangan tanda terima. Tanda terima ditandatangani dengan Apple Inc. Root Certificate, yang dapat diunduh dari Apple Root Certificate Authority . Kode berikut mengambil wadah PKCS7 dan sertifikat root sebagai data dan memeriksa jika cocok:
Ini dilakukan kembali di awal, sebelum tanda terima diuraikan.
Memverifikasi hash tanda terima
Hash yang termasuk dalam tanda terima adalah SHA1 dari id perangkat, beberapa nilai buram yang termasuk dalam tanda terima dan bundel id.
Ini adalah bagaimana Anda akan memverifikasi tanda terima pada iOS. Dari RMAppReceipt :
Dan itulah intinya. Saya mungkin kehilangan sesuatu di sini atau di sana, jadi saya mungkin kembali ke posting ini nanti. Bagaimanapun, saya sarankan menelusuri kode lengkap untuk lebih jelasnya.
sumber
Saya terkejut tidak ada yang menyebut Receigen di sini. Ini adalah alat yang secara otomatis menghasilkan kode validasi penerimaan yang dikaburkan, berbeda setiap kali; mendukung operasi GUI dan command-line. Sangat dianjurkan.
(Tidak berafiliasi dengan Receigen, hanya pengguna yang bahagia.)
Saya menggunakan Rakefile seperti ini untuk secara otomatis menjalankan kembali Receigen (karena itu perlu dilakukan pada setiap perubahan versi) ketika saya mengetik
rake receigen
:sumber
Ini adalah versi Swift 4 untuk validasi tanda terima dalam aplikasi ...
Mari kita membuat enum untuk mewakili kemungkinan kesalahan validasi tanda terima
Kemudian, mari kita buat fungsi yang memvalidasi tanda terima, itu akan menimbulkan kesalahan jika tidak dapat memvalidasinya.
Mari kita gunakan fungsi pembantu ini, untuk mendapatkan tanggal kedaluwarsa dari produk tertentu. Fungsi menerima respons JSON dan id produk. Respons JSON dapat berisi beberapa info kwitansi untuk produk yang berbeda, sehingga mendapatkan info terakhir untuk parameter yang ditentukan.
Sekarang Anda dapat memanggil fungsi ini dan menangani kasus kesalahan yang mungkin terjadi
Account tab
Do Sign in
Open iTune Connect
Open My App
Open Feature Tab
Open In App Purchase
Click at the right side on 'View Shared Secret'
At the bottom you will get a secrete key
Semoga ini bisa membantu setiap orang yang menginginkannya dalam versi cepat.
sumber