[英]Trouble creating auth string using PHP HMAC SHA1 and Base64
因此,我正在使用此API并使用Laravel,并且正在尝试构建auth字符串。 这是我得到的文档,但是我遇到了一些麻烦,因为这对我来说是相对较新的东西。
这是auth指令:
身份验证参数是一个字符串,可以由调用方计算出来,或者调用方可以选择将此值与连接ID和API密钥一起保存为参数。
身份验证是HMAC SHA1哈希的base64字符串。 这是通过使用
##########################格式为小写,以UTF8编码为键,计算机HMAC SHA1散列在所有小写和UTF8编码格式的################################格式的连接ID。
然后对结果二进制哈希进行base64编码,然后将文本结果作为身份验证参数传递给文本。 在C#中,用于计算身份验证的代码如下所示:
HMACSHA1 hmac = new HMACSHA1( UTF8Encoding.UTF8.GetBytes(apiKey.ToString("N").ToLower()) ); string authentication = Convert.ToBase64String( hmac.ComputeHash( UTF8Encoding.UTF8.GetBytes(connectionId.ToString("N").ToLower()) ) );
例如,以下凭证:
连接ID:
5fecbc200f0e4a7cbf41040e11047e56
API密钥:
2de51c4fd0f04b9fabeb95225e87da70
应导致计算出的认证值
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
的含义到底是什么? 我找不到与此有关的任何文档。
从简单开始,使用有意义的变量名,构建并阅读docs 。
$connectionID = strtolower('5fecbc200f0e4a7cbf41040e11047e56');
$apiKey = strtolower('2de51c4fd0f04b9fabeb95225e87da70');
$hash = hash_hmac("sha1", $connectionID, $apiKey, true);
var_dump(base64_encode($hash));
输出:
string(28) "m5/Vc1RzhUETQvEtx/JdIglQpTg="
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.