Sunucu yazarken giriş ve oyun mantığı nasıl bölünür?


9

Oyun sunucusu gibi bir poker inşa ediyorum, tüm girişlerin ve oyun mantığının tek bir sunucuda ele alınacağını, ancak web'deki araştırmamdan, bunun ölçeklenmeyeceğini ve bölünmenin mantıklı olacağını öğrendim giriş ve oyun sunucuları. Ancak, giriş sunucusunda kimlik doğrulaması yaptıktan ve istemcinin oyun sunucusuna yeni bir bağlantı kurmasını sağladıktan sonra, hangi istemcinin hangisi olduğunu nasıl bilebilirim? Tekrar giriş yapmak ve böylece giriş için bir sunucuya sahip olma amacını ortadan kaldırmak zorunda kalmaz mıydım? Bilmediğim süreçler ve makineler arasında bağlantı kurmanın bir yolu var mı? Küçük ağ bilgimi affedin.


4
YAGNI: Buna ihtiyacın olmayacak. Erken bir optimizasyon uygulamayın. Giriş, oyunun çok önemsiz bir parçası gibi geliyor, bölmenin herhangi bir fayda sağlaması pek mümkün değil; Oyununuz önemsediğiniz yeterli sayıda kullanıcıya sahip olduğunda (tek bir sunucuda 1000 kullanıcıyı destekleyebilmeniz gerekir, diğerleri sadece yedeklilik için), bu tür şeyleri anlayan bazı yazılım mühendislerini işe alabilirsiniz.
MarkR

Yanıltıcı bir yanıtı kabul ettiniz, bunu dikkatlice gözden geçirmelisiniz, yoksa kafanızda yanlış kavramlar ve kodunuzda yanlış bir güvenlik duygusu ile sonuçlanacaksınız.
o0 '.

Kylotan'ın cevabını beğendim, çünkü oyun sunucuları ile giriş sunucusu arasında fazladan bir bağlantım olması gerekmiyor, Philip'in gizli anahtarın güvenliğinin aşılmasının yük getiren tüm hesaplarda bir uzlaşma olduğunu da görebiliyorum. Her iki giriş sürümünü de uygulayacağım ve kodumu denetlediğimde bir güvenlik uzmanına soracağım. Sorum oldukça basit görünüyor ve onların herkesin üzerinde anlaştığı standart bir çözüm olmasını bekledim. Git şekil. Bu tartışmaya yalnızca bir güvenlik uzmanı gelip karar verebilirse.
user342580

Kesinlikle konuşmak gerekirse, oturum açma belirtecini sunucularınız arasında geçirmek daha güvenli ve bunu yapmak için güvenli bir kanalınız var. Ayrıca, yanlış anlama riskinizi artıran uygulanması daha zordur. Karma tabanlı bir mesaj kimlik doğrulama sistemi, birisi gizli anahtarınızı tutamadıkça ve güvenli bir şekilde dahili sistemlerinize erişim yoluyla anahtarınızı tutabiliyorsa, güvenli bir şekilde güvende olmalıdır. elle belirtebilirsiniz.
Kylotan

Yanıtlar:


3

Philipp'in cevabı mükemmel bir şekilde iyi olsa da, giriş sunucusu ile oyun sunucusu arasında bağlantı gerektirmeyen biraz farklı bir yol var, bu böyle bir bağlantı zorsa faydalıdır.

  1. Kullanıcı oturum açma sunucusunda kimlik doğrulaması yaptığında, yukarıdaki gibi bir oyun sunucusu adresi ve bir oturum açma belirteci gönderilir. Ancak bu simge 2 bölümden oluşur: giriş sunucusundaki zaman ve bu numaranın karması artı kullanıcı adı, IP adresleri, oyun sunucusunun IP adresi veya kimliği ve yalnızca bildiğiniz gizli bir anahtar.
  2. İstemci, bu jetonu göndererek sağlanan oyun sunucusunda oturum açmaya çalışır. Sunucu, giriş belirtecindeki bilgilere ek olarak kendi IP adresi / kimliğine ve gizli anahtara göre önceki ile aynı karmayı oluşturur. Bu karma jetondakiyle eşleşiyorsa, oynatıcının doğru şekilde kimlik doğrulaması yaptığını bilirsiniz. Ardından tarihin çok eski olmadığını kontrol edin (örn. 1 dakikadan fazla).

Bu çalışır çünkü:

  • Tarihin sona ermesi nedeniyle kopyalanamaz ve tekrar kullanılamaz.
  • Gizli anahtarı bilmeden yeni bir giriş olmadan inşa edilemez.
  • Başka bir kişi (örneğin bir paket dinleyicisi ile) tarafından kolayca ele geçirilemez ve orijinal IP adresi onu oluşturmak için kullanıldığından kullanılamaz.
  • Kullanıcı adı karmanın bir parçasını oluşturduğundan farklı bir hesap için kullanılamaz.
  • Sunucunun kimliği / IP adresi karmanın bir parçasını oluşturduğundan, farklı oyun sunucularında eşzamanlı oturum açma işlemleri için kullanılamaz.

Veya daha basit bir ifadeyle, karma, gönderenin giriş jetonunu takmasının neredeyse imkansız olmasını sağlar ve böylece jetondaki bilgilere güvenilebilir.

Herhangi bir güvenlik odaklı karma işlemde olduğu gibi, elde edebileceğiniz en iyi karma işlevini kullanın - şu anda insanlar bcrypt, PBKDF2 ve scrypt gibi görünüyor ve kaba anahtar çoğaltmayı daha az pratik hale getirmek için gizli anahtarınızın çok uzun olmasını sağlayın.


Çok zekice, bu çözümü çok tercih ediyorum. Benim sorum o zaman gizli anahtar. Geçiş ifadesi gibi bir şey mi olmalı? Ve her kullanıcı için farklı mı olmalı?
user342580

Bu işe yaramıyor ya da aslında @ Philipp'in cevabının gizli bir yeniden uygulaması. Başarısız olur, çünkü hem oturum açma sunucusunun hem de oyun sunucusunun aynı gizli anahtarı bildiğini varsayar. İkisi de anahtarı biliyorlarsa, biri bunu sağlamak için diğeriyle iletişime geçmelidir. Veya her ikisine de göndermek için üçüncü bir tarafa ihtiyacınız var. Her iki durumda da, eskisi kadar koklanabilir.
o0 '.

@Lohoris, fikir hem giriş hem de oyun sunucusuna sahip olmanız ve onlara gizli anahtarı sağlayabilmenizdir. Her iki sunucuya sahip değilseniz, oyun sunucusu yine de giriş sunucusunun kimlik doğrulamasına nasıl güvenebilirdi?
Kylotan

@ user342580: Bir tür uzun bir cümle kullanırdım. Kullanıcı başına farklı olması gerekmez, ancak eğer olsaydı, bu acıtmaz. Kripto karma işlevi yeterince güçlü olduğu ve periyodik olarak değiştirdiğiniz sürece önemli olmamalıdır.
Kylotan

@Kylotan tam olarak ve onlara anahtarı nasıl sağlıyorsunuz? Sizden sunuculara olan bağlantıyı neden sunucudan sunucuya daha güvenli buluyorsunuz?
o0 '.

8
  1. Kullanıcı kendini giriş sunucusuna doğruladıktan sonra, ona bir jeton (tahmin edilemeyecek kadar uzun, benzersiz, rastgele oluşturulmuş bir dize) verin.

  2. Oturum açma sunucusu bir oyun sunucusu seçer. Simgeyi, kullanıcı adını ve kullanıcıyla ilgili diğer tüm verileri oturum açma sunucusundan seçtiği sunucuya gönderin.

  3. Oyun sunucusunun jetonunu ve ana bilgisayar adını istemciye gönderin. Ardından oturum açma sunucusuyla bağlantısını kesin.

  4. İstemci daha sonra oyun sunucusuna kullanıcı adı ve belirteci ile bağlanır.

  5. İstemcinin belirteci, oturum açma sunucusu tarafından henüz bildirilenle eşleştiğinde, kabul edersiniz.

Bunun güvenli olması için belirteçlerin kriptografik olarak güvenli bir rastgele sayı üretecinden oluşturulması gerektiğini, her belirtecin oyun sunucusu tarafından yalnızca bir kez kabul edilebileceğini ve kullanılmayan belirteçlerin birkaç dakika sonra atılması gerektiğini unutmayın.


Peki bcrypt kullanmak yeterli olur mu? Ben bcrypt kullanarak zaman + kullanıcı adı + şifre karma bir belirteç oluşturmayı düşünüyorum.
user342580

Sanırım olur. Şifreyi bildiğinizde bir belirteç tahmin edilebilir, ancak şifreyi bildiğinizde, normal şekilde giriş yapabilirsiniz.
Philipp

1
bcrypt, girdinin uygun şekilde rasgele ve ölçülemez olduğu sürece çalışır. Sadece zamanı kullanırsanız, saldırgan zamanı tahmin etmeye çalışabilir, sonra bcrypt'i çalıştırabilir ve jetonu alabilir. Zamanla birlikte güvenli bir tuz kullandığınızdan veya güvenli bir randomizer kullandığınızdan emin olun (örn. / Dev / random, UNIX / Linux sistemlerinde).
Sean Middleditch

Parola başka bir sitede ele geçirilmiş olabilir, bu yüzden uygun bir sır olduğunu varsaymaktan kaçınırım.
Sean Middleditch

1
@SeanMiddleditch Parola bozulduğunda, tüm güvenlik yine de kaybolur. Şifreyi alan bir saldırganın bir jetonu tahmin etmek için bir nedeni yoktur, çünkü normal şekilde giriş yaparak sadece bir tane alabilir.
Philipp
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.