【发布时间】:2020-10-18 21:22:31
【问题描述】:
使用 dotnetcore C# 中的“标准”HMACSHA256 技术,我可以生成如下哈希字符串:
private static void Test()
{
var hmac = new HMACSHA256(Encoding.UTF8.GetBytes("testingkey"));
var theHash = hmac.ComputeHash(Encoding.UTF8.GetBytes("testingstringtohash"));
string signature = Convert.ToBase64String(theHash);
Console.WriteLine(signature);
}
//Produces yg/9NCAm5IIwGKJK80PyUeBWkzEUwZswvC3OVnTnT80=
在 swift 中做同样的事情(来自this 答案的解决方案似乎是人们正在使用的“标准”)
func HashTest() {
let hash = "testingstringtohash".hmac(algorithm: .SHA256, key: "testingkey")
//hash ca0ffd342026e4823018a24af343f251e056933114c19b30bc2dce5674e74fcd
let hexData = hash.data(using: String.Encoding.utf8)
let signature = hexData?.base64EncodedString()
print(signature!)
}
//Produces Y2EwZmZkMzQyMDI2ZTQ4MjMwMThhMjRhZjM0M2YyNTFlMDU2OTMzMTE0YzE5YjMwYmMyZGNlNTY3NGU3NGZjZA==
我在这里是不是很愚蠢...或者这两个值应该相同,因为它是相同的加密算法,并且相同值的相同密钥。据我所知,C# 示例产生了“正确”的结果,因为使用该示例产生的值的 web 服务工作正常,但 swift 版本产生的值失败。
【问题讨论】:
-
输入字节是否相同?十六进制数据是否相同?还是只有base64编码?缺少基本信息。
-
@TomTom 我在 swift 示例中添加了哈希输出,但在 dotnet 中添加了一个字节数组,所以我不确定比较它们的最佳方法是什么。通常,如果我想要一个字节数组中的文本,我会以 64 为基数来显示它,这就是我在每个示例中显示的签名值
-
@MarkMcGookin 使用
BitConverter.ToString(byte[] ).replace("-","")输出字节数组 -
我也不是 Swift 专家,但在 C# 中计算的哈希值是二进制值,而 swift 中的输出是它的十六进制字符串表示。
-
我之前回答过similar issue,此后经常看到这个问题。有时,当你真的不需要它时,你会得到这个十六进制字符串输出。
标签: c# swift encryption sha256 hmac