Soketler aracılığıyla çok oyunculu bir oyun için kimlik doğrulama


11

Üzerinde çalıştığım yeni çok oyunculu oyun için özel bir ikili protokol uyguluyorum. Bu sıra tabanlı bir strateji oyunu, bu yüzden zamanlama gerçekten önemli değil. Şu anda sistemin temel veri senkronizasyonu bölümünü tamamladım ve kullanıcı girişi / oturumu kapatma ve şifrelemenin genellikle MMORPG oyunları veya benzeri için nasıl yapıldığını merak ediyordum.

  • Giriş sırasında güvenli / gizli şifre aktarımı için bir plan önerebilir misiniz? (Diffie-Hellman anahtar değişimi?)
  • Veri paketleri için nasıl güçlü şifreleme uygularım? (AES 128-bit? .. ya bu hangi düzeni sonrası "Eğer crack muhtemeldir daha güçlü şifreleme" olarak atıfta)
  • Saldırıları, geçersiz veri paketlerini ve benzerlerini yeniden oynatmak için oyun sunucusunu sertleştirmeye yardımcı olan datagram format şemaları var mı?

Yanıtlar:


15

Yanıtlar

  • SRP - Güvenli Uzaktan Şifre - Bu, Diffie-Hellman'a dayanmaktadır. Buradaki fikir, şifreyi veya türetmek için kullanılabilecek herhangi bir bilgiyi aktarmadan karşılıklı bir şifre kontrolü yapabilmenizdir. Tel üzerinden güvenli olmasına rağmen , sunucunuz bunları asla düz metin olarak saklamaması gerektiğinden , şifrelerinizi mutlaka karmalı ve tuzlamalısınız .
  • SRP'nin avantajı, tamamlandıktan sonra, bir saldırganın aktardığınız veriler göz önüne alındığında çıkartamayacağı karşılıklı olarak müzakere edilen bir şifreleme anahtarı vermesidir. Bu, kullanıcının kimliği doğrulandıktan sonra simetrik bir şifreleme algoritması (AES gibi) kullanabileceğiniz anlamına gelir.
  • Üstünde kendi güvenilir / sıralı (bağlantı odaklı) uygulamanızla UDP kullandığınızı varsayarsak, 'paket sıra numarası' da dahil olmak üzere tüm UDP oynatma yükünü şifreleyin. Sisteminiz doğru tasarlanmışsa, tekrarlanan mesajları otomatik olarak reddeder ve bir davetsiz misafir, şifrelenmiş olduğu için paket sıra numarasını değiştiremez (bu nedenle bir tekrar mümkündür - ancak otomatik olarak yok sayılır).

Düşünceler

Kimlik doğrulamanız güvenli olmalı mı? Kesinlikle. Bir şifre söz konusu olduğunda güvenlik açısından taviz vermeyin. Bu yüzden cevabımdaki ilk mermiyi kesinlikle düşünmelisiniz.

Verileriniz güvenli olmalı mı? Sadece bir oyun içi satın alma / mikro işlem ise ve neden sadece HTTPS gibi denenmiş ve gerçek bir şey kullanmıyorsunuz? Oyun trafiğinizi şifrelemek, aşağıdaki nedenlerden dolayı geçerli bir çözüm değildir:

  • Tam bir paranoyadır.
  • (Pahalı) donanım şifreleme modülleri satın alamazsanız, sunucunuza CPU zaman ek yükü ekleyecektir.
  • Tel üzerinden verileriniz için ne kadar güvenlik sağladığınız önemli değildir - birisi istemci sürecini ele geçirebilir ve mesajları şifrelenmeden ve gönderilmeden hemen önce kesebilir. Bu sadece bir olasılık olmakla kalmaz, aynı zamanda yakalanan paketlere kıyasla kod enjekte etmek çok daha kolaydır. Hile önleme için bunu yapıyorsanız, tamamen ve tamamen zamanınızı boşa harcıyorsunuz.
    • Parola güvenliği açısından maalesef kaçırılmış bir sistem hakkında makul bir şekilde yapabileceğiniz hiçbir şey yoktur, istemci düşmanca hale gelmiştir. Blizzards WoW dongle'ları bununla başa çıkmak için tasarlanmıştır - ama bunun ne kadar güvenli olduğundan emin değilim (özellikle takılı halde bırakırsanız).

Hile önleme için şifreleme yapıyorsanız lütfen bırakın. Kısa geleceksiniz - Olmamanız durumunda size bilgi verdim. Paketleri, paketteki ilk bayt ile seçici olarak şifreleyebileceğinizi ve geri kalanının şifrelenip şifrelenmediğini gösterebileceğinizi unutmayın: kredi kartı işlemleri gibi şeyler yapmanız gerekiyorsa bir kez daha HTTPS'ye bağlı kalacağım: son derece nadir ve HTTPS, sizin veya benim tasarladığınız bir şeyin aksine, uzmanlar tarafından tasarlanmıştır.

Tüm bunlar, Blizzard'ın aslında WoW trafiğini şifrelediğini söyledi . Bunun kırılmasının temel nedeni, büyük olasılıkla tam bir amatör olan bir kişinin, evde yetiştirilen bir şifreleme algoritmasında ellerini denemeye karar vermesidir; bu gerçekten iyi bir şekilde ortaya çıktı . Endüstri standardı algoritmalar kullansanız bile, birisinin kodunuzu tersine mühendislik ve benzetmesi için iyi bir şans vardır - istemci parolasını girdikten sonra desteklenmeyen bir sistemin bağlı olduğunu söylemez.


2
Hile önleme için veri paketlerinin şifrelenmesinin yararsız olduğunu söyleyen +1. OP: doğrularım herşeyi istemci istenen eylem mümkün olup olmadığını, çek silah aralıkları, hareket hızı vb istemci gelen, koşmak mantıklı denetimleri, bir kez daha kontrol ama o kadar müşterinize güvence zaman kaybetmeyin olacak eğer saldırıya uğruyor oyununuz buna değer. Bazı MMO şirketleri, müşterilerini / protokollerini şifreliyor ve gizliyor ancak hile yapmayı önlemek değil, örneğin bot yaratıcılarının iyi sonuçlar almasını zorlaştırıyor ve hatta bu, özel uzman ekipler tarafından yapılıyor.
Gilead

1
Üçüncü cevap hakkında bir küçük kelime oyunu: Birçok şifreleme düzenleri en azından biraz çünkü sadece paketleri şifreleyerek, oynanmasını engellemek için yeterli olmayabilir dövülebilir . Mesaj bütünlüğünü korumak için bir MAC veya kimliği doğrulanmış bir şifreleme moduna ihtiyacınız vardır .
Ilmari Karonen

+1 Çok eksiksiz bir cevap için teşekkür ederim. Şu anda SRP'nin uygulanmasına bakıyoruz. Parolalar için kullanılan karma işleviyle ilgili önerileriniz nelerdir? MD5? Böyle bir kullanım durumu için OTR protokolü (Kayıt Dışı) nasıl olurdu? SRP yerine auth / kripto için iyi çalışır mı? SRP kullanmam durumunda, aşağıdaki "kimlik doğrulamalı şifreleme" modlarından birini kullanmam gerekir mi? (OCB 2.0, Anahtar Sarma, CCM, EAX, Şifreleme-sonra-MAC ve GCM)
Robinicks 15:12

1
@Jenko, SHA algoritma ailesini kullanıyor (muhtemelen SHA1) - bu günlerde MD5'ten kaçınmalısınız. OTR gerçekten bakmanız gereken bir şey değil - güvenli / belirsiz (aslında birisi paketleri daha kolay taklit edebilecek şekilde tasarlanmıştır) değil, aynı zamanda anlık mesajlaşma ve makine iletişimi için tasarlanmıştır. Bu modlardan hiçbirine gerek yoktur, sadece SRP kullanın: karşılıklı olarak müzakere edilen simetrik bir anahtarınız olduğunda, bir şeyi şifreleyebilmek, doğru üçüncü tarafla konuştuğunuzun garantisidir. Ayrıca, son iki paragrafımı tekrar okudum.
Jonathan Dickinson

1
Aslında, daha da iyi bir önerim var: UDP uygulaması üzerinden mevcut bir DTLS kullanın ve kendi çözümünüzü oluşturmaya çalışmayın. Size zaman kazandıracak ve kendi datagram şifreleme katmanınızı tasarlamaya çalıştığınızda yanlış anlaşılması kolay birçok küçük ama kritik ayrıntı var.
Ilmari Karonen

2

Bence Jonathan'ın aksi takdirde mükemmel cevabına yaptığım son yorum , kendi cevabının bir cevabı haline gelmeye değer:

Çok fazla kripto deneyiminiz yoksa, önleyebiliyorsanız, kendi şifreleme katmanınızı tasarlamaya çalışmamalısınız. Eğer varsa yapmak kripto deneyimi çok şey var, bunu önleyebilirsiniz eğer kendi şifreleme katmanı tasarlamak için daha iyi bilmeli.

Bunun yerine, ihtiyacınız olanı yapan mevcut, standart ve iyi test edilmiş bir kripto kütüphanesi bulmaya çalışın. Senin durumunda, ben tavsiye ederim gnutls , Wikipedia göre , her ikisini de sağlar TLS SRP kimlik doğrulaması ( RFC 5.054 ) ile güvenli UDP iletişimi DTLS ( RFC 6347 ). Birincisi oturum açmaya özen gösterirken, ikincisi bu şekilde oluşturulan güvenli kanalı hem gizli dinleme hem de aktif saldırılardan korur ve hatta sizi tekrar saldırılarından koruyabilir .


TCP kullanıyorum. Bu, belirli bir müşteri için çok farklı bir oyun türüdür. Kumar oynamaya / bahis oynamaya benzer şekilde, süreci kaçırmak için kullanılabilecek tüm bilgiler evin gereksiz kayıp şansını arttırır. Verileri son derece güvenli tutmalıyız, çünkü bu durumda bilgi paradır.
Robinicks

Tamam, TCP kullanıyorsanız, daha da kolaydır: DTLS yerine normal TLS 1.2'yi kullanabilirsiniz, bu da size daha fazla seçenek sunar. Yine de GnuTLS kütüphanesini tavsiye ederim.
Ilmari Karonen

Biraz araştırma yapacağım ve hem istemci hem de sunucu tarafında TLS kaynak koduna başvurabilir miyim ve protokolümü ne yaptığına dayandırabilirim. Bu yeterince güçlü olur mu? Temelde bazı şifreleme / mod ile sadece paket şifreleme, doğru mu?
Robinicks

Hayır, TLS protokolünde bundan biraz daha fazlası var. Bu yüzden kendi kütüphanenizi yuvarlamak yerine onu uygulayan standart bir kütüphane kullanmak istiyorsunuz.
Ilmari Karonen
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.