繁体   English   中英

php字符串作为字节数组,经过哈希处理,然后以base64编码

[英]php string as byte array, hashed then base64 encoded

要为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中是否有其他方法遵循这些步骤来创建auth密钥?

是的,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 可能您也应该将该值与请求一起发送,否则服务器将无法验证哈希。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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