为什么在 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 的 post 很有用,但是我还必须像这样创建我的 HMACSHA1
实例:
$sha = New-Object System.Security.Cryptography.HMACSHA1
我一直在尝试使用以下代码在 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 的 post 很有用,但是我还必须像这样创建我的 HMACSHA1
实例:
$sha = New-Object System.Security.Cryptography.HMACSHA1