7

C#について質問があります。

私は現在、医療用ソフトウェア製品に取り組んでいます。重要なことの1つは、患者のデータが暗号化されていることを確認することです。これに関して2つの質問がありました。

1.)System.Security.CryptographyからのAES(Rijndael)のMicrosoft .NET実装はどの程度安全ですか?既知のセキュリティ上の欠陥がありますか、それともMS実装を使用するだけで問題ありませんか?(注:これらのアルゴリズムがどのように機能するかについての基本的な背景は知っていますが、どのように機能するかを理解するために、それほど深くは理解していません)。

2.)データはアプリケーションと同じPCに保存されているので、C#アプリケーションから情報を取得するのはどのくらい難しいですか?コードのどこかにあると仮定します

string encrypPassword = "ThisIsMyPassword";
string encryptedString = EncryptString(ClearString, encrypPassword);
// save encryptedString to harddrive

攻撃者がアセンブルコードにたどり着く可能性があることは知っています。その時点では、これに対して私ができることは何もありません(システムはデータを暗号化/復号化できる必要があります)が、 encrypPasswordを取得するためのC#は、管理されているためですか、それともこのようなものでは、アセンブルコードに進む必要がありますか?

4

4 に答える 4

5

アプリに固定パスワードをコンパイルしている場合、データは単に安全ではないため、AESのセキュリティや既知のセキュリティ障害について心配する必要はありません。PCにアクセスできる十分な知識のある人は、すべてのデータを復号化できます。

また、固定パスワードを見つけるには、通常、プログラミングの知識は必要ありません。ほとんどの場合、優れた16進エディタで十分です。どのプログラミング言語が使用されたかを知る必要さえありません。

データが1人のユーザーによって使用されている場合は、患者データのパスワードをそのユーザーのWindowsパスワード(またはアカウント)に関連付けることができます。Windowsはそのためのいくつかの特定の機能を提供します。.NETからアクセスする方法については、 http://msdn.microsoft.com/en-us/library/aa302402.aspxを参照してください。

于 2012-10-22T11:13:11.847 に答える
1

元の質問の最初の部分に答えて、AESのネイティブWindows実装は、FIPS140-2準拠であることがNIST認定されています。認定された実装へのアクセスは、以下に制限されています。

  1. WindowsCryptoAPIの使用

  2. WindowsCryptoAPIへのCAPICOMcomラッパーの使用

  3. System.Security.Cryptography名前空間で.NetAesCryptoServiceProviderクラスを使用する(このクラスは.Net Framework 3.5まで使用可能になりませんでした)

そうは言っても、RijndaelManagedクラスの実装は同じであり、NIST認定プロセスを経ていないだけです(このプロセスは非常に長く、非常に費用がかかります)。

Aesアルゴリズムは非常に安全です(軍事グレードの暗号化-特に256ビットのキーバリアント)。

最大の懸念事項(上記のポスターに同意)は、暗号化パスワードをプレーンテキストでアプリケーションに埋め込んでおくことです。

于 2012-10-22T11:51:26.210 に答える
0

パスワードデータを保存するには、System.Security名前空間のSecureStringクラスを使用できます。

于 2012-10-22T11:27:27.023 に答える
0

ほとんどのまともな難読化ツールは、アセンブリの文字列セクションに格納する前にコードから文字列を暗号化し、使用前に復号化するメソッドを挿入します。これらの手法は、逆アセンブラによってリバースエンジニアリングされてから長い年月が経ちました。

現実的には、どのプログラミング言語でも文字列を安全に保存する方法はほとんどありません。ほとんどの場合、誰かが文字列を見つけるか、それを構築するために使用したロジックをリバースエンジニアリングすることができます。あなたができる最善のことは、攻撃者を時間と労力の価値がなくなるのに十分な時間、攻撃者を収容することです。

あなたの場合、私はおそらくパスワードを暗号化してアプリに保存します(たとえば、アプリの外部で手動で暗号化し、コピーして貼り付けます)。おそらくそれを部分に分割して、単一の文字列として保存されないようにします。次に、それを元に戻し、実行時に暗号化を解除してから、実行時にSecureStringに保存します。また、暗号化解除ロジックをマスクするのに役立つため、優れた難読化ツールに投資してください(これはセキュリティの弱点になります)。

于 2012-10-22T11:49:24.613 に答える