HMAC-SHA-256 en PHP

Je dois construire une autorisation de hachage à partir de cette chaîne:

kki98hkl-u5d0-w96i-62dp-xpmr6xlvfnjz:20151110171858:b2c13532-3416-47d9-8592-a541c208f755:hKSeRD98BHngrNa51Q2IgAXtoZ8oYebgY4vQHEYjlmzN9KSbAVTRvQkUPsjOGu4F

Ce secret est utilisé pour une fonction de hachage HMAC:

LRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=

L'autorisation de hachage j'ai pour générer de l'est: est-ce

P-WgZ8CqV51aI-3TncZj5CpSZh98PjZTYxrvxkmQYmI=

Il y a certaines choses à prendre soin de:

  1. La signature doivent être construits avec HMAC-SHA-256, comme spécifié dans RFC 2104.
  2. La signature doivent être encodé en Base64 URL-compatible tel que spécifié dans RFC 4648 Section 5 (Sécurité de l'alphabet).

Il y a aussi quelques pseudo-code pour la génération:

Signatur(Request) = new String(encodeBase64URLCompatible(HMAC-SHA-256(getBytes(Z, "UTF-8"), decodeBase64URLCompatible(getBytes(S, "UTF-8")))), "UTF-8")

J'ai essayé plusieurs choses en PHP, mais n'ont pas trouvé le bon algorithme encore. C'est le code que j'ai maintenant:

if(!function_exists('base64url_encode')){
    function base64url_encode($data) {
        $data = str_replace(array('+', '/'), array('-', '_'), base64_encode($data));
        return $data;
    }
}

$str = "kki98hkl-u5d0-w96i-62dp-xpmr6xlvfnjz:20151110171858:b2c13532-3416-47d9-8592-a541c208f755:hKSeRD98BHngrNa51Q2IgAXtoZ8oYebgY4vQHEYjlmzN9KSbAVTRvQkUPsjOGu4F";
$sec = "LRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=";
$signature = mhash(MHASH_SHA256, $str, $sec);
$signature = base64url_encode($signature);

if($signature != "P-WgZ8CqV51aI-3TncZj5CpSZh98PjZTYxrvxkmQYmI=")
    echo "wrong: $signature";
else
    echo "correct";

Il donne à cette signature:

K9lw3V-k5gOedmVwmO5vC7cOn82JSEXsNguozCAOU2c=

Comme vous pouvez le voir, la longueur de 44 caractères est correct. Veuillez m'aider à trouver l'erreur, ce simple problème me prend des heures encore, et il n'y a pas de solution.

Après la lecture de votre question deux fois, je ne sais toujours pas ce que votre question est.
J'ai besoin d'un hachage HMAC à partir d'une chaîne de signer et d'un secret. Si j'essaie de générer avec PHP, il échoue / donne le mal de hachage. Je pense que les spécifications RFC ne sont pas remplies.
Je pense que c'est à peu près en raison de base64url_encode. Si vous en avez besoin pour être urlencoded pour quelque raison que ce soit, de l'utilisation urlencode et puis urldecode sur le serveur avant de vérifier.

OriginalL'auteur Richard | 2016-01-22