2017-02-10 39 views
13

Próbowałem zaszyfrować Amazon S3-podobnego klucza autoryzacji z HMAC-SHA1 w PowerShell z następującego kodu:Dlaczego szyfrowanie HMAC-SHA1 w dokładnie tym samym kodzie w C# i PowerShell pokazuje różne wyniki?

$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 

Ten kod wyjścia NcJQ1MapHbyRwC2FzvABYyte5uY=, który jest nieprawidłowy zgodnie z sugestią naszego usługodawcy.

Potem próbował użyć dokładnie tych samych klas w C# Kod:

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

dziwo, tym razem wynik jest poprawne: 1S+/P9zgcCCyjwUK1bPKaKeya7A=

Próbowałem też Python, i to potwierdzone C# kod. Dlaczego PowerShell napotkał niepoprawną odpowiedź, mimo że dane wejściowe, klasy i metody są dokładnie takie same z tymi, które są wywoływane w kodzie C#?

Odpowiedz

19

Dzieje się tak, ponieważ znak ucieczki w PowerShell to `while the in w C# is \.

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

Powinien dać oczekiwany wynik.

+0

Tak też myślałem, ale kiedy testuję to w ten sposób, wciąż nie osiągam oczekiwanego rezultatu. –

+2

Testowany z powershell zwraca "1S +/P9zgcCCyjwUK1bPKaKeya7A =' – Eric

+1

Pierwotne pytanie miało inny oczekiwany rezultat. Ta odpowiedź jest poprawna. Nie zawracałem sobie głowy sprawdzaniem wersji C# ... –