2015-09-04 61 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'方法,这可能就是这种情况。 –