Pour interroger une API REST, je dois m'authentifier auprès de HMAC-SHA256. Est-ce que quelqu'un connaît un moyen de faire cela en JSL ? Nous pourrions même utiliser une autre API REST ou un autre webscraper pour le faire. Par exemple ce site internet : https://www.devglan.com/online-tools/hmac-sha256-online peut calculer le hachage mais comment le faire fonctionner ?
Merci de l'avoir confirmé
HMAC-SHA256 n'est actuellement pas intégré à HTTP Request/OAuth2.
Il faudrait procéder comme Craige l’a décrit.
essayez uppercase() sur la valeur de test de gauche. On dirait que ça marche.
@Craige_Hales pour une raison quelconque, je l'ai fait fonctionner plus tôt dans la journée, puis je l'ai enregistré et maintenant il ne fonctionnera plus. Pouvez-vous voir mon erreur ? BITS.jsl et AUTH.jsl de votre package Twitter sont également joints à titre de référence.
Mise à jour, c'était la taille du bloc, c'est 64 pour SHA265, j'avais supposé qu'elle devrait être 265
include("BITS.jsl");
SHA256 = Function( {txt},
{hash, rc, hexdata,temppath},
try(deleteFile("$temp/deleteme.txt"));
temppath = Save Text File( "$temp/deleteme.txt", txt );
If( Host is( "windows" ),
hash = RunProgram( executable( "certutil" ), options( "-hashfile "|| temppath|| " SHA256" ), readfunction( "text" ) ); // win jmp 11
//hash = RunProgram( executable( "certutil" ), options( {"-hashfile", temppath, "SHA1"} ), readfunction( "text" ) );
rc = Pat Match(
hash,
Pat Regex( "\[^.+?:\s+]\" ) + Pat Span( "0123456789abcdefABCDEF " ) >> hexdata + Pat Regex(
"\[\s*CertUtil: -hashfile command completed successfully.\s*$]\"
)
);
If( rc != 1,
Throw( "bad hash:" || hash )
);
hexdata = Regex( hexdata, " ", "", GLOBALREPLACE );
, // else MAC
hash = RunProgram( executable( "/usr/bin/openssl" ), options( {"dgst", "-sha1", temppath} ), readfunction( "text" ) );
hexdata =regex(hash,"=\s*([0-9a-fA-F]{40})\s*","\1");
if( length(hexdata) != 40, throw("bad hash:" || hash));
);
try(deleteFile("$temp/deleteme.txt"),show("did not delete temp file??"));
Return( Hex To Blob( hexdata ) );
);
HMACSHA256 = Function( {key, message},
{blocksize = 64}, // Where blocksize is that of the underlying hash function
//show(length(key));
If(
Length( key ) > blocksize, // keys longer than blocksize are shortened
//print("shorten:");
key = SHA256( key );
//show(key,length(key));
);
if(
Length( key ) < blocksize, // keys shorter than blocksize are zero-padded
key = key || Matrix To Blob( J( (blocksize - Length( key )), 1, 0 ), "uint", 1, "big" )
);
//show(length(key));
o_key_pad = BITS:XORBLOB( Matrix To Blob( J( blocksize, 1, Hex To Number( "5c" ) ), "uint", 1, "big" ), key );
i_key_pad = BITS:XORBLOB( Matrix To Blob( J( blocksize, 1, Hex To Number( "36" ) ), "uint", 1, "big" ), key );
Return( SHA256( o_key_pad || SHA256( i_key_pad || message ) ) );
);
//from https://www.devglan.com/online-tools/hmac-sha256-online
if("090a613de1a32c513f5477019dbd395fe4c6727708e945277d6af6c5cf7a6778" != hex(HMACSHA256( Char To Blob( "dbc62ec300b2624c580611858d94f2332ac63" ), Char To Blob( "Why don't we test this" ) )), throw("hmac busted"));J'ai vérifié la fonction certutil SHA256 et cela génère des hachages corrects. Il semble que le HMACSHA256 ou dans les fonctions BITS qu'il appelle, là où ça se passe mal.
Certainement intéressé par la solution intégrée mais en attendant, votre solution fonctionne également ! J'ai remplacé SHA1 par SHA256 à la ligne 9 de votre fichier auth.jsl, merci !
certutil sous Windows. openssl sur mac. (Mais je pense que vous n'en aurez peut-être pas besoin, voir la dernière phrase ci-dessous.)
Il y a longtemps dans 7 choses à savoir sur Twitter J'avais besoin d'un SHA1. "certutil" est déjà installé sur Windows et fera apparemment aussi SHA256. Vous pouvez commencer par le code du fichier .zip AUTH.jsl qui utilise runprogram et analyse la sortie.
Vous obtiendrez un tas de choix de qualité variable avec cette recherche https://www.google.com/search?q=windows+hmac+sha256+certutil
La partie HMAC est décrite https://en.wikipedia.org/wiki/HMAC et il semble y avoir une fonction connexe dans le fichier AUTH.jsl. Cela faisait longtemps que j'y pensais. edit : j'ai probablement utilisé l'exemple Wikipédia lors de l'écriture du JSL. Wikipédia propose également des cas de test si vous écrivez les vôtres.
Je pense que cela peut également être intégré aux fonctions httpRequest/oauth2 de JMP. @Paul_Nelson @bryan_boone mais je ne les ai pas encore étudiés.