Почему шифрование HMAC-SHA1 в одном и том же коде в C# и PowerShell показывает разные результаты?

Я пытался зашифровать ключ авторизации Amazon S3 с помощью HMAC-SHA1 в PowerShell со следующим кодом:

$str="PUTnnapplication/x-zip-compressednThu, 09 Feb 2017 08:59:43 GMTn/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 = "PUTnnapplication/x-zip-compressednThu, 09 Feb 2017 08:59:43 GMTn/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#. Почему в PowerShell запустить неправильный ответ, даже если входные данные, классы и методы точно такие же, как и те, которые вызываются в коде C#?

1 ответов


это потому, что escape-символ в PowerShell " в то время как один в C# является \.

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

должен дать ожидаемый результат.