2017-08-04 195 views
0

为了产生用于一个API连接认证头,我的代码应遵循下列步骤:PHP字符串作为字节数组,然后散列base64编码

  1. 创建表格[独特]的字符串:[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中遵循创建授权密钥的步骤?

+0

我认为它工作正常:-https://eval.in/841537 –

回答

4

是的,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我不知道。很可能你应该将这个值与请求一起发送,否则服务器无法验证散列。

+0

是的,唯一和apikey是其他标题(它并没有真正添加任何问题)。将第三个参数添加到散列函数使得这个工作成为可能;非常感谢@deceze。 –

+0

当然,当你阅读关于这个和我正在工作的相关编码时,你的名字出现在官方文档的评论中。 –