(Yarı) Flaş / PHP oyunda yüksek puanlar sabitlemek için Öneriler

6 Cevap php

... Ben çeşitli yöntemler tartıştık burada birkaç konuları okudum ve sadece biz ile geldi önerilen çözüm üzerinde bazı geribildirim arıyordum. Konuları birinde bir açıklama geliyordu büyük bir kamu / özel anahtar tavsiye yayınlanmıştır, bu ne düşünüyordun olduğunu ...

Client Side - 1. Key is stored inside of Flash swf which is encrypted using 3rd party tool. 2. High score is hashed along with high-score value (EX: md5 ('ourSecretKey' + 200)) 3. This value is sent via AMF to a PHP script on the server, along with the high-score (200)

Server Side - 1. Server receives data and hashes the passed high-score (200) + secret key ('ourSecretKey' stored on the server as well as in Flash) and checks against the passed hash if the value is a match it allows the high-score to be entered, else FAIL.

Ben bu kusursuz bir çözüm değil biliyorum ama bu kabul edilebilir olacaktır? Ben bu basit bir online Flash oyun için yüksek puan formunda yeterli güvenlik olurdu? Düşünceler?

Şimdiden teşekkürler!

6 Cevap

Bir gülünç kısa bir değer için (Örn: değerler <64 karakter), bir karma olarak MD5 nedeniyle gökkuşağı tablo saldırılara etkisiz hale gelir ve gönderme konum değeri tel üzerinden paylaşılacak gibi, onlar yapmak zorunda kaba kuvvet paylaşılan gizli (ve onlar ile çalışmak için bilinen bir ürün var)

Gibi, ortak anahtar özel anahtar thats değil. Onun mererly paylaşılan gizli.

Ayrıca, akılda bu paylaşılan gizli tutmak bu gün ve trivially sökülüp ve daha sonra "gizli" bir daha bir sır değil kullanıcı göndermek flash dosyasında olacaktır.

Sen yeni bir işareti anahtar sunucudan her oyun için atanan uygun kripto imzalanması, ve birden puanları ile bir daha meydan-tepki mekanizması aynı işareti anahtarla teslim edilemez istiyorum. (Ekstra koruma için ;))

  1. Kullanıcı oyun başlatır. İşaret anahtarı talep edilmektedir. (Oturum anahtarı onlar erişimi edemem başka bir anahtar üretilir).
  2. Puan işaret tuşu ile imzalanan ve daha sonra gönderilir
  3. Eğer onları gönderilen anahtar ile işaretinin değerini doğrulayın.
  4. Eğer onları gönderdi işareti tuşuna atın.

Ancak, still Eğer tahrif ediliyor, gerçek puanlama sistemi önlemek için hiçbir yolu yoktur sorun var. Yeterince akıllı biri sadece ters SWF nesnesi mühendis ve sadece kendi seçtikleri değere puan ayarlar yeni kodu enjekte edebilir.

Sorunuzun cevabı bağlıdır vardır. Bu oyunun tahmini popülerlik esas olarak bağlıdır.

Güvenlik açısından, çözüm düz yazı puanlar gönderme gibi yaklaşık olarak güvenlidir. Burada ne yapıyoruz dinlemek kim göre bazı durumlarda faydaları olabilir, bilinmezlik, güvenlik denir. Bu durumda Joe ortalama kullanıcı olasılıkla bunu kendisi çatlamak mümkün olmaz muhtemelen. Size skillz bazı l33t h4xxor olan herkes için de düz yazı olarak tüm gönderebilir. Istediğiniz tüm Joe durdurmak için ise, o zaman birisi oyunun popülerliğine bağlı olarak birkaç gün bir şey alabilir (ki indirmek Joe için sahte bir müşteri oluşturur, en azından kadar yeterli muhtemelen asla (veya daha hızlı ise WoW)).

Daha iyi bir çözüm @ Kent Fredric tarafından verilen biridir. O birisi sahte bir müşteri yaratma sorunu çözmüyor diyor Ancak olarak. Buna bir çözüm böyle bir şey olabilir:

  1. Bir oyuncu bir kimliği gerçekleştirebilirsiniz her eylem verin.
  2. Oyuncu kimlikleri bir listede gerçekleştiren her eylem saklayın.
  3. Oyun karma üzerinde puan olduğunda, eylemlerin listesi ve genel anahtar ile şifrelemek sunucudan alınan. (Bu konuda ayrıntılı bilgi için Kent Fredric adlı yazı bakın)
  4. Birlikte skoru gerçekleştirilen eylemlerin and liste ile sunucuya (daha yaygın dijital imza denir) şifrelenmiş karma gönderin.
  5. Listede eylemlere göre sunucu "oyun" oyun olsun.
  6. Aynı puanı elde doğrulayın.
  7. Dijital imza doğru olduğunu doğrulayın.
  8. Sunucu yüksek puanlar listesi güncelleyin.

Bu iki şey garanti edecek:

  1. Skoru doğru müşteri gelir.
  2. Puan oynanan oyuna açısından doğrudur.

Ama bu düzeni için ciddi bir kusur hala var. Oyun aslında aslında oynadığı olduğunu bilmenin hiçbir yolu yok. Istemci tehlikeye ise, liste sadece sunucuya gönderilen bir "mükemmel bir oyun" bir prefabrik olabilir. Doğrudan skorlama sistemi kurcalamak mümkün değil, ama yeterince çaba ile birisi büyük olasılıkla bir "mükemmel bir oyun" oluşturan eylemlerin bir listesini oluşturmak mümkün olacak.

Ancak biraz sadece Kent Fredric adlı sonrası çözümü kullanarak daha güçlü garantisi veriyor. Bütün sorunu çözmek için bir şekilde müşteri doğrulamak gerekir anlamına gelir. Bunu yapmanın en kolay yolu atlatılabilir çünkü bu çok zordur.

Sonunda ben sadece karma algoritması seçtiğiniz yorum vardı: MD5 hala doksanlı yıllarda yaşayanlar için büyük bir karma algoritma. Bizi geri kalanı için ben SHA-2 ya da en azından SHA-1 öneririz.

Oyunun dağıtımı sınırlıdır ve kazanmak için oyuncular için dahil hiçbir gerçek para / ödül varsa, özgün düzeni muhtemelen yeterli.

SWF Encrypt kullanma olasılığı o biraz daha zor anahtarını çıkarmak için yapacak ve aynı zamanda da daha gelişmiş bir sistem olarak kullanmak için iyi bir araç olabilir. Ama bir gerçek kamu / özel anahtar düzeni (örneğin RSA) varsa ortak anahtar bir sır değil, çünkü o gerçekten tartışmalı bir nokta, olması gerekiyordu değil. Hala kodunu düzenleyerek çoğu engellemek ve puanlama sistemi ile kurcalamak, SWF Encrypt muhtemelen yeterince iyi bir seçimdir.


Sadece biraz daha paranoyak yapmak için ben de şunları yazmıştır:

SWF Encrypt ile sorun, çoğu diğer benzer araçlar ile olduğu gibi, yine bir (muhtemelen tehlikeye) makinede komut dosyası çalıştırmak mümkün olmasıdır. Bu nedenle tüm bilgilerin dedi makinede mevcut olmalıdır. Mesaj gönderme, kriptografi klasik kullanımı ile karşılaştırın:

Şifreli bir mesaj gönderdiğinizde, genellikle bu nedenle bu iki mesajın şifresini çözmek için anahtarı var, kaynak ve hedef güveniyorum. Ne güvenmiyorum kurye, ya da en azından düşman kurye müdahale olmayacak olmasıdır. Yani kurye onlar anahtar yoktur ve mesaj güvenlidir.

Senin sorunun sizin durumunuzda tersi hedef (siz) ancak kaynak (istemci) güven ya da yerine bir. Hala kaynak bile az kurye güven beri mesajı şifrelemek gerekiyor. Yani kaynak çalışması için mesajları şifrelemek ve şifresini çözmek için tüm bilgiye sahip olması gerekir. Senin sorunun "iyi" kaynağı ve "kötü" bir kaynağı arasındaki farkı göremiyorum ki.

Ne demek kod hala bir istemci üzerinde çalıştırmak mümkün olmalıdır beri muhtemelen örtülü biçimde de olsa, bunu yapmak için bilgi, tamamen mevcut olmasıdır. Bir hacker Örneğin okunabilir bir şey karartılmış ActionScript kodunu dönüşümü kendi ActionScript derleyicisi oluşturmak ve gerekli değişiklikleri yapabilir. Zor ama kesinlikle yapılabilir.

Eğer sınırlı bir dağıtım ve kazanmak için gerçek bir ödül varsa henüz sofistike saldırıların bu düzeyde büyük olasılıkla, sizin için bir sorun olmayacaktır.

Blockquote Finally I just had to comment on your choice of hash algorithm: MD5 is a great hash algorithm for those still living in the nineties. For the rest of us I recommend SHA-2 or at least SHA-1.

Bah Ben yerine SHA bahsettiğim gerektiğini biliyordum :)

Ben şifrelemek için bir swf encrypter uygulaması gibi bir şey kullanmak istemiyorsanız swf kod en azından Flash saklanan anahtarına ulaşmak için bu biraz daha zor hale olmaz? O tuşu (ya da en azından kolayca almadan) olmadan sunucuya kapalı gönderilir karma oluşturmak için kullanılan edildiğini anlamaya büyük bir acı olacağını düşünürdüm.

Böyle bir şey aklımdan ne: SWF Encrypt

Bu cevaplar için tekrar hepinize teşekkür ederim, bu inanılmaz faydalı. Oh ve bu sadece müşterilere bir istemci tarafından gönderilen basit bir Flash oyun, tatil boyunca iş yerinde vakit geçirmek için eğlenceli bir şey olacak.

Vay

Oldukça sert çözümleri 8).

Eskiden böyle bir sistemi hayata. O orada her oyun için `t iş kazandı rağmen ...

Sen sunucuda oyunu yeniden gerekir. "Devlet değişiklikleri" depolamak ve sonra sadece "replay" modunda bir tür size oyunda onu beslemek - Ne zaman kullanıcı oyun.