.NETフレームワークに管理されたMD5実装がないのはなぜですか?
-
05-07-2019 - |
質問
(質問を書き直しました。元の履歴をご覧ください)。
質問はタイトルのすぐそこにあります。
.NETフレームワークに管理されたMD5実装がないのはなぜですか?
具体的には、.NETフレームワーク内には存在しないMD5アルゴリズムの純粋に管理されたコードの実装について話しています。
System.Security.Cryptography名前空間内では、 MD5 抽象基本クラス(継承する必要があり、そのまま使用することはできません)を認識しています。 OSの基盤となるCSP(暗号化サービスプロバイダー)およびCNG(暗号化次世代)プロバイダーの実装を提供する MD5CryptoServiceProvider および MD5CNG の両方ですが、これらの実装は両方とも< strong>アンマネージコード。
回答の更新:
ありがたいことに、あるべき&quot; 1つの真の答え&quot;この質問に対して、マイクロソフトフレームワークデザイナー(または直接知っている人)がこのコミュニティに参加しない限り、私たち(SOコミュニティ)はそれを知らないかもしれませんが、多くの人々は非常に合理的な「教育的推測」を提供しています。ただし、フレームワークから管理されたMD5実装を省略することにした考え方については、「本当」を知っている人がいるかどうかを知りたいと思っています。この質問に答えてください。
解決
フレームワークを設計しなかったので、確実に言うことはできませんが、セキュリティ上の理由からその使用を思いとどまらせるためにおそらく気にかけなかったと思います。
もともとアンマネージ実装の方が高速だと思っていましたが、そうではないことがわかっています。 https:/ /stackoverflow.com/a/14850676/58391
次の最良の推測は、上記のコメントでPavelが述べていることと一致しています。 .NETおよびC#のほとんどの機能と同様に、基盤となるアンマネージド機能がすでに十分であった場合、機能を実装、テスト、および出荷するためのコストに対して十分なメリットはなかったでしょう。
言語を設計した人からの本当の答えを見るのは面白いでしょう。
他のヒント
MD5CryptoServiceProvider は実際の初日からの.NET Framework:
byte[] hash = new MD5CryptoServiceProvider().
ComputeHash(Encoding.ASCII.GetBytes("Hello World!"));
ハッシュアルゴリズムをカプセル化するすべての.NET BCLクラスは、 HashAlgorithm クラス。これらは多態的に使用できます...
public byte[] ComputeHash(byte[] buffer, HashAlgorithm hashAlgorithm)
{ ...
...そして、異なる実装をコードに依存性注入することができます:
public HashAlgorithm HashAlgorithm { get; set; }
編集
ああ、なるほど。 MD5(これは純粋な推測です)のことは、最も広く使用されているハッシュアルゴリズムの1つであり、そのため、その実装は特定の標準、より具体的には FIPS 140-1 。詳細については、こちらをご覧ください。
これは、さまざまなMicrosoftブロガーからの多くの投稿を読んだことに基づく推測です(ただし、この決定を下した特定の人物ではありません)。 .NETフレームワークには、管理されたMD5実装はありません。理由は次のとおりです。
1)実装は、アンマネージWindows Crypto APIから既に利用可能であり、基盤となるアンマネージから既にラップできるものを実装するためにリソースを投入する余裕がない、またはより良いことをしたと思われる実装。彼らがなぜこの決定をするのかについてのさらなる洞察は、を読むことで見つけることができます。電球を変更するためにマイクロソフトの従業員は何人ですか?、マイナス100ポイント(C#コンパイラに適用されますが、リソースを最も有効に使用するのと同じ考え方を示します)、 C#が「トップレベル」を実装しない理由メソッド?(1つの機能に必要なリソースをもう一度見ます)およびデフォルトでは機能は存在しません(こちら)。これらはどれも特定の質問に答えるものではありませんが、それらはすべて、新しいコードを書くには多くのリソースが必要であることを示しています。基礎となるアンマネージコードのラッピングには依然としてリソースが必要であると主張できますが、既に利用可能、テスト済み、機能しているコードを書き直さないことで純節約になると疑う余地はありません。
2)その後、またはほぼ同時期に、研究により実現可能性が証明されたMD5に対する衝突攻撃の例。その時点で、マネージコードでMD5を書き直すための既に高いバーは、おそらくさらに高くなりました。セキュリティ開発ライフサイクルがを決定したら、禁止された暗号を使用しないでください MD5のマネージドバージョンは、リソースを割り当てる最後のものになると想像できます。
私の答えは完全に推測ですが、Microsoftでさえもリソースが限られており、多くの機能を含めたいと考えていることを理解することは難しくありません。選択を行う必要があり、それらの決定はほとんど常に開発者の特定のセグメントに影響します。
最後に、サードパーティのMD5Managedクラスがある、または roll自分のもの。 MD5の管理バージョンは、&quot; 5分間の機能&quot;ですが、本当にそうであれば、プログラマーとして自分で書くことができます。
MD5は、送信エラーを検出する可能性のあるエラーを除き、暗号化またはファイル検証の目的には適していません。これはおそらく、人々をSHA-1や望ましいSHA-256などのより良いハッシュに移動させる努力です。
.NETでは、CryptoServiceProviderで終わるものはすべて、アンマネージWindows Crypto APIをラップします。 Managedで終わるものはすべて、完全にマネージ言語で書かれています。 リンクテキスト
他の人が言ったように、あなたはもうMD5を使うべきではありません。 .NETでマネージ実装を行うSHA-256を使用する必要があります。より良いアルゴリズムに取り掛かることができます。 (編集)MD5はもはやコーシャーではないので、これを今後使用するべきではないため、これが.NETの以降のバージョンで更新されて完全に管理される可能性はほとんどありません。
最初から存在しています
// Create a new instance of the MD5CryptoServiceProvider object.
MD5 md5Hasher = MD5.Create();
// Convert the input string to a byte array and compute the hash.
byte[] data = md5Hasher.ComputeHash(Encoding.Default.GetBytes(input));
// Create a new Stringbuilder to collect the bytes
// and create a string.
StringBuilder sBuilder = new StringBuilder();
// Loop through each byte of the hashed data
// and format each one as a hexadecimal string.
for (int i = 0; i < data.Length; i++)
{
sBuilder.Append(data[i].ToString("x2"));
}
// Return the hexadecimal string.
string hexMD5hash = sBuilder.ToString();