繁体   English   中英

在PHP中复制C#SHA256哈希

[英]Replicating C# SHA256 hash in PHP

我正在尝试访问一个API,该API需要PHP中的标头授权。 此授权部分使用带有密钥的SHA256哈希。 API的创建者向我提供了一个用C#编写的.exe来创建此哈希。 但是,现在无法使用.exe,我想在PHP中使用它。

这是构成哈希的正确C#代码。

var url = "[url]";

var userId = "apiuser";

var timestamp = "Fri, 14 Jul 2017 00:28:07 GMT"; // DateTime.UtcNow;

var keyString = "dGVzdA==";

var hashData = String.Format("GET\n{0}\n{1}\n{2}\n", url, userId, timestamp); //.ToString("r"));

var key = Convert.FromBase64String(keyString);
string hashString;

using (var hmac = new HMACSHA256(key))
{
    var hash = hmac.ComputeHash(Encoding.UTF8.GetBytes(hashData));
    hashString = Convert.ToBase64String(hash);
}
Console.WriteLine(hashString);

C#哈希:CfS6zNR3pTP0kJIA0RJ7LUwQXjONroVIg65bDvuefH8 =

这是我尝试在PHP中复制它

$key = "dGVzdA==";
$user = "apiuser";
$url = "[url]";

$timestamp = "Fri, 14 Jul 2017 00:28:07 GMT"; // date("D, d M Y H:i:s e");

$hashdata = 'GET\n' . $url . '\n' . $user . '\n' . $timestamp;

$generatedhash = base64_encode(hash_hmac('sha256', $hashdata, base64_decode($key), true));

print_r($generatedhash);

PHP哈希:6cI0NV6AKYILTyYHs + hyA0 + Q4iRfMw + H2FGsp7uKOFM =

我尝试了很多不同的方法来生成PHP哈希,但是没有一个是一样的。 另外,我不确定PHP日期是否与C#日期相同,但是可以等待。 任何帮助表示赞赏。

比较一下

var hashData = String.Format("GET\n{0}\n{1}\n{2}\n", url, userId, timestamp);

对此

$hashdata = 'GET\n' . $url . '\n' . $user . '\n' . $timestamp;

您丢失了结尾的'\\ n',正如@ Fred-ii-指出的那样,PHP只会将\\ n视为“”而不是”内的字符转义符:

$hashdata = "GET\n" . $url . "\n" . $user . "\n" . $timestamp . "\n" ;

或仅此而已,因为PHP会对“”中的变量求值:

$hashdata = "GET\n$url\n$user\n$timestamp\n" ;

PHP中的单引号与双引号:

  • 单引号'hello $ person \\ r \\ n'中的字符串将完全按书面形式使用。 而不是\\ r \\ n是回车换行对,而是4个字符'\\''r''\\''\\ n',并且$ person显示 “ $ person”。
  • 用两种方式处理双引号“ hello $ person \\ r \\ n”的字符串:1.将任何$ name视为变量,并用该变量的值替换(如果变量不存在,则为空字符串)。 2.字符转义像\\ r \\ n和\\类似其他语言。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM