2015-04-30 36 views
5

Sto costruendo un'API HMAC e ho problemi a testare l'hashing con Paw.Hash non simili tra PHP e Paw REST Client

sulla zampa ho questo payload:

GET:/hello/world:"":9a6e30f2016370b6f2dcfb6880501d7f2305d69bout 

e una variabile HMAC-SHA256 personalizzato (in realtà funzionare like this che lo nell'intestazione X-Hash

X-Hash: 4Cq2yehWumDcUk1dYyfhm6qWjJVBkOCB8o12f5l0WGE= 

Nel mio PHP API. ho la stessa cosa:

GET:/hello/world:"":9a6e30f2016370b6f2dcfb6880501d7f2305d69bout 

e usati:

hash_hmac('sha256', $this->getPayload(), '9a6e30f2016370b6f2dcfb6880501d7f2305d69bout', false); 

Così quando si confrontano gli hash:

Paw: 4Cq2yehWumDcUk1dYyfhm6qWjJVBkOCB8o12f5l0WGE= 
PHP: 6961b9d1f6e986c49d963cbebd691fa68dfa59b4ce3b7f05320c2d43eae3c7c3 

Sono molto diversi. Qualche idea del perché?

Aggiornamento

Codice Zampa:

function evaluate(context){ 
    var loc = getLocation(context.getCurrentRequest().url); 

    var payload = ""; 
    payload += context.getCurrentRequest().method + ':'; 
    payload += loc.pathname + ':'; 
    payload += JSON.stringify(context.getCurrentRequest().body) + ':'; 
    payload += "9a6e30f2016370b6f2dcfb6880501d7f2305d69bout"; // Private key 
    return payload; 
}; 

function getLocation(href) { 
    var match = href.match(/^(https?\:)\/\/(([^:\/?#]*)(?:\:([0-9]+))?)(\/[^?#]*)(\?[^#]*|)(#.*|)$/); 
    return match && { 
     protocol: match[1], 
     host: match[2], 
     hostname: match[3], 
     port: match[4], 
     pathname: match[5], 
     search: match[6], 
     hash: match[7] 
    } 
} 

codice PHP (con un sacco di commenti):

if (strpos(strtoupper($authHeader), 'HMAC') !== 0) { 
    echo 'out'; 
    throw new HttpForbiddenException(); 
} 
else { 
    $hmacSignature = $app->request->headers()->get('X-Hash'); 
    $publicKey = $app->request->headers()->get('X-Public'); 

    if (empty($hmacSignature) || empty($publicKey)) { 
     echo 'out2'; 
     throw new HttpForbiddenException(); 
    } 
    else { 

     $this->hmacManager->setPublicKey($publicKey); 
     print '$publickey = ' . $publicKey . '<br>'; 

     // Validate if base64_encoded or not 
     if(base64_decode($hmacSignature, true) !== FALSE) { 
      $binaryString = base64_decode($hmacSignature); 
      $hmacSignature = bin2hex($binaryString); 
      print 'decoding ' . '<br>'; 
     } 
     $this->hmacManager->setHmacSignature($hmacSignature); 
     print '$hmacSignature = ' . $hmacSignature . '<br>'; 

     $this->hmacManager->setRequestMethod($app->request->getMethod()); 
     print 'method = ' . $app->request->getMethod() . '<br>'; 
     $this->hmacManager->setRequestResourceUri($app->request->getResourceUri()); 
     print 'uri = ' . $app->request->getResourceUri() . '<br>'; 

     $requestBody = $app->request()->getBody(); 
     if (Utils::isJson($requestBody)) { 
      $requestBody = json_decode($requestBody); 
     } 
     $this->hmacManager->setRequestBody(json_encode($requestBody)); 
     print 'body = ' . json_encode($requestBody) . '<br>'; 

     print 'private key = ' . $this->hmacManager->getPrivateKey() . '<br>'; 

     $payload = ''; 
     $payload .= $this->hmacManager->getRequestMethod() . ":"; 
     $payload .= $this->hmacManager->getRequestResourceUri() . ":"; 
     $payload .= $this->hmacManager->getRequestBody() . ":"; 
     $payload .= $this->hmacManager->getPrivateKey(); 
     print 'PHP payload [' . $payload . ']'; 
     $this->hmacManager->setPayload($payload); 

     $hmacValue = $this->hmacManager->generateHmac(); 
     $isValid = $this->hmacManager->isValid($this->hmacManager->generateHmac(), $hmacSignature); 

     if ($isValid !== true) { 
      echo 'out3'; 
      throw new HttpForbiddenException(); 
     } 
    } 
} 

generateHmac da un'altra classe:

public function generateHmac() 
{ 
    print 'Generating HMAC' . '<br>'; 
    $algorithm = $this->getAlgorithm(); 
    print 'algo ' . $algorithm . '<br>'; 
    $privateKey = $this->getPrivateKey(); 
    print 'privk ' . $privateKey . '<br>'; 

    if (empty($algorithm)) { 
     throw new \RuntimeException('Algorithm must be set and not empty'); 
    } elseif (empty($privateKey)) { 
     throw new \RuntimeException('Private key must be set and not empty'); 
    } 

    print 'payload ' . $this->getPayload() . '<br>'; 
    $hash = hash_hmac($this->getAlgorithm(), $this->getPayload(), $this->getPrivateKey(), false); 
    print 'php hasj: ' . $hash . '<br>'; 

    return $hash; 
} 

Infine, ecco le istruzioni di output:

$publickey = 95f97b93560f951b4cae46c86d03d9b1a81d4ae8 
decoding 
$hmacSignature = e02ab6c9e856ba60dc524d5d6327e19baa968c954190e081f28d767f99745861 

method = GET 
uri = /hello/world 
body = "" 
private key = 9a6e30f2016370b6f2dcfb6880501d7f2305d69bout 
PHP payload [GET:/hello/world:"":9a6e30f2016370b6f2dcfb6880501d7f2305d69bout] 

Generating HMAC 
algo sha256 
privk 9a6e30f2016370b6f2dcfb6880501d7f2305d69bout 
payload GET:/hello/world:"":9a6e30f2016370b6f2dcfb6880501d7f2305d69bout 
php hash: 6961b9d1f6e986c49d963cbebd691fa68dfa59b4ce3b7f05320c2d43eae3c7c3 

Speranza che aiuta!

risposta

4

L'hash della zampa è codificato in base64 mentre quello in PHP è in esadecimale. Quindi decodificare l'hash della zampa prima:

$binary = base64_decode($pawHash); 
$hex = bin2hex($binary); 

E quindi confrontare questo con il proprio hash.

+0

Non posso fare il contrario? Decodifica l'hash generato in Paw prima di inviarlo così la mia API è così com'è? O forse rilevare se è codificato in base64? – Vallieres

+0

Ancora non funziona. Mi è piaciuto come hai detto (e controlla se base64_decode (str, true)! == FALSE) per essere sicuro che sia una stringa base64 ma ora mi dà questo hash: e02ab6c9e856ba60dc524d5d6327e19baa968c954190e081f28d767f99745861 ancora molto diverso da quello che ho in PHP. – Vallieres

+0

È difficile dire quale potrebbe essere il problema senza vedere il resto del codice. Ad esempio, potrebbe essere qualcosa di sbagliato con il carico utile.Anche una piccola differenza e gli hash sembreranno totalmente diversi. –

2

Abbiamo appena aggiunto il nuovo Base 64 to Hex conversion dynamic values, questo dovrebbe risolvere il tuo problema.

avvolgere il vostro valore dinamico firma HMAC all'interno della nuova base 64 in esadecimale uno, e si otterrà una firma esadecimale valido:

Hexadecimal HMAC signature with Paw

È possibile installare questo nuovo valore dinamico qui: Base 64 to Hex Dynamic Value

+0

Fantastico, grazie mille Micha! – bswinnerton