1

...ここでいくつかのスレッドを読んで、さまざまな方法について議論し、私たちが思いついた提案されたソリューションに関するフィードバックを探していました。スレッドの 1 つで、公開/秘密鍵を推奨するコメントが投稿されました。

クライアント側 - 1. キーは、サードパーティ ツールを使用して暗号化された Flash SWF 内に保存されます。2. ハイスコアは、ハイスコア値とともにハッシュされます (例: md5 ('ourSecretKey' + 200)) 3. この値は、ハイスコア (200) とともに、AMF を介してサーバー上の PHP スクリプトに送信されます。

サーバー側 - 1. サーバーはデータを受信し、渡されたハイスコア (200) + 秘密鍵 (サーバーとフラッシュに保存されている「ourSecretKey」) をハッシュし、渡されたハッシュに対して値が一致するかどうかをチェックします。入力するハイスコア、それ以外の場合は FAIL。

これが絶対確実な解決策ではないことはわかっていますが、これは受け入れられるでしょうか? これは、単純なオンライン Flash ゲームのハイスコア フォームで十分なセキュリティでしょうか? 考え?

前もって感謝します!

4

7 に答える 7

7

とてつもなく短い値 (例: 値 < 64 文字) の場合、ハッシュとしての MD5 はレインボー テーブル攻撃のために無効になり、送信している値はネットワーク上で共有されるため、彼らがしなければならないことは総当たりです。共有秘密 (そして、彼らは動作する既知の製品を持っています)

そのため、それは公開鍵と秘密鍵ではありません。その単なる共有秘密。

また、この共有シークレットは、ユーザーに送信するフラッシュ ファイルに含まれることに注意してください。最近では、これは簡単に分解され、「シークレット」はもはやシークレットではありません。

サーバーからのすべてのゲームに新しい署名キーが割り当てられ、同じ署名キーで複数のスコアを送信できない、適切な暗号署名を備えたより多くのチャレンジ/レスポンス メカニズムが必要です。(特別な保護のために;))

  1. ユーザーがゲームを開始します。署名キーが要求されます。(署名キーは、アクセスできない別のキーから生成されます)。
  2. スコアは署名鍵で署名されて送信されます
  3. 送信したキーで署名の値を確認します。
  4. 送信した署名キーは破棄します。

ただし、実際の採点システムが改ざんされるのを防ぐ方法がないという問題がまだ残っています。賢い人なら、SWF オブジェクトをリバース エンジニアリングして、スコアを選択した値に設定するだけの新しいコードを挿入できます。

于 2008-11-19T20:45:26.530 に答える
4

あなたの質問への答えは、場合によります。これは主に、ゲームの推定人気に依存します。

セキュリティの観点からは、ソリューションはハイスコアを平文で送信するのと同じくらい安全です。あなたがここで行っていることは、あいまいさによるセキュリティと呼ばれます。聞く相手によっては、場合によってはメリットがあるかもしれません。この場合、平均的なユーザーである Joe が自分でクラックできる可能性は低いでしょう。l33t h4xx または skillz を持っている人は、すべてクリアテキストで送信することもできます。ジョーを止めたいだけなら、少なくともジョーがダウンロードするための偽のクライアントを誰かが作成するまでは、おそらく十分です (ゲームの人気によっては、数日かかる場合もあれば、ダウンロードしない場合もある場合もあります)。おお))。

より良い解決策は、@Kent Fredric によって提供されたものです。ただし、誰かが偽のクライアントを作成するという問題は解決しません。それに対する解決策は、次のようなものかもしれません。

  1. プレイヤーが実行できるすべてのアクションに ID を与えます。
  2. プレイヤーが実行するすべてのアクションを ID のリストに保存します。
  3. ゲームが終了したら、スコア、アクションのリストをハッシュし、サーバーから受け取った公開鍵で暗号化します。(詳細については、Kent Fredric の投稿を参照してください)
  4. 暗号化されたハッシュ (より一般的にはデジタル署名と呼ばれます) を、スコアと実行されたアクションのリストと共にサーバーに送信します。
  5. リスト内のアクションに従って、サーバーにゲームを「プレイ」させます。
  6. 同じスコアが達成されたことを確認します。
  7. デジタル署名が正しいことを確認してください。
  8. サーバーのハイスコア リストを更新します。

これにより、次の 2 つのことが保証されます。

  1. スコアは正しいクライアントから取得されます。
  2. プレイしたゲームに関して、スコアは正しいです。

しかし、このスキームにはまだ重大な欠陥が 1 つあります。ゲームが実際に実際にプレイされたことを知る方法はありません。クライアントが侵害された場合、リストはサーバーに送信される「完璧なゲーム」のプレハブにすぎない可能性があります。採点システムを直接改ざんすることはできませんが、十分な努力をすれば、誰かが「完璧なゲーム」を構成するアクションのリストを作成できる可能性が高くなります。

ただし、Kent Fredric の投稿のソリューションを使用するよりも、少し強力な保証が得られます。問題全体を解決するには、何らかの方法でクライアントを検証する必要があります。これを行うほとんどの方法は簡単に回避できるため、これは非常に困難です。

最後に、ハッシュ アルゴリズムの選択についてコメントしなければなりませんでした。MD5 は、まだ 90 年代に生きている人々にとって優れたハッシュ アルゴリズムです。それ以外の場合は、SHA-2 または少なくとも SHA-1 をお勧めします。

于 2008-11-19T22:53:22.107 に答える
2

ゲームの配布が制限されていて、プレイヤーが勝つための実際のお金や報奨金が含まれていない場合は、元のスキームでおそらく十分です。

SWF 暗号化を使用すると、キーの抽出が少し難しくなる可能性が高く、より高度なシステムでも使用するのに適したツールになる可能性があります。しかし、本当の公開/秘密キー スキーム (RSA など) を使用している場合、公開キーは秘密ではないため、実際には議論の余地があります。それでも、ほとんどの人がコードを編集してスコアリング システムを改ざんするのを防ぐには、SWF 暗号化がおそらく十分な選択です。


あなたをもう少し妄想的にするために、私は次のことも書きました:

SWF 暗号化の問題は、他のほとんどの同様のツールと同様に、(侵害された可能性のある) マシンでスクリプトを実行できる必要があることです。したがって、すべての情報がそのマシンで利用可能でなければなりません。これを、メッセージを送信する従来の暗号化の使用法と比較してください。

暗号化されたメッセージを送信する場合、通常は送信元と送信先を信頼するため、メッセージを復号化するためのキーが両方にあることになります。あなたが信頼していないのは宅配業者です。少なくとも、敵が宅配便を傍受しないことは信頼できません。そのため、宅配業者は鍵を持っていないため、メッセージは安全です.

あなたの問題は、あなたの場合、宛先(あなた)を信頼しているがソース(クライアント)を信頼していないこと、またはその逆です。宅配業者をさらに信頼していないため、メッセージを暗号化できるソースが必要です。したがって、ソースが機能するには、メッセージを暗号化および復号化するためのすべての情報が必要です。問題は、「良い」ソースと「悪い」ソースの違いがわからないことです。

私が言いたいのは、コードはクライアント上で実行可能でなければならないので、そうするための情報は完全に利用可能でなければならないということです。たとえば、ハッカーは、難読化された ActionScript コードを読み取り可能なものに変換し、適切な変更を加える独自の ActionScript コンパイラを作成できます。難しいが、確実に実行可能です。

それでも、このレベルの巧妙な攻撃は、ディストリビューションが限定されていて、勝つための本当の報奨金がない場合は、問題にならない可能性が高いです。

于 2008-11-20T11:45:35.230 に答える
1

Blockquote最後に、ハッシュアルゴリズムの選択についてコメントする必要がありました。MD5は、90年代にまだ生きている人々にとって優れたハッシュアルゴリズムです。残りの私たちには、SHA-2または少なくともSHA-1をお勧めします。

ああ、私は代わりにSHAに言及すべきだと知っていました:)

swf暗号化アプリケーションのようなものを使用してswfコードを暗号化する場合、少なくともFlashに保存されているキーを取得するのがかなり難しくなりませんか?そのキーがなければ(または少なくとも簡単にアクセスできなければ)、サーバーに送信されるハッシュを生成するために何が使用されているかを理解するのは非常に難しいと思います。

このようなものは私が考えていたものです:SWF暗号化

これらの回答をありがとうございました。これは驚くほど役に立ちます。ああ、これはクライアントから顧客に送信される単純なFlashゲームであり、休暇中に仕事で時間を過ごすのに楽しいものになります。

于 2008-11-20T00:58:03.697 に答える
1

このソリューションを使用するメリットはないと Kent 氏は述べています。クライアントとして、サーバー側で作成されたキーをリクエストできます。わかりました、複数回使用することはできませんが、必要はありません...必要になるたびにリクエストするだけです。

  1. だから私は鍵を要求します。
  2. 自分のハイスコアを作る
  3. ハイスコ​​アをキーでハッシュします。
  4. ハイスコ​​アをサーバーに送信する
  5. サーバーは、送信されたキーを使用してハイスコアを取得します。
于 2009-02-07T13:06:34.217 に答える
1

スコアを暗号化する 100% 有効な方法は 1 つだけです: リプレイを記録することです。
しかし、リプレイだけでなく、理想的には、ユーザー キーの押下とそれらの間のスペースのみを記録する必要があります。このように、誰かがソースを改ざんしたり、RAM を動的に改ざんしたりしても、サーバー上で再生されたリプレイで問題が見つかります。
残念ながら、このソリューションを実現するには、膨大な量の作業が必要です。簡単にするために、すべてのスコア (または最高のスコア) を手動で検証するだけで満足です。それにもかかわらず、いくつかのことを避ける必要があります。

  • デフォルトの乱数発生器。指定されたシードに対して常に同じ乱数を与えるシード付き発生器が必要です。
  • 申し訳ありませんが、デルタ タイミングはありません。
  • カスタムの三角関数 (100% 確実ではありません。別のコンピューターではわずかに異なる結果が得られると聞いたことがあります);

そしておそらくもっと。
ただし、この防御は単純に破ることができません。そして、コーディングに時間がかかります:D.

于 2010-11-02T10:26:08.797 に答える
0

わお

かなり難しい解決策 8)。

このようなシステムを一度実装しました。すべてのゲームで機能するわけではありませんが...

サーバーでゲームをリプレイする必要があります。ユーザーがプレイするとき、「状態の変化」を保存し、それをある種の「リプレイ」モードでゲームに送ります。

于 2009-05-03T22:32:11.170 に答える