无法使用 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()
,你都是不对的。它将整数转换为由 0
和 1
个字符 .
组成的文字大写 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="
所以我正在使用这个 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 ofConnection 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()
,你都是不对的。它将整数转换为由 0
和 1
个字符 .
第三: 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="