簡體   English   中英

為什么在 C# 和 PowerShell 中用完全相同的代碼加密 HMAC-SHA1 會顯示不同的結果?

[英]Why does encrypting HMAC-SHA1 in exactly the same code in C# and PowerShell show different results?

我一直在嘗試使用以下代碼在 PowerShell 中使用 HMAC-SHA1 加密類似 Amazon S3 的授權密鑰:

$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= ,根據我們服務提供商的建議,這是不正確的。

然后我嘗試在 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();
}

奇怪的是,這一次,結果是正確的: 1S+/P9zgcCCyjwUK1bPKaKeya7A=

我還嘗試了 Python,它驗證了 C# 代碼。 為什么 PowerShell 的輸入、類和方法與 C# 代碼中調用的完全相同,但答案卻不正確?

這是因為PowerShell中的轉義字符是`而C#中的轉義符是\\

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

應該產生預期的結果。

@Igor 的帖子很有用,但是我還必須像這樣創建HMACSHA1實例:

$sha = New-Object System.Security.Cryptography.HMACSHA1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM