13
我一直试图在PowerShell中使用下面的代码进行加密与HMAC-SHA1一个亚马逊S3般的授权密钥:为什么在C#和PowerShell中用完全相同的代码加密HMAC-SHA1会显示不同的结果?
$str="PUT\n\napplication/x-zip-compressed\nThu, 09 Feb 2017 08:59:43 GMT\n/test-bucket/test-key"
$secret="c334da95a6734ff4a04abd99efca450f"
$sha = [System.Security.Cryptography.KeyedHashAlgorithm]::Create("HMACSHA1")
$sha.Key = [System.Text.Encoding]::UTF8.Getbytes($secret)
$sign = [Convert]::Tobase64String($sha.ComputeHash([System.Text.Encoding]::UTF8.Getbytes(${str})))
echo $sign
此代码输出NcJQ1MapHbyRwC2FzvABYyte5uY=
,根据我们的服务供应商的建议,这是不正确。
然后我试图在C#代码中使用完全一样的类:
static void Main(string[] args)
{
var str = "PUT\n\napplication/x-zip-compressed\nThu, 09 Feb 2017 08:59:43 GMT\n/test-bucket/test-key";
var secret = "c334da95a6734ff4a04abd99efca450f";
var sha = System.Security.Cryptography.KeyedHashAlgorithm.Create("HMACSHA1");
sha.Key = System.Text.Encoding.UTF8.GetBytes(secret);
Console.WriteLine(Convert.ToBase64String(sha.ComputeHash(System.Text.Encoding.UTF8.GetBytes(str)))); //1S+/P9zgcCCyjwUK1bPKaKeya7A=
Console.Read();
}
奇怪的是,这一次,结果是正确的:1S+/P9zgcCCyjwUK1bPKaKeya7A=
我也试过Python和它平反C#码。即使输入,类和方法与C#代码中调用的输入,类和方法完全相同,为什么PowerShell会遇到错误答案?
这就是我的想法,但是当我以这种方式测试时,我仍然没有得到预期的结果。 –
使用powershell测试它确实返回了'1S +/P9zgcCCyjwUK1bPKaKeya7A =' – Eric
原始问题有不同的预期结果。这个答案是正确的。我没有打扰检查C#版本... –