SHA1CryptoServiceProvider和HMACSHA1有什么区别

时间:2019-06-05 17:23:52

标签: c# encryption hash oauth cryptography

我想知道这些散列函数之间的区别:

System.Security.Cryptography

他们似乎返回了不同的结果。过去,我已经成功地将HMACSHA1和密钥一起使用了。

但是现在我需要一个无密钥哈希,并且SHA1CryptoServiceProvider似乎正在返回正确的结果。这让我想知道为什么我需要突然切换到另一个班级。很难找到有关此的信息。示例:

// y1 = "2jmj7l5rSw0yVb/vlWAYkK/YBwk=" (seems correct)
var f1 = new SHA1CryptoServiceProvider();
string y1 = Convert.ToBase64String(f1.ComputeHash(new byte[] { }));

// y2 = "+9sdGxiqbAgyS31ktx+3Y3BpDh0=" (seems wrong)
HMAC f2 = HMACSHA1.Create();
f2.Key = new byte[]{};
string y2 = Convert.ToBase64String(f2.ComputeHash(new byte[] { }));

编辑

上下文:我正在尝试用SHA512实现OAuth 1.0,因为我找不到能做到这一点的.NET库(我知道SHA1很弱)。我已经使用HMACSHA1.Create()进行了签名计算,尽管其中一位指出,Create调用可能未达到我的期望。我正在研究实现oauth_body_hash参数:

https://tools.ietf.org/id/draft-eaton-oauth-bodyhash-00.html#anchor16

那是当我注意到HMACSHA1.Create()不能创建正确的哈希,即使它适用于oauth_signature。 SHA1CryptoServiceProvider确实适用于oauth_body_hash。使用SHA1的想法是在线上有更多示例。之后,我想将其更改为SHA512

2 个答案:

答案 0 :(得分:0)

首先,您不应该使用sha1。使用sha256。

区别在于HMAC是键控哈希。这意味着哈希输出基于给定的键。例如,带有键“ 123”的“ test”的哈希值不同于带有键“ 456”的“ test”的哈希值

维基百科:https://de.wikipedia.org/wiki/Keyed-Hash_Message_Authentication_Code

答案 1 :(得分:0)

HMAC是MAC的一种,即消息认证代码。它在您需要时使用验证您收到的消息确实来自您信任的人(即您拥有验证密钥)。

SHA-1只是一个未经任何验证的哈希函数,即只是一个指纹。可以使用例如验证下载的文件ix是否正确(即,如果您知道某个网站的哈希值,则可以下载文件,计算哈希值并确定其等于给定的哈希值)

此外,我建议不要编写自己的OAuth库,除非您真的知道自己在做什么,或者有其他建议(即众所周知的受信任的库)建议使用。