2017-02-10 3 views
13

J'ai essayé de chiffrer une clé d'autorisation Amazon S3 comme avec HMAC-SHA1 dans PowerShell avec le code suivant:Pourquoi le cryptage de HMAC-SHA1 dans exactement le même code dans C# et PowerShell montre-t-il des résultats différents?

$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 

Ce sorties de code NcJQ1MapHbyRwC2FzvABYyte5uY=, ce qui est incorrect selon la suggestion de notre fournisseur de services.

Alors j'ai essayé d'utiliser exactement les mêmes classes dans le code 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(); 
} 

Étrangement, cette fois, le résultat est correct: 1S+/P9zgcCCyjwUK1bPKaKeya7A=

J'ai aussi essayé Python, et il justifia le C# code. Pourquoi PowerShell a-t-il rencontré une réponse incorrecte alors que les entrées, les classes et les méthodes sont exactement les mêmes que celles qui sont appelées dans le code C#?

Répondre

19

Il est parce que le caractère d'échappement dans PowerShell est `alors que celui en C# est \.

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

Doit produire le résultat attendu.

+0

C'est ce que je pensais aussi, mais quand je teste cette façon, je ne comprends toujours pas le résultat attendu. –

+2

testé avec Powershell il ne retourne '1S +/P9zgcCCyjwUK1bPKaKeya7A =' – Eric

+1

La question initiale avait un autre résultat attendu. Cette réponse est correcte. Je n'ai pas pris la peine de vérifier la version C# ... –