Я пытаюсь зашифровать ключ авторизации Amazon S3 как HMAC-SHA1 в PowerShell со следующим кодом:
$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();
}
Как ни странно, на этот раз результат правильный: 1S+/P9zgcCCyjwUK1bPKaKeya7A=
Я также попробовал Python, и он подтвердил код С#. Почему PowerShell столкнулся с неправильным ответом, даже если входы, классы и методы в точности совпадают с теми, которые вызывают в коде С#?