【问题标题】:Trouble creating auth string using PHP HMAC SHA1 and Base64使用 PHP HMAC SHA1 和 Base64 创建身份验证字符串时遇到问题
【发布时间】:2019-06-04 19:44:24
【问题描述】:

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

这里是授权说明:

身份验证参数是一个字符串,它可以由 调用者或调用者可以选择将此值保存为参数 连同连接 ID 和 API 密钥。

身份验证是 HMAC SHA1 哈希的 base64 字符串。这是 使用API​​ Key in in的二进制计算

######################### 格式全部小写,UTF8 编码作为密钥,计算机 HMAC SHA1 哈希在二进制文件上

############################### 格式的连接 ID 全部低于 大小写和 UTF8 编码。

然后将结果二进制哈希进行 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=

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

【问题讨论】:

    标签: php laravel hash base64 sha1


    【解决方案1】:

    首先:去掉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="
    

    【讨论】:

    • 哇,非常感谢。我不敢相信我基本上是自欺欺人。感谢您的输入。是的,它写得很糟糕,很明显我想太多了。
    猜你喜欢
    • 2018-05-28
    • 2015-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-21
    • 2018-04-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多