[英]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中的单引号与双引号:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.