Pada dasarnya, Anda memiliki tiga persyaratan:
- seharusnya tidak mudah untuk menggunakan kunci yang sama untuk beberapa instance klien,
- seharusnya tidak mudah untuk menghasilkan kunci yang valid baru, dan
- seharusnya tidak mudah untuk mencuri kunci dari klien yang sah.
Bagian pertama seharusnya cukup mudah: jangan biarkan dua pemain masuk ke server yang sama dengan kunci yang sama secara bersamaan. Anda juga dapat meminta server bertukar informasi tentang pengguna yang masuk, atau menghubungi server authetikasi bersama, sehingga bahkan menggunakan kunci yang sama untuk pemain yang berbeda di server yang berbeda pada saat yang sama akan gagal. Anda mungkin juga ingin mencari pola penggunaan kunci yang mencurigakan dan, jika Anda menentukan bahwa kunci telah bocor, tambahkan ke daftar kunci yang dilarang.
Untuk bagian kedua, salah satu caranya adalah dengan hanya memelihara database dari semua kunci yang dikeluarkan yang valid. Selama kunci cukup panjang (katakanlah, 128 bit atau lebih) dan dipilih secara acak (menggunakan RNG aman), kemungkinan orang mengelola menebak kunci yang valid pada dasarnya nol. (Bahkan kunci yang jauh lebih pendek bisa aman jika Anda menggunakan semacam pembatasan laju pada upaya login yang gagal untuk menghentikan upaya untuk menemukan kunci yang valid dengan kekerasan.)
Atau, Anda dapat membuat kunci dengan mengambil pengidentifikasi unik dan menambahkan kode otentikasi pesan (seperti HMAC ), dihitung menggunakan kunci master rahasia, untuk itu. Sekali lagi, selama MAC cukup panjang, peluang siapa pun yang tidak tahu kunci master untuk dapat menebak MAC yang valid untuk ID apa pun dapat diabaikan. Salah satu keuntungan dari metode ini, selain menghilangkan kebutuhan akan basis data kunci, adalah bahwa pengidentifikasi dapat berupa string unik, dan dapat menyandikan informasi tentang klien yang kunci tersebut dikeluarkan.
Satu masalah dengan menggunakan MAC adalah bahwa server game resmi (atau setidaknya server otentikasi) perlu mengetahui kunci master untuk memverifikasi MAC, yang berarti bahwa, jika server diretas, kunci master mungkin bocor. Salah satu cara untuk mengurangi risiko ini bisa dengan menghitung beberapa MAC untuk setiap ID, menggunakan kunci master yang berbeda, tetapi hanya menyimpan salah satu kunci utama di server game. Dengan begitu, jika kunci master itu pernah bocor dan digunakan untuk menghasilkan ID palsu, Anda dapat mencabutnya dan beralih ke kunci master lain. Atau, Anda bisa mengganti MAC dengan tanda tangan digital , yang dapat diverifikasi hanya dengan menggunakan setengah dari kunci master.
Untuk bagian ketiga, satu pendekatan adalah memastikan bahwa klien tidak akan mengirim kuncinya kepada siapa pun tanpa memverifikasi bahwa penerima benar-benar server resmi yang sah. Misalnya, Anda bisa menggunakan SSL / TLS (atau DTLS ) untuk proses login, mengeluarkan sertifikat khusus untuk server game Anda dan hanya memiliki sertifikat kepercayaan klien yang dikeluarkan oleh Anda. Dengan mudah, menggunakan TLS juga akan melindungi kunci klien (dan data authetikasi lainnya) dari penyadap misalnya di WLAN publik.
Sayangnya, pendekatan ini tidak akan membiarkan server pihak ketiga memverifikasi kunci klien bahkan jika mereka mau. Anda dapat mengatasinya dengan menyiapkan server otentikasi resmi yang dapat digunakan server game pihak ketiga, misalnya dengan meminta klien masuk ke server otentikasi dan menerima token satu kali acak yang dapat mereka gunakan untuk masuk ke server game (yang kemudian mengirimkan token ke server otentikasi untuk memverifikasinya).
Atau, Anda bisa mengeluarkan sertifikat klien yang sebenarnya, atau sesuatu seperti itu, kepada klien Anda. Anda dapat menggunakan protokol yang ada (seperti TLS) yang mendukung otentikasi sertifikat klien (disarankan) atau mengimplementasikan protokol Anda sendiri, misalnya seperti ini:
- Sertifikat klien terdiri dari string ID acak, pasangan kunci publik / pribadi dan tanda tangan digital ID dan kunci publik menggunakan kunci utama.
- Untuk masuk, klien mengirim ID, kunci publik, dan tanda tangan mereka. Server membalas dengan string tantangan unik (lebih disukai termasuk ID server dan cap waktu, yang harus diverifikasi oleh klien), yang ditandatangani oleh klien dengan kunci pribadi (untuk membuktikan bahwa mereka tahu kunci) dan mengirimkan tanda tangan ke server.
- Server memeriksa kedua tanda tangan, membuktikan bahwa kunci publik ID + membentuk kunci klien yang sah (karena mereka ditandatangani dengan kunci master) dan bahwa kunci klien sebenarnya milik klien (karena klien dapat menandatangani tantangan server dengan privat kunci).
(Protokol ini dapat lebih disederhanakan dengan meminta klien membuat "tantangan", yang terdiri dari ID server dan cap waktu, dan menandatanganinya. Tentu saja, maka server perlu memverifikasi bahwa ID dan cap waktu itu valid. Juga perhatikan bahwa protokol sederhana ini, dengan sendirinya, tidak akan menghentikan penyerang tengkulak untuk dapat membajak sesi klien, meskipun akan mencegah mereka dari mendapatkan kunci pribadi klien yang diperlukan untuk login mendatang.)