2015-09-04 46 views

回答

5

首先,將約Security.Cryptography.HMACSHA256.Create() -

Create方法是HMAC類,從中HMACSHA256導出的方法。總之:

public class HMACSHA256 : HMAC { 
... 
} 

其中HMAC被定義爲:

public abstract class HMAC : KeyedHashAlgorithm { 
    new static public HMAC Create() { 
     return Create("System.Security.Cryptography.HMAC"); 
    } 

    new static public HMAC Create (string algorithmName) { 
     return (HMAC) CryptoConfig.CreateFromName(algorithmName); 
    } 
    ... 
} 

其次,關於Security.Cryptography.KeyedHashAlgorithm.Create("HmacSHA256")

public abstract class KeyedHashAlgorithm : HashAlgorithm { 
    new static public KeyedHashAlgorithm Create(String algName) { 
     return (KeyedHashAlgorithm) CryptoConfig.CreateFromName(algName);  
    } 
    ... 
} 

正如你可以看到,這兩個調用會導致調用CryptoConfig.CreateFromName方法,但具有不同的參數值,即第一種情況下爲System.Security.Cryptography.HMAC,第二種情況下爲HmacSHA256。在內部,CryptoConfig.CreateFromName方法中有一些表格和反射邏輯。

第一次調用的結果是SHA1散列,第二次調用的結果是SHA256

+0

謝謝!那麼,爲什麼類「HMACSHA256」和「HMACSHA1」都返回「SHA1」散列? – chaaru

+0

@chaaru由於'CryptoConfig.CreateFromName'不知道任何關於'SHA256'的內容,它接收到'System.Security.Cryptography.HMAC'作爲輸入,因此它爲'HMAC'算法創建了默認值'SHA1'。 –

+1

呵呵,在Java中你會得到一個(可配置的)警告或錯誤,如果你可以調用'Create'而不指定聲明類。 VisualStudio IDE和.NET命令行編譯器中的情況不是這樣嗎?這聽起來像是對我失敗的祕訣。 –

0

沒有。 Security.Cryptography.KeyedHashAlgorithm.Create("HmacSHA256")reference source)使用反射來查找Security.Cryptography.HMACSHA256

+0

如果'HMACSHA256'類沒有「覆蓋」靜態的'Create'方法,這可能就是這種情況。 –