无法使用 PHP HMAC SHA1 和 Base64 创建身份验证字符串

Trouble creating auth string using PHP HMAC SHA1 and Base64

所以我正在使用这个 API 并使用 Laravel,并且我正在尝试构建一个身份验证字符串。这是给我的文档,但我遇到了一些麻烦,因为这对我来说是相对较新的东西。

以下是授权说明:

The authentication parameter is a string and it can calculated by the caller or the caller can choose to save this value as a parameter together with connection ID and API key.

The authentication is a base64 string of a HMAC SHA1 hash. This is computed by using the binary of API Key in in

########################## format in all lower case and UTF8 encoding as the key and computer HMAC SHA1 hash on the binary of

Connection ID in ################################ format in all lower case and UTF8 encoding.

The result binary hash is then base64 encoded and the text result is what should be passed as the authentication parameter. In C# the code to calculate the authentication may look like:

HMACSHA1 hmac = new HMACSHA1(
  UTF8Encoding.UTF8.GetBytes(apiKey.ToString("N").ToLower())
);
string authentication = Convert.ToBase64String(
  hmac.ComputeHash(
    UTF8Encoding.UTF8.GetBytes(connectionId.ToString("N").ToLower())
  )
);

As an example the following credentials:

Connection ID: 5fecbc200f0e4a7cbf41040e11047e56

API Key: 2de51c4fd0f04b9fabeb95225e87da70

Should result in a computed authentication value of m5/Vc1RzhUETQvEtx/JdIglQpTg=

所以我一直在尝试的是:

$a = strtolower('5fecbc200f0e4a7cbf41040e11047e56');
$b = strtolower('2de51c4fd0f04b9fabeb95225e87da70');
$z = hash_hmac("sha1", utf8_encode(decbin($b)), utf8_encode(decbin($a)), true);
dd(base64_encode($z));

输出QjG3kzUs7U1UukNd++3t24pBWNk=

我尝试了更多变体,但我只是迷失在这个变体上。第一次真正解码或编码任何东西。非常感谢任何可以帮助我解决这个问题的提示、想法或片段。已经花了几个小时在这上面,这让我很烦..

首先:去掉utf8_encode(),一般不用。它假设输入字符串是 ISO-88591-1,如果它是 其他任何东西 它会默默地破坏数据。这个函数有一个令人难以置信的误导性名称,我什至建议任何人都不应该使用它或相应的 utf8_decode(),它会以相同的方式破坏您的数据,但相反。

如果您需要在 PHP 中转换字符串编码,请使用 显式 定义输入 输出编码的内容,例如:mb_convert_encoding()。 [你仍然不需要它]

其次:无论你怎么想decbin(),你都是不对的。它将整数转换为由 01 个字符 .

组成的文字大写 S 字符串

第三: PHP 字符串 没有内在编码 并且大致相当于字节数组,如果你扭曲我的手臂说明。您放入其中的字节就是您从中取出的字节。

第四:我不完全是 C# 专家[或中级,甚至 初学者],但该示例代码太可怕了。 connectionId.ToString("N")中的N到底有什么意义呢?我找不到任何关于此的文档。

从简单开始,使用有意义的变量名,进行构建,然后阅读文档

$connectionID = strtolower('5fecbc200f0e4a7cbf41040e11047e56');
$apiKey       = strtolower('2de51c4fd0f04b9fabeb95225e87da70');
$hash         = hash_hmac("sha1", $connectionID, $apiKey, true);
var_dump(base64_encode($hash));

输出:

string(28) "m5/Vc1RzhUETQvEtx/JdIglQpTg="