構成を安全に保存する必要があるアプリケーションがあります。構成を変更できるユーザーがいます。有効なユーザーなしで構成ファイルが変更されていないことを確認できる、ある種の署名スキームが必要です。秘密鍵がユーザーのパスワードで暗号化され、公開鍵が構成の署名に使用される RSA の使用を考えていました。ただし、誰かがユーザー ファイルを変更して独自の公開鍵を追加することを防ぐ方法は何もないため、セキュリティが回避されます。何か案は?
5 に答える
ファイルを暗号化しておき、アプリケーション内からの編集のみを許可することができます。これにより、ユーザーが自分以外のツールから構成を編集できなくなり、ユーザーが「有効なユーザー」であることを確認するために認証を行うことができます。
リストされているすべての方法の中で、キー管理はクライアント マシンの真の弱点です。復号化にはキーが必要です。別のキーを使用してそのキーを暗号化することは、強力ではありません。難読化が始まりです。
私が使用しているのは、暗号化コードを含む別のアセンブリです。その後、キーはステガノグラフィと呼ばれる技術を介して保存されます。アプリケーションのロゴにキーをエンコードします。このキーは、ソフトウェアの既知の値を使用して暗号化されます。場合によっては、特定のアセンブリのチェックサムである可能性があります。したがって、そのファイルに変更を加えると、システムが壊れます。これは決して安全ではありませんが、詳細を隠すことがすべてです. 難易度をカジュアルから決定的なレベルに上げます。そこから、難読化ツールと文字列暗号化ツールを使用してアセンブリを実行します。これにより、アセンブリを表示しようとするとクラッシュして Reflector が壊れ、何が起こっているのかを知ることがより困難になります。
これらの戦略の問題は、デバッガーをアタッチすると、暗号化/復号化プロセスの後に値を文字列に格納できるため、データが平文で取得されることです。これに対抗するため (排除するわけではありません)、私はSystem.Security.SecureStringクラスを使用し、データを平文で保持しません。
目標は、リフレクターを破壊し、.NET Framework を使用してデータを復号化するだけの単純な攻撃を阻止し、ランダム ソルトを使用して辞書攻撃を阻止し、暗号化されたバッファーを URLEncoding して簡単な文字列処理を可能にし、初期化ベクトルを適切に使用することです。
スタンドアロン クライアント アプリケーションを完全に保護する方法はありません。唯一の方法は、ファイルでチェックサムを実行し、サーバーに対して検証することです。ファイルに署名する方法は、実際に署名されているものを確認する方法ほど重要ではありません。
クライアント アプリケーションの保護の第一歩は難読化です。その後、暗号化が次に続きます。
実際の署名については、SHA
一連のハッシュでも問題なく機能するはずです。SHA512 を使用した例は次のとおりです。
FileStream fs = new FileStream(@"<Path>", FileMode.Open);
using (SHA512Managed sha512 = new SHA512Managed ())
{
byte[] hash = sha512.ComputeHash(fs);
string formatted = string.Empty;
foreach (byte b in hash)
{
formatted += b.ToString("X2");
}
}
これらは矛盾します:
- 「有効なユーザーなしで構成ファイルが変更されていないことを確認できます」
- 「誰かがユーザーファイルを変更するのを妨げるものは何もありません」
最初に「ユーザーファイル」を保護する方法を見つける必要があります。誰も編集できないキーで暗号化することにより(決定的なクラッカーを除く)、またはその他の方法で。そして、RSAスキームが機能します。
ただし、完全にクライアント上で実行されるアプリケーションを特定のクラッカーから保護する方法はないことに注意してください。
ただし、ほとんどのアプリケーションでは、完全なセキュリティは必要ありません。最初に、アプリケーションにとって実際にどの程度のセキュリティが「十分」であるかを検討する必要があります。
ただし、完全なセキュリティが必要な場合は、サーバー側のコンポーネントを追加するか、管理者にユーザー ファイルを制御させるなど、プロセスに人間の介入を追加する必要があります。
管理者のパスワードを使用して「ユーザー ファイル」を暗号化します。そして、誰かがユーザー ファイルを変更したいときはいつでも、管理者の同意が必要になります。
私がすることは、秘密鍵(A)をオフィスに保管することだと思います。私だけが知っているプライベート (A) で署名されたパブリック プライベート ペア (B) でアプリを出荷します。構成ファイルのすべてに署名するために、出荷するパブリック プライベート ペア (B) を使用します。したがって、RSA キー (B) の検証可能なセットが存在しますが、これは変更できません。これは、検証に使用される秘密キー (A) がオフィスにあり、公開キー (A) がハードコードされているためです。