Saya telah mengerjakan arsitektur P2P untuk permainan aman dan saya telah membagi masalahnya menjadi lima sub-masalah:
- Modifikasi yang tidak sah dari status permainan yang dikirim
- Curang curang secara akurat
- Menyetujui kondisi permainan
- Menghindari cheat "lihat ke depan"
- Menyembunyikan informasi sensitif dari lawan
Empat yang pertama saya sudah hampir semua dipecahkan tetapi ini adalah yang terakhir yang saya mengalami kesulitan.
Sebelum saya masuk ke detail saya hanya ingin bertanya apakah ada sesuatu yang saya lewatkan dalam daftar saya membuat jaringan P2P "cheat proof". Saya tidak tertarik dengan cheat seperti menggunakan aimbots, saya hanya tertarik untuk membuat jaringan p2p seaman server terpusat.
Jadi dalam upaya saya sejauh ini untuk menyembunyikan informasi sensitif saya telah fokus pada posisi pemain dalam permainan di mana posisi lawan Anda tidak selalu diketahui. Masalahnya kemudian menjadi bagaimana menentukan apakah Anda harus mengirim posisi Anda ke lawan tanpa mengetahui posisi lawan Anda.
Saya telah mengesampingkan metode seperti lawan yang mengirim beberapa posisi palsu agar Anda dapat membandingkan posisi Anda juga karena lawan Anda dapat dengan mudah menyalahgunakan sistem seperti itu karena ia akan mendapatkan posisi Anda jika salah satu posisi palsu itu "terlihat" dari posisi Anda.
Metode yang saya telah fokus pada satu di mana Anda menerima "bidang visual" dari lawan Anda dan dengan demikian dapat menentukan apakah Anda harus mengirim posisi Anda atau tidak. Namun ini adalah masalah dalam permainan seperti League of Legends di mana bidang visual lawan Anda juga informasi yang sangat sensitif. Saya telah mencoba untuk menyelesaikan ini dengan mengubah bidang visual menggunakan matriks singular yang berarti Anda tidak dapat pergi dari versi yang ditransformasikan dari bidang visual kembali ke versi aslinya, tetapi karena ini adalah transformasi linear, Anda masih dapat mencari tahu apakah posisi Anda ada di dalam bidang visual atau tidak.
Namun ini tidak bekerja dengan sempurna, bidang visual yang tepat tidak dapat dipulihkan setelah transformasi, tetapi informasi tentang "lereng" di bidang visual (bidang visual dibangun oleh beberapa garis, dan kemiringan setiap garis dapat ditentukan) dapat dipulihkan dan ini dapat digunakan untuk merekonstruksi bidang visual asli yang relatif murah.
Pada dasarnya, yang saya butuhkan adalah fungsi yang dapat menentukan apakah suatu posisi "terlihat" atau tidak, dan merekonstruksi fungsi / bidang visual ini harus sangat menuntut komputasi sehingga setelah Anda selesai merekonstruksi bidang visual, tidak lagi relevan untuk game beraksi. Apakah ada orang super pintar di luar sana yang kebetulan mengetahui metode seperti itu?
Sunting Orang-orang agak bingung tentang keseluruhan "bidang visi" jadi saya bertujuan untuk memberikan penjelasan yang lebih rinci di sini. Bidang penglihatan terdiri dari sekelompok kumpulan garis, Anda dapat dengan mudah memeriksa apakah suatu posisi ada di dalam salah satu kelompok ini dengan hanya memeriksa sisi mana dari garis posisi Anda, jika berada di sisi yang sama untuk semua garis dalam grup yang Anda kenal itu di dalam kelompok itu dan dengan demikian di dalam bidang visi.
Namun informasi yang dikirim bukan garis ini, tetapi transformasi garis dan transformasi (2 dengan 2 singular a matrix), Anda masih dapat memeriksa sisi mana dari posisi Anda berada dengan terlebih dahulu mengubahnya menggunakan transformasi yang Anda terima dan membandingkan nilai itu dengan garis yang diubah. Kuncinya di sini adalah bahwa transformasi itu singular, artinya tidak mungkin menemukan invers untuk kembali ke garis asli. Namun dimungkinkan untuk menentukan kemiringan garis yang membuat merekonstruksi garis dengan hanya memeriksa sisi mana dari garis yang ditransformasi itu banyak titik terletak sampai Anda telah menentukan dengan tepat asal muasal garis yang jauh lebih murah secara komputasi daripada jika Anda tidak tahu kemiringan garis.
Apa yang saya cari adalah metode untuk menentukan apakah suatu titik berada di dalam suatu area, di mana merekonstruksi area dari metode tersebut adalah tidak mungkin (yang saya ragu ada karena Anda selalu dapat dengan kasar memaksakannya) atau sangat komputasional.
sumber
Jawaban:
Saya pikir bahwa bahkan jika Anda memiliki algoritma yang tidak dapat diubah untuk bidang visi, orang masih bisa mendapatkan keuntungan dengan menghitung jika titik terdekat mereka akan menghasilkan persimpangan dari lokasi itu dan bidang visual lawan akan berpotongan. Dalam kasus yang buruk (dari bidang visi yang cukup besar untuk memetakan rasio) Anda dapat menghitung dengan proses menghilangkan titik yang tepat dari musuh Anda.
Saya pikir sebagai gantinya mungkin semua rekan yang terhubung harus mengumumkan di bagian peta mana mereka berada, untuk menentukan apakah mungkin jika mereka dapat melihat satu sama lain atau tidak. Pertama-tama pisahkan peta menjadi 2x2 atau 2x2x2 jika dimensi ke-3 penting. Kemudian semua orang saling memberi tahu jika mereka berada di 1,0 1,1 0,1 atau 0,0. Jika mereka tidak berada di kuadran yang sama, percakapan mereka selesai sampai pemeriksaan selanjutnya. Ini melindungi lokasi mereka. Jika mereka ada di kuadran yang sama, mereka akan membagi ruang ini menjadi 4 paha depan baru, dan melanjutkan sampai mereka menentukan bahwa mereka cukup dekat untuk dilihat oleh satu sama lain.
Tentu saja ada masalah dengan batas kuadran, tetapi harus dipecahkan dengan pertanyaan tambahan ke kuadran tetangga.
sumber
Jangan menganggap ini sebagai jawaban yang pasti, topiknya sangat luas (saya tidak akan terkejut jika seseorang menandai pertanyaan Anda yang benar).
Anda dapat menyelesaikannya dengan menggunakan beberapa pemain sebagai server, dan ketika pemain digunakan sebagai server, ia tidak dapat berpartisipasi dalam permainan pemain yang benar-benar memainkan server itu .
Jika permainan Anda tidak terlalu menuntut, Anda bisa juga menjalankan beberapa server dari mesin pemain yang sama (tentu saja itu akan berguna, karena tidak semua pemain dapat berjalan sebagai server karena masalah NAT, terima kasih Anda IPv6 !!).
Masalah utama di sini adalah bahwa karena pemain acak akan digunakan sebagai server, ada sedikit kemungkinan ia akan menjadi pemain "dikompromikan" atau bahwa ia akan meneruskan simulasi ke pemain "dikompromikan", yang memungkinkan informasi sensitif diteruskan ( baik, pada kenyataannya pada saat itu server dapat mengirim data sewenang-wenang dan memaksa menang pula).
Jika Anda menggunakan server pusat untuk memeriksa otorisasi dan login maka Anda dapat mengizinkan untuk mengatur permainan dengan lebih baik dan untuk melarang pemain dengan mudah (namun itu tidak lagi menjadi jaringan P2P murni).
Anda juga bisa membagi dunia menjadi irisan dan menghitung hash dari irisan yang terlihat, tetapi ini bisa dengan mudah diakali, irisan yang terlihat paling umum akan memungkinkan untuk membangun tabel hash dengan cukup cepat.
Bagi saya pertanyaan Anda seperti mencoba mencari fungsi kriptografi. Tes harus cepat, tetapi brute force harus lambat ..
Hal paling sederhana yang muncul di pikiran saya (juga terkait dengan pekerjaan saya) adalah menggunakan beberapa algoritma pengenalan visi cepat (Augmented reality-like).
Jika Anda berhasil membuat "snapshot" cepat dari lokasi Anda (mirip dengan irisan), daripada dapat dikenali hanya ketika ditempatkan di sekitar sesuatu yang terlihat maka Anda akan memilikinya. Terutama jika ada elemen waktunya di peta yang memungkinkan untuk menghasilkan pola pengenalan membuang cepat.
Namun, bahkan jika algoritma tersebut menjadi sangat cepat bahkan di ponsel, saya tidak berpikir itu akan cukup cepat untuk penembak Orang Pertama.
Juga jika Anda membuatnya terlalu cepat, Anda akan memiliki positif palsu! Dan seorang pemain tetap dapat membuat game yang mencoba beberapa "Visual yang umum" sehingga salah satu visualnya cocok dengan algoritma pendeteksian fitur.
Saya tidak akan terkejut bahwa satu-satunya solusi yang mungkin untuk masalah Anda akan mungkin dalam Quantum Computing, dan dalam beberapa tahun seseorang menerbitkan makalah yang memberikan batas intrinsik dalam jaringan P2P.
sumber
Ketika Anda mengatakan 'Menyembunyikan informasi sensitif dari lawan', Anda berarti Anda ingin menghindari orang-orang dengan paket sniffer dari mendengarkan lalu lintas Anda dan mendapatkan info tentang permainan Anda?
Jika demikian, ada jawaban mudah untuk ini; kebanyakan game AAA (dan tentunya game konsol) menggunakan enkripsi. Bahkan, ini sangat umum sehingga banyak middlewares jaringan yang digunakan dalam gim sudah memiliki enkripsi paket bawaan.
Biasanya berfungsi seperti ini: Ketika Anda membuka koneksi ke komputer lain, sebelum soket menjadi aktif, pertukaran kunci terjadi. Saya tahu bahwa di XBox dulu pertukaran kunci Diffie-Hellman; Saya tidak tahu apakah mereka masih menggunakannya sekarang. Kemudian setelah Anda memiliki kunci, semua data yang dikirim dienkripsi menggunakan kunci dan tidak dienkripsi pada tanda terima. Jika seseorang menggunakan sniffer untuk membaca paket Anda, mereka akan terlihat seperti omong kosong dan tidak mungkin mereka dapat mendekripsi mereka karena mereka tidak memiliki kunci. (Peretas tingkat lanjut mungkin bisa mendapatkannya dengan mengakses memori proses dari permainan yang sedang berjalan, tetapi itu jarang dan tidak mungkin.)
Satu-satunya pengecualian pada aturan enkripsi adalah data VoiceChat; menurut undang-undang di AS, obrolan suara harus dikirim secara tidak jelas sehingga CIA dapat mendengarkan jika mereka mau. Konsol biasanya menyediakan cara untuk menandai data suara sehingga tidak dienkripsi.
sumber