2

従量制アプリケーションである C# 2.0 デスクトップ アプリケーションの登録コードを作成しようとしています。登録コードは、その中に int 値を隠す必要があります (int 値は、アプリケーションの使用回数を表します)。

私のマシンからコードを生成するために、名前、乱数、および使用回数を入力として使用する別のアプリケーションがあります。例えば:

Name:  BOBSMITH  
Random number:  51728  
Number of Uses: 50  
Concatenated String: BOBSMITH_51728_50

連結された文字列 (MD5 ハッシュなど) でハッシュを実行すると、次のような 32 の 16 進文字列 (Reg コードと呼びます) が得られます。 ABCD 1234 EFGH 5678 IJKL 9012 MNOP 3456

さて、私のユーザー側では、アプリケーションを登録するときに、登録コードを確認し、登録コード/名前/乱数から使用回数を決定する必要があります。したがって、ユーザーは次の値を入力します。

Name: BOBSMITH  
Random Number: 51728  
Reg Code: ABCD 1234 EFGH 5678 IJKL 9012 MNOP 3456 

私の質問:私のアプリケーションはどのように判断できますか (名前、乱数、および登録コードのみに基づいて):

  • 登録コードが正しいこと
  • 私のマシンから最初に与えられた使用の数

私が考えた簡単なアイデアの 1 つは、名前と乱数のみに基づいてハッシュを生成し (コード A と呼びましょう)、このハッシュに使用回数を追加することです (コード B)。例えば:

Code A: ABCD 1234 EFGH 5678 IJKL 9012 MNOP **1184**  
Code B: ABCD 1234 EFGH 5678 IJKL 9012 MNOP **11B6**

コード B からコード A を引くと、50 になります。したがって、ユーザーは次の値を入力します。

Name:BOBSMITH  
Random Number: 51728  
Reg Code: ABCD 1234 EFGH 5678 IJKL 9012 MNOP 11B6  (Code B)  

Reg Code と使用回数を (ユーザー側から) 確認するために、私のアプリケーションは Name & Random Number のハッシュを取得します。これにより、Code A と同じ値が得られます。次に、Reg Code から Code A を減算します。ユーザーが入力し、差が 50 であることを確認します。したがって、ユーザーに 50 回の使用を与えることがわかります。ただし、このソリューションはあまりにも安全ではないようです。誰かの提案をいただければ幸いです。

4

3 に答える 3

4

TL; DRバージョン:それは不可能です。「従量制」と「デスクトップアプリケーション」は混在しません。


番号を非表示にすることが実際の目標ですか、それとも非表示にすることで改ざんを防ぐことができると思いますか?(消費者に支払った使用回数を表示しないようにしていますか?不正に聞こえます。)メッセージ認証コードを使用すると、番号がわかりやすく保存されている場合でも、値が改ざんされていないことを確認できます。 、変更するとMACが無効になるため。

ただし、これでも問題は解決しません。ユーザーが使用回数のカウンターを改ざんできる場合、購入した使用回数を保護するのは良くありません。最も単純な攻撃では、ユーザーは同じ登録コードを2台目のコンピューターに入力するだけで、使用回数を2倍にすることができます。また、このカウンターは、ユーザーのコンピューターで実行されているソフトウェアによってインクリメントされる必要があるため、ユーザーは、それを更新するために必要なすべての情報を必ず所有しています。

自分の管理下にある安全な中央サーバーにカウンターを保存したとしても(これにより、許可された使用回数を保護する問題もなくなります)、ユーザーがホームを呼び出すソフトウェアの部分にパッチを適用するのを防ぐことはできません。あなたができる唯一のことはクラウドでソフトウェアをホストすることです、それであなたはユーザーが協力することなく使用の数を数えることができます。

ソフトウェアライセンスの第1法を参照してください。

于 2012-12-05T20:46:36.470 に答える
0

安全なハッシュの定義そのものが、数値を取り戻す可能性を認めていません。

しかし、それは、他のすべてをハッシュしてから、別の方法でハッシュコードの数字を隠すことができるという意味ではありません。ハッシュの末尾に数値を追加する例は機能しますが、そうする場合は、結果の値からチェックサムを計算し、それをコードに追加して、改ざんを困難にすることもお勧めします。

于 2012-12-05T20:30:40.587 に答える
0

ハッシュは一方向のみであるため、ハッシュしたものを元に戻すことはできません。暗号化は双方向であるため、暗号化したものは何でも元に戻すことができます。

誰かが暗号化された番号を変更するのを防ぐために、認証も必要になります。AES-GCM (認証を含む) を使用するか、認証に HMAC-SHA-256 と共に AES-CTR または AES-CBC (認証を含まない) を使用します。

コンピュータのセキュリティは簡単ではありません。多くの問題は解決されましたが、解決策は必ずしも単純ではありません。どうやら小さなエラーが重大なセキュリティ ホールを引き起こす可能性があります。

于 2012-12-13T23:52:49.407 に答える