2009-06-08 6 views
3

問題は簡単です:バイナリ形式で配布されているアプリケーション(たとえばゲーム)を開発します。ゲームは自宅に電話をかけ、ユーザーのハイスコアをオンラインゲームサーバーにメッセージとして送信します。私が知っている分散プログラムのメッセージをデジタル署名して信頼する方法は、リバースエンジニアリングが可能ですか?

私がしたいのは、メッセージをデジタル暗号化して署名することで、改ざんされていないと信頼できるようにすることです。

公開鍵暗号化は、秘密鍵を持つ会話の各端に依存しますが、私のソフトウェアはリバースエンジニアリングされておらず、秘密鍵が発見されません。

リバースエンジニアリングが可能であることが分かっているときに、配布されたバイナリアプリケーションからのメッセージをデジタル署名する(この場合、暗号化部分は必要ありません)方法がありますか?

答えて

3

要するに:いいえ...これには馬鹿な解決策はありません。問題は、ハイスコアを送信するアプリケーションが、このトランザクションで信頼していない人の管理下で実行されていることです。コードをリバースエンジニアリングすることができれば、署名前にメッセージの内容を変更することができます。

+0

+1しかし、私はあなたが間違った質問をしていると信じています。彼は署名する前に尋ねていないようです。または、彼は...別の2分で見るでしょう:) –

+1

中間者の人が人のスコアを改ざんする可能性があると懸念しているのならば解決できるのは唯一の解決法だと思っていますが、想像することはできません何人かのランダムなゲーマーのスコアを気にする人がいるのはなぜ... – jerryjvl

+0

良い点...あなたが言うように、それは私たちが技術を持っている唯一のケースです:)... –

0

いいえクライアントソフトウェアがデジタル署名を行うには、秘密鍵が必要です。また、ソフトウェアに秘密鍵がある場合、ユーザーはそれを発見することができます(潜在的に乱用する可能性があります)。

1

あなたのプログラムのコード(ソースコード、中間言語、またはマシンコード)が他人の手にあれば、彼らは何でもできますし、悪用しないことを確信できません。誤用をより困難にするためには、リバースエンジニアリングをより困難にするためのすべての可能な方法を使用してください。

1

あなたはできません。この問題には真の解決策はなく、難読化や改ざんチェックがますます増えています(IMHO、時間の無駄です)。仮に、すべてのプログラムをリバースエンジニアリング、エミュレート、改ざんすることができます。あなたはそれに対して何もできません。

改ざんからゲームの結果を安全に保つことができると思う唯一の方法は、再生でき、スコアが確認できるゲームレコーディングを送信することです。しかし、これはあなたのゲームがロボットによってプレイされることから保護しません。これは、ゲームの世界が完全に決定論的な場合にのみ適用されます。

0

いくつかの既知のアルゴリズムを使用しています。私のアプリケーションでは、私はブローフィッシュを使用しています。しかし、それは安全なものではありません。

ゲームには、通常、サーバーに接続するプログラムの機密性をチェックするプロセスがあります。このプロセスは、「ハンドシェイクプロセス」と呼ばれます。サーバーは、値と暗号化されたパケットを送信します(クライアントは、 )ブローフィッシュキー。サーバーから受信したブリーフキーは、各接続ごとにランダムです。これがハンドシェイクの最初の部分です。

次の部分は、connect(ランダム)で受信した値に基づいて計算された整数を暗号化し、それをブローフィッシュで暗号化します。

サーバーがそのパケットを受信すると、サーバーは同じパケットを送信し、新しい(最終的な)ブロッフィッシュキーで暗号化されます。クライアントは古いブロッフィッシュキーで復号化し、計算します第1のパケットから受信した値と比較する。

これはハンドシェイクプロセスです。終了した後、同じプリンシパルにスコアを送信することができます(またはハンドシェイク内に置いて、ハンドシェイクを行った後に偽のパケットを送信してリバーサーを欺くことができます)。

これはあまりにも多いですが、リバーサにとってはあまりにも重すぎます。

問題を解決する別の方法は、パケット内容に基づいて2バイト(単語)のセキュリティ値(CRC)を独自の計算で追加することです。サーバーはその値をチェックし、無効な場合 - >切断します。

+1

"クライアントリバースエンジニアはそれを解読する方法も知っているので、あなたの「方法」を役に立たなくするよりも、それを解読する方法を知っています。応答値を使用するスキームで暗号鍵を「隠す」ロジックは、攻撃者が解読することもできます。リプレイ攻撃を難しくし、攻撃者の困惑につながりますが、確かに不可能ではありません。 –

+0

曖昧さによるセキュリティはまったくセキュリティではありません。 :) –

+0

クライアントがどのように解読するのかを見てください。クライアントは、少なくとも1つのアルゴリズムを知っていなければなりません。それは役に立たなくはありませんが、リバーサを混乱させます。ブローフィッシュ+ CRCはスコアを送るのに十分です。 –

0

良い質問!ここではたくさんの人が既にこれを言っています。あなたは、リバースエンジニアリングによって潜在的に検索可能なキーをあなたのアプリに組み込む必要があります。

Trusted Computingをお読みください。これはあなたのPCに組み込まれた公開鍵/秘密鍵の周りに構築されています - あなたのPCは決してあなたにアクセスすることを許可しません。メモリカービング/密封ストレージは、攻撃者があなたのアプリに配信されたキーを発見しようとすることを困難にします。

0

いいえ、一般的ではありません。あなたは他のコメントで言及された問題に直面しています。

ご質問は費用の1つになります。保護システムをクラッキングするコストは、保護している値よりも高くなっていますか?成功したブレークインから回復するためのコストはいくらですか?ゲームの状態にいくつかの情報を送信する、ハイスコアとともに

  1. ;:ハイスコアテーブル以来

    は、一般的に高い値の対象ではありません、あなたはこれらのいずれかをしようとする場合がありますプレイタイム、レベル、ボーナスの収集などを行います。このデータを暗号化/難読化します。これは、ハイスコアが理論的に有効かどうかをサーバーが判断するのに役立ちます。明らかに偽であるハイスコアを無視する。

  2. 共有秘密の暗号化を使用して最高得点を送信します。あなたのアプリにプレーンテキストとして共有秘密を保存しないでください。好ましくは、それをリアルタイムで計算するアルゴリズムを使用する。

  3. クライアントコードを難読化します。

  4. クライアントのIPアドレスとタイムスタンプで最高スコアを格納します。

関連する問題