HMAC Base64身份验证?

时间:2017-12-14 05:24:23

标签: php node.js base64 sha hmac

我不知道在这方面甚至会发生什么,但我试图使用API​​,他们还有另一种不同的身份验证标准,称为HMAC,Sha384为base64。

这是提供的示例:

class ICObenchAPI {

private $privateKey = 'private-key';
private $publicKey  = 'public-key';
private $apiUrl     = 'https://icobench.com/api/v1/';
public  $result;

public function getICOs($type = 'all', $data = ''){ 
    return $this->send('icos/' . $type, $data); 
}   
public function getICO($icoId, $data = ''){ 
    return $this->send('ico/' . $icoId, $data); 
}       
public function getOther($type){ 
    return $this->send('other/' . $type, ''); 
}

private function send($action, $data){

    $dataJson = json_encode($data);                 
    $sig = base64_encode(hash_hmac('sha384', $dataJson, $this->privateKey, true));  

    $ch = curl_init($this->apiUrl . $action);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST"); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, $dataJson);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array(
        'Content-Type: application/json',
        'Content-Length: ' . strlen($dataJson),
        'X-ICObench-Key: ' . $this->publicKey,
        'X-ICObench-Sig: ' . $sig)
    );

    $reply = curl_exec($ch);
    $ff = $reply;
    $reply = json_decode($reply,true);

    if(isset($reply['error'])){
        $this->result = $reply['error'];
        return false;
    }else if(isset($reply['message'])){
        $this->result = $reply['message'];
        return true;
    }else if(isset($reply)){
        $this->result = json_encode($reply);
        return true;
    }else{
        $this->result = htmlspecialchars($ff);
        return false;
    }
}

public function result(){
    return $this->result;
}

}

我希望提供PHP示例,并将其转换为nodeJS脚本,真的不知道从哪里开始。我已经看过crypto-js和其他人了,但是因为我甚至没有写过,所以我也不知道要求的具体内容是什么

2 个答案:

答案 0 :(得分:1)

Crypto-js是一个很好的方法。

您需要首先加密数据,然后使用Base64来创建标题中使用的签名

    let dataJSON = JSON.stringify(data);

    let sign = CryptoJS.HmacSHA384(dataJSON, this.privateKey);
    sign = CryptoJS.enc.Base64.stringify(sign);

我在github上推了一个工作示例:ICObenchAPI.js

答案 1 :(得分:0)

我编写了一个名为node-icobench的Node js包装器库。欢迎您使用它。

npm install node-icobench

以下是HMAC部分的预览,为了这个例子,有一些改动:

const crypto = require('crypto');

// Stringify POST data
let jsonData = JSON.stringify(data);

// Create HMAC based on algo and private key
let hmac = crypto.createHmac('sha384', privateKey);

// Create HMAC Digest of json data
hmac.update(jsonData);

// return Base64 encoding of HMAC
let signedData = hmac.digest('base64');