2

これら 2 つのコード ブロックは同じものを返しますか? 両方の例arrで同じであると仮定します。byte[]

コード例 1

HashAlgorithm a = HashAlgorithm.Create("SHA-256");
var result = a.ComputeHash(arr);

コード例 2

SHA256 b = SHA256.Create();
var result = b.ComputeHash(arr);

更新: C# で AWS 署名コードを作成するサンプル プロジェクト (.Net 4.5 で記述) を取得し、そのクラスを dotnetcode5 プロジェクトで使用しようとしてHashAlgorithm.Create()いますが、dotnetcode5 ではまだ使用できないため、使用することにしました。最初のアプローチではなく、2 番目のアプローチ。問題は、2 番目の例が AWS では無効な正規の結果を返すことです。

4

3 に答える 3

3

SHA256.Create()これを内部的に行います:

return (HashAlgorithm) CryptoConfig.CreateFromName("System.Security.Cryptography.SHA256");

HashAlgorithm.Create("SHA-256")これは次のようになります。

return (SHA256) CryptoConfig.CreateFromName("SHA-256");

これらの呼び出しの両方で、 のインスタンスが作成されますSHA256Managed

https://msdn.microsoft.com/en-us/library/system.security.cryptography.cryptoconfig(v=vs.110).aspx#Anchor_5を参照してください。

したがって、これら 2 つのアプローチに違いはありません。

于 2015-12-02T09:37:49.813 に答える
1

OPが欠落しているという主な問題は、2バイト配列を比較する方法だと思います。

次のようなことをすると:

    static void Main(string[] args)
    {           
        byte[] arr = Encoding.ASCII.GetBytes("sample");
        HashAlgorithm a = HashAlgorithm.Create("SHA-256");
        var resulthash = a.ComputeHash(arr);

        SHA256 b = SHA256.Create();
        var resultsha = b.ComputeHash(arr);

        Console.WriteLine(StructuralComparisons.StructuralEqualityComparer.Equals(resulthash, resultsha ));
    }     

正しい応答が得られます。

resulthash==resultshafalse を返すようなことはできないことに注意してください。

于 2015-12-02T09:47:38.710 に答える
0

do は内部的に同じメソッドを呼び出すため、どちらも同じ結果になります。

new static public SHA256 Create() {
    return Create("System.Security.Cryptography.SHA256");
}

new static public SHA256 Create(String hashName) {
    return (SHA256) CryptoConfig.CreateFromName(hashName);
}

static public HashAlgorithm Create(String hashName) {
    return (HashAlgorithm) CryptoConfig.CreateFromName(hashName);
}

違いは戻り値の型 (SHA256から派生したものHashAlgorithm)だけです

SHA256リファレンス、HashAlgorithm のリファレンス

于 2015-12-02T09:39:42.850 に答える