.NET的HMAC和HMAC KeyedHashAlgorithm有什么区别?

3

Security.Cryptography.HMACSHA256.Create()Security.Cryptography.KeyedHashAlgorithm.Create("HmacSHA256") 有什么区别?


这两个方法都是用于创建HMAC-SHA256(使用SHA-256散列算法和密钥的哈希消息认证码)对象。主要区别在于第二种方法允许您选择哈希算法和密钥大小,而第一种方法使用默认值。因此,如果您需要更高级的控制,则可以使用第二种方法创建对象。

好的,不错。可能是C#谜题书或混淆C#竞赛的一部分 :) - Maarten Bodewes
2个回答

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

谢谢!那么为什么HMACSHA256HMACSHA1这两个类都返回SHA1哈希值呢? - chaaru
@chaaru 因为CryptoConfig.CreateFromNameSHA256一无所知,它接受System.Security.Cryptography.HMAC作为输入,因此它会为HMAC算法创建默认的SHA1 - Ulugbek Umirov
1
嘿,在Java中,如果您在不指定声明类的情况下调用“Create”,则会收到(可配置的)警告或错误。在VisualStudio IDE和.NET命令行编译器中也是这样吗?对我来说,这听起来像一个失败的配方。 - Maarten Bodewes
@MaartenBodewes 我无法强制编译器为此生成警告。在VS2015中,唯一的选择是将HMACSHA256.Create简化为HMAC.Create - Ulugbek Umirov
这至少算是一些进展吧。感谢您查看此内容;希望这能防止其他人不得不寻找相同的选项。如果有人正在为C#编写静态代码分析器,那么这个应该在其中。 - Maarten Bodewes

0

没有什么特别的。 Security.Cryptography.KeyedHashAlgorithm.Create("HmacSHA256") (参考来源) 使用反射来查找 Security.Cryptography.HMACSHA256


如果HMACSHA256类“覆盖”了静态的Create方法,那么这可能是情况。 - Maarten Bodewes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接