2017-02-10 20 views
13

Tôi đã cố gắng để mã hóa một khóa ủy quyền Amazon S3 giống như với HMAC-SHA1 trong PowerShell với đoạn mã sau:Tại sao mã hóa HMAC-SHA1 trong cùng một mã trong C# và PowerShell hiển thị các kết quả khác nhau?

$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 

Mã này ra NcJQ1MapHbyRwC2FzvABYyte5uY=, đó là không đúng theo đề nghị cung cấp dịch vụ của chúng tôi.

Sau đó, tôi đã cố gắng để sử dụng chính xác các lớp học tương tự trong C# mã:

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

Lạ lùng thay, lần này, kết quả là đúng: 1S+/P9zgcCCyjwUK1bPKaKeya7A=

Tôi cũng đã cố gắng Python, và nó minh oan C# mã. Tại sao PowerShell chạy vào một câu trả lời không chính xác mặc dù các đầu vào, các lớp và các phương thức là chính xác giống với những gì được gọi trong mã C#?

Trả lời

19

Đó là do ký tự thoát trong PowerShell là `trong khi ký tự thoát trong C# là \.

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

Nên mang lại kết quả mong đợi.

+0

Đó cũng là những gì tôi nghĩ, nhưng khi tôi thử nghiệm theo cách đó tôi vẫn không nhận được kết quả mong đợi. –

+2

Thử nghiệm với powerhell nó trả về '1S +/P9zgcCCyjwUK1bPKaKeya7A =' – Eric

+1

Câu hỏi ban đầu có kết quả mong đợi khác. Câu trả lời này là chính xác. Tôi không bận tâm kiểm tra phiên bản C# ... –

Các vấn đề liên quan