2017-02-10 1 views
13

나는 다음 코드를 사용하여 PowerShell에서 HMAC-SHA1와 아마존 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=

나는 또한 파이썬을 시도하고는 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# 버전을 확인하는 것을 귀찮게하지 않았습니다 ... –

관련 문제