繁体   English   中英

使用PHP HMAC SHA1和Base64创建身份验证字符串时遇到问题

[英]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()做什么,都是错误的。 它将整数转换为由01 字符组成的文字大写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.

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