【问题标题】:php string as byte array, hashed then base64 encodedphp字符串作为字节数组,散列然后base64编码
【发布时间】:2017-08-04 12:23:45
【问题描述】:

要为 api 连接生成身份验证标头,我的代码应遵循以下步骤:

  1. 创建 [unique]:[apikey] 形式的字符串。
  2. 使用 UTF-8 编码将第 1 步中的字符串转换为字节数组。
  3. 计算第 2 步中字节数组的 SHA-256 哈希值。
  4. Base64 对步骤 3 中计算的字节数组进行编码;此字符串将是身份验证密钥。

据我了解,php中的字符串都是字节数组,所以我的初始方法如下所示。

public function generateAuthKey()
{
    $unique = uniqid(); # unique string
    $string = $unique.':'.$this->apiKey; # step 1
    $string = utf8_encode($string); # step 2 ?
    $hash = hash('sha256', $string); # step 3
    $base64 = base64_encode($hash); # step 4

    return $base64;
}

我的应用程序尝试使用此身份验证密钥进行连接将收到 403 错误。

我上面的代码是否完成了所需的步骤(也许我的 api 密钥有错误)或者 php 中是否有其他方法可以按照步骤创建身份验证密钥?

【问题讨论】:

标签: php


【解决方案1】:

是的,PHP 中的字符串已经是字节数组了。除非您的 $string 包含任何非 ASCII 字符,否则它也已经是有效的 UTF-8(UTF-8 是 ASCII 的超集);所以你可以跳过“编码为 UTF-8”这一步。

算法可能期望哈希的输出是二进制的,然后您应该将其转换为基数 64。默认情况下,hash 返回十六进制值,而不是二进制。为此,您需要设置其第三个参数。总结:

$unique = uniqid();
$string = $unique . ':' . $this->apiKey;
$hash   = hash('sha256', $string, true);
$base64 = base64_encode($hash);

当然,我不知道你应该用$unique 做什么。可能您也应该将该值与请求一起发送,否则服务器无法验证哈希。

【讨论】:

  • 是的,unique 和 apikey 是其他标题(这并没有真正增加任何问题)。将第三个参数添加到散列函数使这项工作;非常感谢@deceze。
  • 当然,在阅读有关此内容和我正在研究的相关编码时,您的名字出现在官方文档的 cmets 中......
  • 仅供参考,这是 Expedia 验证其 API 身份验证的方式。
猜你喜欢
  • 2018-06-12
  • 2017-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-21
  • 1970-01-01
  • 2010-10-26
  • 2020-05-17
相关资源
最近更新 更多