2017-02-10 12 views
13

は、私は次のコードでPowerShellでHMAC-SHA1とAmazon 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=、当社のサービスプロバイダーの提案に従って、間違っていました。奇妙なことに

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(); 
} 

、この時間は、結果が正しい:

は、その後、私はC#のコードで正確に同じクラスを使用しようとした 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#のバージョンを確認することを迷惑しませんでした... –