アプリケーション内で、API 呼び出しのハッシュを計算するために秘密鍵を使用しています。.NET アプリケーションでは、Reflector のようなプログラムを使用して、アセンブリから情報を引き出してこれらのキーを含めるのは非常に簡単です。
アセンブリを難読化することは、これらのキーを保護する良い方法ですか?
アプリケーション内で、API 呼び出しのハッシュを計算するために秘密鍵を使用しています。.NET アプリケーションでは、Reflector のようなプログラムを使用して、アセンブリから情報を引き出してこれらのキーを含めるのは非常に簡単です。
アセンブリを難読化することは、これらのキーを保護する良い方法ですか?
おそらくそうではありません。
暗号化と、Windows に組み込まれている情報隠蔽メカニズム (DPAPI と、ACL で制限されたレジストリ キーへのキーの格納など) を調べます。これは、アプリケーションと同じシステム上に維持する必要があるセキュリティのために得られるものと同じくらい良いものです.
マシンの前に物理的に座っている誰かがあなたの情報を取得するのを防ぐ方法を探しているなら、それを忘れてください. 誰かが決定され、あなたの管理下にないコンピューターに無制限にアクセスした場合、すべての状況でデータが保護されていることを 100% 確実にする方法はありません。やる気のある人は、やりたいと思えばやります。
DannySmurf の言うとおり、アプリケーションを実行している人からキーを隠すことはできません。アプリケーションがキーにアクセスできる場合は、人もアクセスできます。
ただし、正確に何を達成しようとしていますか?
それが何であるかにもよりますが、ユーザーのマシンで秘密の「秘密」を保持することに単純に依存するのではなく、目標を達成する方法がしばしばあります。
難読化 (少なくとも私が理解しているように) は、単にメソッド名をいじって、コードを理解するのを難しくします (ただし、不可能ではありません)。これは実際のキーのデータを変更しません (これは定数のどこかに格納されていると思います)。
少し見づらくしたい場合は、平文 (ROT-13 など) で単純な暗号を実行して、少なくともコード自体に平文で保存されないようにすることができます。しかし、だからと言ってハッカーがあなたのキーにアクセスするのを止めることはできません。そのためのキーをコードに保存する必要があり、それを保護するものがないため、より強力な暗号化方法は役に立ちません。
私が考えることができる唯一の本当に安全なことは、何らかの方法でキーをアプリケーションの外部に保持し、キーへのアクセスを制限することです。たとえば、キーを別のファイルに保存し、OS レベルのユーザーベースの制限でファイルを保護することができます。それはおそらくうまくいくでしょう。データベース接続でも同じことができます (再度、ユーザーベースのアクセス制限に依存して、許可されていないユーザーをデータベースから締め出します)。
アプリでこれを行うというアイデアをいじりましたが、実装したことはありません。