与 Salesforce 相比,C# 的 HMAC SHA512 值太短?
C#'s HMAC SHA512 value too short compared to Salesforce's?
为什么我从 Salesforce 的 Apex 和 C# 中得到不同的 mac 值?
我有以下 C# 代码来生成签名:
using (var hmacSha512 = System.Security.Cryptography.HMACSHA512.Create())
{
byte[] payload = System.Text.Encoding.UTF8.GetBytes("payload");
hmacSha512.Key = System.Text.Encoding.UTF8.GetBytes("key");
byte[] macBytes = hmacSha512.ComputeHash(payload);
string mac = BitConverter.ToString(macBytes).Replace("-", string.Empty).ToLower();
Console.WriteLine(mac);
}
并且我尝试在 Apex 中实现相应的代码:
Blob payload = Blob.valueOf('payload');
Blob key = Blob.valueOf('key');
Blob macBlob = Crypto.generateMac('hmacSHA512', payload, key);
string mac = EncodingUtil.convertToHex(macBlob);
System.debug(mac);
但是我得到的结果不一样:
C#: 2f3902cd1626fa7fdfb67e93109f50412ad71531
Apex: 185beceee65a5ed7e43f7cc98530bfab1b0d00679488a47225255d04594fd7f17ed6908e7a08df57ac14c9e56c2fdef83ee9adaf9df2ff9f61465898c5d78c00
如您所见,Apex 结果明显长于 C# 等效结果。当然,我决定检查 Blob->Hex 是否按我预期的方式工作,方法是还以十六进制打印有效负载和键值:
// C#:
Console.WriteLine(BitConverter.ToString(payload).Replace("-", string.Empty).ToLower());
Console.WriteLine(BitConverter.ToString(hmacSha512.Key).Replace("-", string.Empty).ToLower());
// Results:
// 7061796c6f6164
// 6b6579
// Apex:
System.debug(EncodingUtil.convertToHex(payload));
System.debug(EncodingUtil.convertToHex(key));
// Results:
// 7061796c6f6164
// 6b6579
所以 blob 值是我所期望的,并且转换为十六进制的工作(不出所料)如我所料。
如果我在 this online service 上尝试相同的负载和组合键,我会得到与 Salesforce 相同的值。甚至 Java 也与 Salesforce 相同。这让我认为 C# 实现不正确,但我不明白为什么。
我认为也许我需要手动散列 SHA512 并将其传递给 HMCSHA512,但这对长度没有影响。
我在 C# 实现中做错了什么?
看来我真的想用KeyedHashAlgorithm
和"HmacSHA512":
using (var hmacSha512 = System.Security.Cryptography.KeyedHashAlgorithm.Create("HmacSHA512"))
我意识到这在 .NET Core 中不起作用(它在 运行 调用 Create 方法时抛出异常),所以我将其更改为:
using (var hmacSha512 = new System.Security.Cryptography.HMACSHA512())
我不太确定为什么这会提供不同的结果,但是当我 运行 它确实得到与 Apex 相同的结果时:
185beceee65a5ed7e43f7cc98530bfab1b0d00679488a47225255d04594fd7f17ed6908e7a08df57ac14c9e56c2fdef83ee9adaf9df2ff9f61465898c5d78c00
为什么我从 Salesforce 的 Apex 和 C# 中得到不同的 mac 值?
我有以下 C# 代码来生成签名:
using (var hmacSha512 = System.Security.Cryptography.HMACSHA512.Create())
{
byte[] payload = System.Text.Encoding.UTF8.GetBytes("payload");
hmacSha512.Key = System.Text.Encoding.UTF8.GetBytes("key");
byte[] macBytes = hmacSha512.ComputeHash(payload);
string mac = BitConverter.ToString(macBytes).Replace("-", string.Empty).ToLower();
Console.WriteLine(mac);
}
并且我尝试在 Apex 中实现相应的代码:
Blob payload = Blob.valueOf('payload');
Blob key = Blob.valueOf('key');
Blob macBlob = Crypto.generateMac('hmacSHA512', payload, key);
string mac = EncodingUtil.convertToHex(macBlob);
System.debug(mac);
但是我得到的结果不一样:
C#: 2f3902cd1626fa7fdfb67e93109f50412ad71531
Apex: 185beceee65a5ed7e43f7cc98530bfab1b0d00679488a47225255d04594fd7f17ed6908e7a08df57ac14c9e56c2fdef83ee9adaf9df2ff9f61465898c5d78c00
如您所见,Apex 结果明显长于 C# 等效结果。当然,我决定检查 Blob->Hex 是否按我预期的方式工作,方法是还以十六进制打印有效负载和键值:
// C#:
Console.WriteLine(BitConverter.ToString(payload).Replace("-", string.Empty).ToLower());
Console.WriteLine(BitConverter.ToString(hmacSha512.Key).Replace("-", string.Empty).ToLower());
// Results:
// 7061796c6f6164
// 6b6579
// Apex:
System.debug(EncodingUtil.convertToHex(payload));
System.debug(EncodingUtil.convertToHex(key));
// Results:
// 7061796c6f6164
// 6b6579
所以 blob 值是我所期望的,并且转换为十六进制的工作(不出所料)如我所料。
如果我在 this online service 上尝试相同的负载和组合键,我会得到与 Salesforce 相同的值。甚至 Java 也与 Salesforce 相同。这让我认为 C# 实现不正确,但我不明白为什么。
我认为也许我需要手动散列 SHA512 并将其传递给 HMCSHA512,但这对长度没有影响。
我在 C# 实现中做错了什么?
看来我真的想用KeyedHashAlgorithm
和"HmacSHA512":
using (var hmacSha512 = System.Security.Cryptography.KeyedHashAlgorithm.Create("HmacSHA512"))
我意识到这在 .NET Core 中不起作用(它在 运行 调用 Create 方法时抛出异常),所以我将其更改为:
using (var hmacSha512 = new System.Security.Cryptography.HMACSHA512())
我不太确定为什么这会提供不同的结果,但是当我 运行 它确实得到与 Apex 相同的结果时:
185beceee65a5ed7e43f7cc98530bfab1b0d00679488a47225255d04594fd7f17ed6908e7a08df57ac14c9e56c2fdef83ee9adaf9df2ff9f61465898c5d78c00