August 2009
Volume 24 Number 08
この記事は機械翻訳されたものです。
セキュリティに関するブリーフィング - 暗号化アジリティ
Bryan Sullivan | August 2009
内容
将来の計画による攻略します。
起り得る問題
代替の配分状況] ビューと構文
暗号化のアジリティの別の利点
まとめ
履歴、ユーザーが、敵対者からの情報を非表示に暗号のさまざまなフォームを使用します。Julius Caesar (A が B、D に変換される文字は E というに変換されます)、3 インプレース シフト暗号を使用する戦闘計画を通信します。第二次世界大戦中に、ドイツ語の海軍を大幅に高度なシステムを使用-Enigma コンピューターなど、U-ボート宛てのメッセージを暗号化します。今日では、私たちはインターネット上のセキュリティで保護されたトランザクションの実行に役立つ、公開キー基盤の一部としてよりも高度な暗号化メカニズムお使用します。
cryptographers が秘密のコードを行うされている限り、cryptanalysts がしように分解し、情報、およびもブレーカー成功コードを盗むためです。1 回安全暗号化のアルゴリズムは、壊れたあり、役に立たないレンダリングできます。微妙な欠陥が見つかり、アルゴリズムとブルート フォース攻撃を実行する複数のコンピューティング パワーへのアクセスを持つ攻撃者の問題だけであることがあります。
最近では、セキュリティ研究者が衝突の結果として、MD5 ハッシュ アルゴリズムの弱点を示す。 つまり、それらが表示 2 つのメッセージを同じ計算 MD5 ハッシュ値を持つことができます。この弱点を対象として、Web 上で電子商取引を保護する公開キー基盤のコンセプトの検証攻撃が作成しました。によって、特別な細工がされた Web サイトの証明書の証明書の署名に MD5 を使用する証明機関 (CA) からを購入、研究者がインターネット上の任意のサイト可能性を偽装する効果的に使用できる悪意のある CA 証明書を作成できた。これは、終了 MD5 がデジタル証明書の署名に適していないあり SHA-2、アルゴリズムのようなより強力な方法を使用する必要があります。(なら、さらにこの調査について学習を読み取ることができます、ホワイト ペーパー.)
懸念ありではこれらの調査結果を引き起こす確かは、巨大な突然ではありません。2005 以降、マイクロソフトの SDL の暗号化規格によって、マイクロソフト製品に MD5 の使用を禁止されて MD5 の理論上の弱点が年の実演されました.RC2、SHA-1 など、他の 1 回の一般的なアルゴリズムを同様に禁止されています。図 1 は禁止または SDL によって承認は、暗号化アルゴリズムの完全な一覧を表示します。SDL-承認されたアルゴリズムの一覧はこの記述時点では、現在ですがこの一覧はレビューおり、SDL の更新処理の一部として年間更新します。
図 1 暗号化アルゴリズムの SDL の承認 |
アルゴリズムの種類 | (既存のコードに置き換えまたは復号化だけに使用するアルゴリズム) を禁止します。 | 承諾可能 (アルゴリズム、機密データ以外の既存のコードの) | 推奨 (アルゴリズム新しいコードの) |
対称ブロック | DES、DESX、rc2、SKIPJACK | 3 DES (2 または 3 キー) | AES (> = 128 ビット) |
対称ストリーム | シール、CYLINK_MEK、RC4 (< 128 ビット) | RC4 (> = 128 ビット) | ブロック暗号が優先して、ないです。 |
非対称 | RSA (< 2048 ビット)、Diffie-Hellman (< 2048 ビット) | RSA (> = 2048bit)、Diffie-Hellman (> = 2048bit) | RSA (> = 2048bit)、Diffie-Hellman (> = 2048bit)、ECC (> = 256 ビット) |
ハッシュ (HMAC の使用法を含む) | SHA-0 (SHA)、SHA-1、md2、md4、md5 | SHA-2 | SHA-2 (が含まれています: SHA-256、SHA 384 SHA 512) |
HMAC キーの長さ | <112 ビット | >= 112 ビット | >= 128 ビット |
独自のコードでこれらの標準を実行する場合でも、最も安全なアルゴリズムのみと最も長いキーの長さを使用してのありません今日に記述するコードをセキュリティで保護された残ることの保証。実際には、そのいない可能性があります残ります履歴は、ガイド場合セキュリティで保護。
将来の計画による攻略します。
サービス パックをユーザーに移動すると、古いアプリケーションのコード ベース、脆弱なアルゴリズムのインスタンスを選択、新しいアルゴリズムと置き換えて、アプリケーションを再構築、を介して回帰テストを実行および修正プログラムを発行しの reactively の対応居心地のシナリオはこのさせることができます.これは多くの作業のだけでですされませんが、まだままユーザー危険まで出荷の修正プログラムを入手できます。
良い方法はこのシナリオでは、最初から計画します。ハードコーディング特定の暗号化アルゴリズムをコードに、代わりには、Microsoft .NET Framework に組み込まれた暗号機敏性機能のひとつを使用します。少し C# コード スニペット、少なくともアジャイルの例で始まるを見てみましょう。
private static byte[] computeHash(byte[] buffer)
{
using (MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider())
{
return md5.ComputeHash(buffer);
}
}
このコードは完全に nonagile です。 それに結び付けられた、特定のアルゴリズム (MD5) そのアルゴリズムでは、MD5CryptoServiceProvider クラスの特定の実装と同様です。 このアプリケーションをセキュリティで保護されたハッシュ アルゴリズムを使用する変更は、コードを変更して、修正プログラムの発行必要があります。 少し良い例を次のとおりです。
private static byte[] computeHash(byte[] buffer)
{
string md5Impl = ConfigurationManager.AppSettings["md5Impl"];
if (md5Impl == null)
md5Impl = String.Empty;
using (MD5 md5 = MD5.Create(md5Impl))
{
return md5.ComputeHash(buffer);
}
}
この関数では、System.Configuration.Configuration マネージャー クラスを使用してアプリケーションの構成ファイルから、カスタム アプリケーション設定 ("md5Impl"の設定) を取得を。 ここで、設定を使用するアルゴリズムの実装クラスの厳密な名前を格納する使用されます。 コードは静的関数、目的のクラスのインスタンスを作成する MD5.Create にこの設定の取得値を渡します。 (System.Security.Cryptography.MD5 はアルゴリズム派生元とするすべての実装、MD5 の抽象基本クラス) です。 md5Impl のアプリケーション設定が、文字列に設定された場合など"System.Security.Cryptography.MD5Cng、System.Core、バージョン = 3.5.0.0、カルチャ ニュートラル、PublicKeyToken = b77a5c561934e089 ="、MD5.Create は、MD5Cng クラスのインスタンスを作成します。
このアプローチので実際ないソリューションまったく、暗号の敏捷性の問題の半分だけ解決します。 役立ちます MD5Cng のように、特定の実装で問題が発見がおいるもに結び付けられた MD5 の使用で一般のソース コードを変更せず、MD5 アルゴリズムの実装を今すぐ指定おできます。 この問題を解決するには、お保持抽出上。
private static byte[] computeHash(byte[] buffer)
{
using (HashAlgorithm hash = HashAlgorithm.Create("MD5"))
{
return hash.ComputeHash(buffer);
}
}
一見すると、このコード スニペットは、最初の例が大幅に異なる検索されません。 おした一度 MD5 アルゴリズムにハードコード HashAlgorithm.Create("MD5") への呼び出しを使用して、アプリケーションと同様に検索されます。 驚くほどは、このコードが大幅に他の例は、いずれも暗号よりアジャイルです。 既定のメソッドの動作中に HashAlgorithm.Create (MD5) を呼び出す-.NET 3. 5 の-は、MD5CryptoServiceProvider クラスのインスタンスを作成する machine.config ファイルへの変更によって、ランタイムの動作をカスタマイズできます。
MD5 の代わりに、SHA512algorithm のインスタンスを作成するにはこのコードの動作を変更してみましょう。 このため、必要ことがあります、machine.config ファイルに 2 つの要素を追加する: アルゴリズムの表示をマップするには、<cryptoclass> 要素名アルゴリズム実装クラスにおします; と <nameentry> 要素を新しいフレンドリ名に、古い、旧式のアルゴリズムのフレンドリ名をマップします。
<configuration>
<mscorlib>
<cryptographySettings>
<cryptoNameMapping>
<cryptoClasses>
<cryptoClass MyPreferredHash="SHA512CryptoServiceProvider, System.Core, Version=3.5.0.0,
Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
</cryptoClasses>
<nameEntry name="MD5" class="MyPreferredHash"/>
</cryptoNameMapping>
</cryptographySettings>
</mscorlib>
</configuration>
これで、コードは、HashAlgorithm.Create("MD5") の呼び出しが、CLR machine.config ファイル検索し、表示文字列"MD5"する必要があります、アルゴリズムの表示名"MyPreferredHash"にマップできます。 "MyPreferredHash"(指定したバージョン、カルチャ、および公開キー トークンを使用して System.Core、アセンブリで定義) されたに SHA512CryptoServiceProvider クラスにマップされ、そのクラスのインスタンスを作成する [表示されます。
アルゴリズムの再マッピングは実行しないコンパイルが実行時にすることが大切: リマップ、しない開発者の制御をユーザーの machine.config です。 その結果、この手法では、当社の将来的に一度にいくつか壊れている可能性のある特定のアルゴリズムに関連付けられているジレンマ解決します。 ハードコーディング、暗号アルゴリズム クラスをアプリケーションに回避することによってなどの暗号化アルゴリズム、HashAlgorithm、抽象型だけを代わりにコーディング-順番、エンドユーザー (具体的には、権限を持つユーザー管理アプリケーションがインストールされているコンピューターに machine.config ファイルを編集) 決定できます正確にアルゴリズムおよび実装するアプリケーションが使うアプリケーションを作成します。 いずれも安全か切断されました最近するアルゴリズムを置換する管理者こともできます (たとえば、置き換える MD5 SHA-256) または事前アルゴリズムをセキュリティで保護された長いビット長 (置換 SHA 512 で SHA-256) が代わりに置き換えます。
起り得る問題
暗号の敏捷性の問題を解決可能性があります ("MD5"や"SHA1") など、既定アルゴリズムの種類の文字列を再マップする machine.config ファイルの変更は互換性の問題と同時に作成できます。 コンピューター上のすべての .NET アプリケーションを影響 machine.config に変更を加えます。 他アプリケーションがコンピューターにインストールされている可能性があります MD5 を具体的には、依存これらのアプリケーションで使用するアルゴリズムを変更する可能性があります開始し、診断しにくい予期しない方法で解除します。 コンピューター全体に一括変更を強制する代わりに、コード内でカスタム、アプリケーション固有のフレンドリ名を使用し、machine.config で優先クラスに名前のエントリをマップすることをお勧めします。 たとえば、この例では"MD5""MyApplicationHash"に変更おことができます。
private static byte[] computeHash(byte[] buffer)
{
using (HashAlgorithm hash = HashAlgorithm.Create("MyApplicationHash"))
{
return hash.ComputeHash(buffer);
}
}
おしに、"MyPreferredHash"クラス"MyApplicationHash"をマップする machine.config ファイルにエントリを追加します。
<cryptoClasses>
<cryptoClass MyPreferredHash="SHA512CryptoServiceProvider,
System.Core, Version=3.5.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089"/>
</cryptoClasses>
<nameEntry name="MyApplicationHash" class="MyPreferredHash"/>
同じクラスに複数のフレンドリ名をマップすることもできますされたとえばするでした、アプリケーションの各 1 つのわかりやすい名前を持つすべて他のアプリケーション、コンピューターに影響を与えず特定のアプリケーションの動作をこの方法で変更します。
<cryptoClasses>
<cryptoClass MyPreferredHash="SHA512CryptoServiceProvider,
System.Core, Version=3.5.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089"/>
</cryptoClasses>
<nameEntry name="MyApplicationHash" class="MyPreferredHash"/>
<nameEntry name="MyApplication2Hash" class="MyPreferredHash"/>
<nameEntry name="MyApplication3Hash" class="MyPreferredHash"/>
ただし、私たちもない互換性の問題に関連する、森の独自のアプリケーションでいます。 ローカル変数 (一時的なストレージ) とデータベースと XML スキーマ (固定記憶域) の両方の記憶域のサイズに関するを前もって計画します。 たとえば、MD5 ハッシュは常に 128 ビット長です。 正確に 128 ビット、コードまたはハッシュ出力を格納するスキーマで、予算を場合 SHA-256 にアップグレードすることはできません (256 ビット長出力) または SHA 512 (512 ビット長出力)。
量の記憶領域が十分な質問を頼むこれは。 512 ビット、または必要がありますを 1, 024、2, 048 と使用して複数でしょうか。 すべてのアプリケーション、異なる要件が、経験則として私を推奨予算のとの間隔を 2 回として多くが現在使用しているハッシュされていることため、このルールをハードを提供することはできません。 対称および非対称暗号化データは、多くて、余分な 10% の領域を確保することがあります。 既存アルゴリズムよりも大きく出力サイズを使用する新しいアルゴリズムは広く認められますがほとんどです。
ただし、(たとえば、データベースまたはファイルに) 永続的な状態でハッシュの値または暗号化されたデータを格納するアプリケーションは十分な空き領域を予約するよりも大きな問題があります。 1 つのアルゴリズムを使用してデータを永続化を後で、異なるアルゴリズムを使用してそのデータを操作してください、期待する結果が表示されません。 たとえば、お勧めのプレーンテキストの完全なバージョンではなくパスワードのハッシュを格納します。 ユーザーはログオンすると、コードは、データベースにストアド ハッシュにユーザーによって指定されたパスワードのハッシュ比較できます。 一致すると、ハッシュ、ユーザーは認証です。 ただし、ハッシュは 1 つの形式 (たとえば、MD5) に格納され、別のアルゴリズム (たとえば、SHA-256) を使用するアプリケーションがアップグレード、ユーザーは、パスワードの SHA-256 ハッシュ値は常に、同じパスワードの MD5 ハッシュ値と異なるあるためにログオンできません。
場合によってはこの問題を回避実際のデータと共にメタデータとして、元のアルゴリズムを格納して取得できます。 格納データの操作、時に、アジリティ メソッドやを使ってリフレクション) 最初、現在のアルゴリズムの代わりに使用するアルゴリズムをインスタンス化。
private static bool checkPassword(string password, byte[] storedHash,
string storedHashAlgorithm)
{
using (HashAlgorithm hash = HashAlgorithm.Create(storedHashAlgorithm))
{
byte[] newHash =
hash.ComputeHash(System.Text.Encoding.Default.GetBytes(password));
if (newHash.Length != storedHash.Length)
return false;
for (int i = 0; i < newHash.Length; i++)
if (newHash[i] != storedHash[i])
return false;
return true;
}
}
必要が残念ながら、これまである場合ストアド 2 つのハッシュを比較するがなに同じアルゴリズムを使用して作成されています。 SHA-256 ハッシュを MD5 ハッシュを比較し、かどうか、両方から作成された、同じ元データを決定しない方法だけがあります。 この問題に暗号アジリティ適してがないと提供できますが、最適なアドバイスはことは現在利用可能な最も安全なアルゴリズムを選択およびそのアルゴリズムは後で切断された場合に備えてアップグレード計画を作成しする必要があります。 一般に、暗号の敏捷性の永続的なデータよりも一時的なデータのよりはるかに作業する傾向があります。
代替の配分状況] ビューと構文
アプリケーションの設計は暗号の敏捷性の使用を許可、すると仮定しましょういくつかの代替の使用とこの手法の構文を見てに進みます。 これまで、この記事で暗号化ハッシュ アルゴリズムにほとんど完全重点を置いているおが暗号の敏捷性は、その他の暗号化アルゴリズムの種類に対しても機能します。 だけで、適切な抽象基本クラスの静的作成メソッドを呼び出します: AES; などの対称 (秘密キー) 暗号化アルゴリズムの SymmetricAlgorithm AsymmetricAlgorithm 非対称 (公開キー) の RSA などの暗号化アルゴリズム、キー付きハッシュは; を KeyedHashAlgorithm とハッシュ ベース メッセージ認証コードの HMAC。
暗号の敏捷性など、カスタム アルゴリズム クラスで置き換えるいずれかの標準的な .NET 暗号化アルゴリズム クラスも使用できます。CLR セキュリティ チームが開発した、CodePlex をアップロード、アルゴリズムのいずれか. ただし、独自のカスタム暗号化ライブラリを作成することは推奨されない高い。 ROT13 から成る手作り、アルゴリズム、ビットごとの左シフトを続けて、猫の名前に対して、XOR を安全に見えるかもしれませんが、詳しい知識のあるコード ブレーカーにほとんどのチャレンジを引き起こすことは。 暗号化の専門家でない限り、アルゴリズムのデザインのままに、IT プロフェッショナルにします。
独自のアルゴリズムを開発を抵抗 — 長い死を revive に隠さ Vigenère 暗号のようなもの、または -強力な暗号保護しない必要がある状況でもします。 問題のためあまりどのような操作を行った後にどのような開発者がの暗号にはありません。 カスタム アルゴリズム クラス内の検索、コード基本年後の新しい開発者、よいだけ彼は必要なものの新しい製品のライセンス認証のあるキーの生成ロジック。
ところ見た暗号アジャイルなコードを AlgorithmType.Create(algorithmName)、実装するための構文のいずれかが他の 2 つの方法は、.NET Framework に組み込まれます。 最初は、System.Security.Cryptography.CryptoConfig クラスを使用します。
private static byte[] computeHash(byte[] buffer)
{
using (HashAlgorithm hash = (HashAlgorithm)CryptoConfig.CreateFromName("MyApplicationHash"))
{
return hash.ComputeHash(buffer);
}
}
このコードが HashAlgorithm.Create("MyApplicationHash") を使用して、前の例として同じ、操作を実行: CLR machine.config ファイルを文字列"MyApplicationHash"のマッピングの検索し、見つかった場合、再割り当てアルゴリズム クラスを使用します。 System.Object の戻り値の型が SymmetricAlgorithms、AsymmetricAlgorithms、またはその他のオブジェクト作成に使用できるので、CryptoConfig.CreateFromName の結果をキャストするがあることを確認します。
2 番目の代替構文は次メソッドを呼び出す静的アルゴリズムの作成元の例で我々 がこのようなパラメーターなしでです。
private static byte[] computeHash(byte[] buffer)
{
using (HashAlgorithm hash = HashAlgorithm.Create())
{
return hash.ComputeHash(buffer);
}
}
このコードでお客様だけ願いすべて既定のハッシュ アルゴリズム実装のインスタンスを提供するため、フレームワーク。 図 2 で既定値の一覧の System.Security.Cryptography 抽象基本クラス (.NET 3. 5) の各検索できます。
図 2 標準アルゴリズムおよび .NET Framework 3. 5 での実装 |
抽象基本クラス | 既定のアルゴリズム | 既定の実装 |
HashAlgorithm | SHA-1 | SHA1CryptoServiceProvider |
SymmetricAlgorithm | AES (Rijndael) | RijndaelManaged |
AsymmetricAlgorithm | RSA | RSACryptoServiceProvider |
KeyedHashAlgorithm | SHA-1 | hmacsha1 |
HMAC | SHA-1 | hmacsha1 |
HashAlgorithm の既定のアルゴリズムが SHA 1 であり既定実装クラスは SHA1CryptoServiceProvider 表示できます。 ただし、SHA-1 は、SDL の暗号化規格によって禁止されていますがわかります。 潜在的な互換性の問題こと、通常"SHA1"のようなアルゴリズムの固有名を再マップし、我々 machine.config"SHA1"を SHA512CryptoServiceProvider にマップし直すの変更に unwise という事実を無視しましょう。
<cryptoClasses>
<cryptoClass MyPreferredHash="SHA512CryptoServiceProvider, System.Core, Version=3.5.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089"/>
</cryptoClasses>
<nameEntry name="SHA1" class="MyPreferredHash"/>
ここで、アルゴリズムが正常に再マップし、アプリケーションを実行しことを確認、computeHash 関数でデバッグ行を挿入してみましょう。
private static byte[] computeHash(byte[] buffer)
{
using (HashAlgorithm hash = HashAlgorithm.Create())
{
Debug.WriteLine(hash.GetType());
return hash.ComputeHash(buffer);
}
}
このメソッドからのデバッグ出力は。
System.Security.Cryptography.SHA1CryptoServiceProvider
どうしたのでしょうか。 SHA 512 に SHA1 を再マップおしなかったでしょうか。 実際には、残念ですが、私たちでした。 だけ、文字列"SHA1"を SHA512CryptoServiceProvider、クラスをリマップおしでしたいない渡します文字列"SHA1"をパラメーターとして HashAlgorithm.Create する呼び出しに。
マップし直す文字列パラメーターの作成] も作成されるオブジェクトの種類を変更することもは。 これを行う HashAlgorithm.Create() は HashAlgorithm.Create("System.Security.Cryptography.HashAlgorithm") のショートカット構文だけです。 今すぐみましょうを SHA512CryptoServiceProvider には、"System.Security.Cryptography.HashAlgorithm"を再マップをし、アプリケーションをもう一度実行 machine.config ファイルに別の行を追加します。
<cryptoClasses>
<cryptoClass MyPreferredHash="SHA512CryptoServiceProvider, System.Core, Version=3.5.0.0,
Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
</cryptoClasses>
<nameEntry name="SHA1" class="MyPreferredHash"/>
<nameEntry name="System.Security.Cryptography.HashAlgorithm" class="MyPreferredHash"/>
デバッグ出力 computeHash からはこれで正確に予想お。
System.Security.Cryptography.SHA512CryptoServiceProvider
ただし、この方法でクラスを再割り当てを予期しないとデバッグが困難の互換性の問題を作成できます。 小さい問題を引き起こしている可能性でマップすることができるアプリケーション固有のフレンドリ名を使用することを推奨です。
暗号化のアジリティの別の利点
再コンパイルしなくても、実行時に切断されたアルゴリズムを置換することができます、に加えて暗号の敏捷性はパフォーマンスを向上させるために使用できます。 場合は、System.Security.Cryptography 名前空間で検索したこと、お気付きが多くの場合、いくつかの異なる実装クラス存在する、特定のアルゴリズムの。 たとえば、SHA 512 の 3 つの異なる実装があります: SHA512Cng、SHA512CryptoServiceProvider、SHA512Managed とします。
SHA512Cng は、これらのクラスの最適なパフォーマンスを得るため、通常は提供します。 私のラップトップ (実行中の Windows 7 リリース候補) で簡単なテストことが示されます –Cng クラスは、一般に約 10% は、CryptoServiceProvider より高速 - マネージ クラスとします。 コア アーキテクチャで自分の仕事仲間を通知する状況によっては、–Cng クラスできます 10 回を他のより高速実行実際にする!
明らかに、–Cng クラスの使用は推奨、し、これらのクラスを使用するアルゴリズムの実装を再マップするには、machine.config ファイルを設定おでしたが、- Cng クラスは、すべてのオペレーティング システムでは利用できません。 Windows Vista、Windows Server 2008、および Windows 7 のみ (以降のバージョン、おそらく) –Cng をサポートします。 その他のオペレーティング システムでの –Cng クラスをインスタンス化しようとして例外をスローがします。
同様に、暗号クラス (AesManaged、RijndaelManaged、SHA256Managed という)、–Managed ファミリはなく常に、利用可能なに完全に異なる理由です。 連邦情報処理標準 140 (FIPS) 暗号化アルゴリズムと実装の標準を指定します。 このドキュメントの執筆時点で、–Cng と –CryptoServiceProvider の両方の実装クラスは、FIPS 認定しますが、–Managed クラスはありません。 さらに、FIPS 準拠アルゴリズムのみを使用できるグループ ポリシー設定を構成することができます。 いくつか U. S. カナダの政府機関の義務このポリシーの設定. コンピューターを確認する場合は、ローカル グループ ポリシー エディター (gpedit.msc) を開く、コンピューターの構成]、[Windows の設定/セキュリティの設定/ローカル ポリシー/セキュリティのオプション] ノードに移動し、設定の値を確認"システム暗号化: 使用して FIPS 暗号化、ハッシュ、署名のための準拠アルゴリズム"します。 このポリシーが有効に設定されて場合、そのコンピューター上の –Managed クラスをインスタンス化しようとしています例外がスローされます。
これらのクラスの一般も関数は指定、最悪のパフォーマンスが、すべてのプラットフォームで作業に保証最小公分母としてクラスの –CryptoServiceProvider ファミリこれにより。 この前で説明した 3 つの暗号アジリティ構文の 1 つを実装してこの問題を解決することができます、オペレーティング システムと設定に基づいてコンピューターを展開資料との再割り当て machine.config ファイルをカスタマイズします。 Windows Vista を実行しているコンピューターの再マップできます、machine.config –Cng 実装クラスを優先するお以降では、または。
<cryptoClasses>
<cryptoClass MyPreferredHash="SHA512Cng, System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
</cryptoClasses>
<nameEntry name="MyApplicationHash" class="MyPreferredHash"/>
FIPS 準拠が無効になっているとオペレーティング システムを以前の Windows Vista 実行マシンについて、–Managed クラスを優先する machine.config を再マップおできます。
<cryptoClasses>
<cryptoClass MyPreferredHash="SHA512Managed"/>
</cryptoClasses>
<nameEntry name="MyApplicationHash" class="MyPreferredHash"/>
すべて他のコンピューターは、–CryptoServiceProvider クラスにマップし直します。
<cryptoClasses>
<cryptoClass MyPreferredHash="SHA512CryptoServiceProvider, System.Core, Version=3.5.0.0,
Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
</cryptoClasses>
<nameEntry name="MyApplicationHash" class="MyPreferredHash"/>
HashAlgorithm.Create("MyApplicationHash") への呼び出し、最大業績の実装クラスをコンピューターに対応今すぐ作成します。さらに、アルゴリズムは同じであるため互換性または相互運用性の問題を心配する必要はありません。1 つのコンピューター上の指定された入力値の作成、ハッシュは、別のコンピューターで同じ入力値に対して作成されたハッシュと同じ実装クラスが異なる場合でもになります。これは、他のアルゴリズム種類もについて: AesManaged を使用して 1 つのコンピューター上の入力を暗号化および復号化正常に異なるコンピューター上で AesCryptoServiceProvider を使用してできます。
まとめ
時間と展開すると、新しいバージョンを取得できるまでユーザーに危険性を伝えますならない、切断する暗号化アルゴリズムへの応答でアプリケーションを recoding の費用をお勧めこのアイテムのみを計画および暗号アジャイルな方法でアプリケーションを作成します。入手できます、パフォーマンスが向上するこの方法をコーディングするという事実は、ケーキの着氷です。
ハードコーディング特定アルゴリズムしないまたはアプリケーションにこれらのアルゴリズムの実装します。常に暗号化アルゴリズムを次のアルゴリズムの抽象型クラスの 1 つとして宣言: HashAlgorithm、SymmetricAlgorithm、AsymmetricAlgorithm、KeyedHashAlgorithm、または HMAC。
FxCop ルールは、暗号化の機敏性を確認するは非常に便利なことだと思います。だれか、このようなルールを書き込み、Codeplex または別のパブリック コード リポジトリに投稿、できるようになります以上を与える完全貸方と [このスペースに満足、SDL のブログ.
最後に、Shawn Hernan、SQL Server のセキュリティ チームからと、専門家のフィードバックの CLR セキュリティ チームから Shawn Farkas を確認し、この資料の作成に役立つしたいとは考えています。
ごにコメントや質問、briefs@microsoft.com.
Bryan Sullivan は、セキュリティ プログラム マネージャー、マイクロソフトのセキュリティ開発ライフサイクル チームの Web アプリケーションのセキュリティ問題を専門とするフリーです。彼はAjax Security (◆ セグ: 前の TU 含まれる 2007年) の作成者です。