web-dev-qa-db-ja.com

MD5.CreateとMD5CryptoServiceProviderの使用の違いは何ですか?

.NET Frameworkでは、MD5ハッシュを計算する方法がいくつかあるようですが、私には理解できないことがあります。

次の違いは何ですか?それらを互いに区別するものは何ですか?それらは同じ結果を生み出すようです:

    public static string GetMD5Hash(string str)
    {
        MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
        byte[] bytes = ASCIIEncoding.Default.GetBytes(str);
        byte[] encoded = md5.ComputeHash(bytes);

        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < encoded.Length; i++)
            sb.Append(encoded[i].ToString("x2"));

        return sb.ToString();
    }

    public static string GetMD5Hash2(string str)
    {
        System.Security.Cryptography.MD5 md5 = System.Security.Cryptography.MD5.Create();
        byte[] bytes = Encoding.Default.GetBytes(str);
        byte[] encoded = md5.ComputeHash(bytes);

        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < encoded.Length; i++)
            sb.Append(encoded[i].ToString("x2"));

        return sb.ToString();
    }
39
dreadwail

System.Security.Cryptography.MD5.Create()は、実際にはMD5CryptoServiceProviderを作成しています。そのため、同じ結果が表示されます。

定義を見ると、MD5は基本クラスであり、抽象的です。使いやすさのためにパブリック作成機能が追加されたと思います。

public sealed class MD5CryptoServiceProvider : MD5

public abstract class MD5 : HashAlgorithm

定義を見てください。

MD5 MD5ハッシュアルゴリズムのすべての実装が継承する抽象クラスを表します。

MD5CryptoServiceProvider 暗号化サービスプロバイダー(CSP)によって提供される実装を使用して、入力データのMD5ハッシュ値を計算します。このクラスは継承できません。

32
Jason Rowe

Jason Roweが述べたように(彼の答えに投票してください。これは単なる警告です)、機能的な違いはありません。ただし、MD5Managed(または名前にManagedが含まれる暗号化クラス)を検討している場合は違いがあります。 Managed-FIPS準拠の暗号化アルゴリズムがグループポリシーで有効になっている場合、名前付きクラスは使用できません。

10
user203570

私の2セント。

MD5は少しオーバーヘッドを追加し、遅いMD5CryptoServiceProviderと比較して

文字列の300kハッシュを生成する小さなストレステストを実行しました。

MD5CryptoServiceProvider: 00:00:01.1750834
MD5: 00:00:01.6398959

ほぼ1.5倍遅くなります。

PS。 i7コアラップトップでテスト済み

2
jazzcat

次のいずれかの方法でMD5CryptoServiceProviderオブジェクトを作成することもできます。
(MD5CryptoServiceProvider)HashAlgorithm.Create( "MD5");
(MD5CryptoServiceProvider)HashAlgorithm.Create( "System.Security.Cryptography.MD5");

MD5は標準アルゴリズムであり、コードが同じであるためではなく、すべてのMD5クラスが同じハッシュを返します。

ただし、MD5CryptoServiceProviderオブジェクトを作成する方法だけが選択肢ではありません。

Windowsを実行している米国政府のコンピューターでは、FIPSモードを有効にする必要があります。このモードでは、使用される暗号化コードがNISTで検証されていることが保証されます。

さまざまな.NET暗号化クラスは通常、いくつかのバージョンで存在します。 1つのバージョンは純粋な.NETコードを使用し、他のバージョンはWin32API暗号化関数を呼び出します。

さまざまなWin32暗号化APIは次のとおりです。

  • Windows NT 4暗号化API:CAPI(CryptoAPI)。私の理解では、CSP(Cryptographic Service Provider)はCryptoAPIの上の暗号化APIです。
  • Windows Vista暗号化API:[〜#〜] cng [〜#〜](Cryptography Next Generation)

Microsoftによると、Cryptographic Service Providerは非推奨であり、将来のWindowsバージョンで削除される可能性があり、CNGはCryptoAPIの長期的な代替品であるとのことです。

.NET暗号化クラス名には通常、次の接尾辞が付いています。

  • CryptoAPI Win32 APIを呼び出すクラスの場合は「CryptoServiceProvider」。
  • CNG Win32 APIを呼び出すクラスの場合は「Cng」。
  • 純粋な.NETコードクラスの場合は「Managed」。

一部のWin32APIはFIPSに準拠していない可能性があり、非公開の理由でMicrosoftが要求しなかったか、暗号化.NET純粋コードの検証を取得できなかったようですFIPS 。

FIPS準拠していないクラスは、FIPSモードが有効になっているコンピューターでCryptographicExceptionを発生させます。これは、ドキュメントに記載されています。

したがって、プログラムが米国政府のPCで実行することを意図していない場合は、最速のクラスを自由に使用できます。

MD5については、クラス名が示すように、MD5CryptoServiceProviderクラスは非常に古く非推奨のCryptoAPIを呼び出す必要があり、FIPS準拠ですが、MD5CngクラスはCNG APIを呼び出し、FIPS準拠。これは、MD5が将来のWindowsバージョンの米国政府のコンピューターで使用できない可能性があることを示しています。実際、MD5 .NETクラスのドキュメントでは、MD5をSHA256またはSHA512に置き換えることを推奨しています。

FIPSに関するMicrosoftのあいまいな立場の詳細については、以下を参照してください。
https://blogs.technet.Microsoft.com/secguide/2014/04/07/why-were-not-recommending-fips-mode-anymore/

MD5CryptoServiceProviderは、.NET Framework1.1から存在します。 MD5CryptoServiceProviderクラスはWindows XPの時点で追加されました。その時点では、基盤となるWin32 CNG APIは存在しませんでした。したがって、MD5.Createメソッドにはアルゴリズムの選択肢がなく、MicrosoftはおそらくまだCNGの実装を計画していませんでした。 Windows上。MD5Cngは、CNGがVistaに追加された後、.NET Framework3.5以降に存在します。

MD5CryptoServiceProviderと比較したおおよその実行時間(低いほど良い):
MD5Cng:x 1.08(.NET Framework 3.5)
SHA256CryptoServiceProvider:x 2.5(.NET Framework 3.5)
SHA256Cng:x 2.4(.NET Framework 3.5)
SHA256Managed:x 4.8(.NET Framework 1.1)

これらの予期しない結果は、SHA256Managed.NETの純粋なコードの実装が遅いことを示しています。
SHA256Managedが実装された時点では、パフォーマンスの高いWindows VistaCNGは存在しませんでした。

ストリームで実行すると、バイト配列よりも実行が常に少し速くなります。

この投稿をハッシュして、外国のエージェントによって変更されていないことを確認します。
1c84TiredWithMSDNwrittenByAncientEgyptians4cfebef40b0ae0a906b97c7

1
figolu