2

サードパーティのクライアントがサーバーにアクセスできないようにしたいクライアント/サーバー iPhone ゲームを構築しています。これには 2 つの理由があります。1 つ目は、私の収益モデルはクライアントを販売し、サービスを提供することです。2 つ目は、不正行為を助長するクライアントの急増を避けたいということです。

私はサーバーの最初のバージョンを Rails で書いていますが、ある時点で erlang に移行することを検討しています。

私は2つのアプローチを検討しています:

  1. 「ユーザー名」(GUID など) を生成し、アプリに付属のシークレットでハッシュ (SHA256 または MD5) し、その結果を「パスワード」として使用します。クライアントがサーバーに接続すると、両方が https 経由の HTTP 基本認証を介して送信されます。サーバーは同じシークレットでユーザー名をハッシュし、それらが一致することを確認します。

  2. iPhone アプリでクライアント証明書を送信します。サーバーは、クライアント証明書が存在することを要求するように構成されています。

最初のアプローチには、シンプルでオーバーヘッドが少ないという利点があり、アプリ内のシークレットを難読化するのが簡単になる場合があります。

2 番目の方法は十分にテストされ、証明されていますが、オーバーヘッドが高くなる可能性があります。ただし、クライアント証明書に関する私の知識は、「デルタ航空の機内誌で読む」レベルです。これにより、どのくらいの帯域幅と処理のオーバーヘッドが発生しますか? リクエストごとに転送される実際のデータは、キロバイトのオーダーです。

4

3 に答える 3

3

完璧な方法はありませんが、チャレンジ/レスポンスはキーよりも優れています。

証明書は、チャレンジ/レスポンスを使用する必要があります。ランダムな文字列を送信し、証明書の秘密鍵を使用して暗号化し、それを取得して公開鍵で復号化します。

それらが iPhone でどれだけサポートされているかにもよりますが、その実装は些細なものから挑戦的なものまでさまざまです。

私が使用する良い中道は xor です。パスワードよりもわずかに安全で、簡単に実装でき、ハッキングには少なくとも 1 時間か 2 時間かかります。

  1. アプリには番号が組み込まれて出荷されます (キー)。
  2. アプリがあなたに接続すると、乱数 (キーと同じビット数) を生成し、電話に送信します。
  3. アプリは番号を取得し、キーで xor して結果を返します。
  4. サーバーでは、返された結果をキーで xor します。これにより、元の乱数が得られます。

これはハッカーに対してわずかに耐性がありますが、ソフトウェアを更新するたびにキーを変更したり、乱数を他の乱数で隠したりするなど、他の手法を使用してより良いものにすることができます。これを隠すには多くのトリックがあります。しかし、最終的にはハッカーが見つけます。更新ごとに方法論を変更すると役立つ場合があります。

とにかく、xor はハックですが、パスワードの送信が少しだけハッキング可能な場合に有効です。

xor と公開鍵の違いは、xor は成功した会話を監視するだけで簡単に元に戻すことができることです。公開鍵は (理論的には) かなりのリソースと時間がなければ元に戻すことができません。

于 2009-12-16T23:57:03.030 に答える
2

ここであなたの敵は誰ですか?どちらの方法でも、クラックされたアプリケーションのコピーがサーバーに接続するのを防ぐことはできません。これは、有料アプリ向けの iPhone ゲーム (または一般的な) 開発で最も一般的な問題だと思います。

ただし、これにより、プログラマーが iPhone とサーバー間のネットワーク パケット インターフェイスをリバース エンジニアリングするのを思いとどまらせるため、iPhone 以外の他のクライアントからサーバーを保護することができます。

于 2009-12-16T23:06:37.923 に答える
0

ゲーム ユーザーにOAuthを使用してアカウントを認証させ、サーバー上でゲームの状態を変更する権限を与えます。

ユーザーを認証できない場合は、何らかの方法でゲーム アプリケーション インスタンスを認証する必要があります。アプリケーションの著作権侵害が蔓延しており、メソッドの安全性が非常に低くなるため、認証資格情報をバイナリに埋め込むことはお勧めできません。Apple iPhone アプリケーションの著作権侵害を制限する方法に関する私の SO の質問は、他の方法で役立つかもしれません。

于 2009-12-17T00:24:45.460 に答える