2017-02-10 89 views
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会遇到错误答案?

回答

19

这是因为PowerShell中的转义字符是'而C#中的转义字符是\

$str = "PUT`n`napplication/x-zip-compressed`nThu, 09 Feb 2017 08:59:43 GMT`n/test-bucket/test-key" 

应该产生预期的结果。

+0

这就是我的想法,但是当我以这种方式测试时,我仍然没有得到预期的结果。 –

+2

使用powershell测试它确实返回了'1S +/P9zgcCCyjwUK1bPKaKeya7A =' – Eric

+1

原始问题有不同的预期结果。这个答案是正确的。我没有打扰检查C#版本... –

相关问题