SHA256.Create()和HashAlgorithm.Create(“SHA-256”)之间有什么区别吗?

时间:2015-12-02 09:27:49

标签: c# cryptography sha256 hashalgorithm

这两个代码块是否会返回相同的内容?假设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中不可用,我已经决定了使用第二种方法而不是第一种方法。问题是第二个示例返回了在AWS中无效的规范结果。

3 个答案:

答案 0 :(得分: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

因此这两种方法没有区别。

答案 1 :(得分:1)

我认为OP缺少的主要问题是如何比较两个字节数组。

如果您执行以下操作:

    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 ));
    }     

你会得到正确的回应。

请注意,您不能执行会返回false的resulthash==resultsha

答案 2 :(得分: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

Reference for SHA256Reference for HashAlgorithm