【问题标题】:Why does encrypting HMAC-SHA1 in exactly the same code in C# and PowerShell show different results?为什么在 C# 和 PowerShell 中使用完全相同的代码加密 HMAC-SHA1 会显示不同的结果?
【发布时间】:2017-06-28 06:32:30
【问题描述】:

我一直在尝试使用以下代码在 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# 代码中调用的完全一样,却遇到错误的答案?

【问题讨论】:

  • 你有完整解决方案的回购吗?我不断收到AccessDenied :(

标签: c# powershell sha1 hmac


【解决方案1】:

这是因为 PowerShell 中的转义字符是 ` 而 C# 中的转义字符是 \

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

应该会产生预期的结果。

【讨论】:

  • 我也是这么想的,但是当我这样测试时,我仍然没有得到预期的结果。
  • 用powershell测试它确实返回1S+/P9zgcCCyjwUK1bPKaKeya7A=
  • 原来的问题有不同的预期结果。这个答案是正确的。我没有费心检查 C# 版本...
  • 谢谢@Igor,你是对的,我得到了正确的结果。
  • 对不起@DanField,因为我改变了密钥,我忘了更新输出。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多