Pour interroger une API REST, je dois m'authentifier avec HMAC-SHA256. Est-ce que quelqu'un connaît un moyen de le faire en JSL? Nous pourrions même utiliser une autre API REST ou un webscraper pour le faire. Par exemple ce site : https://www.devglan.com/online-tools/hmac-sha256-online peut calculer le hachage mais comment puis-je le faire fonctionner?
certutil sur windows. openssl sur mac. (Mais je pense que vous n'en avez 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 également 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. Il y a longtemps que j'y ai pensé.
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.
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 et blocksize = 256, merci !
@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 cela ne fonctionnera plus. Pouvez-vous voir mon erreur? BITS.jsl et AUTH.jsl de votre twitterpackage sont également joints pour référence.
Mise à jour, c'était la taille de bloc, c'est 64 pour SHA265, j'avais supposé qu'il 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 va mal.
essayez majuscule() sur la valeur de test de gauche. On dirait que ça marche.
HMAC-SHA256 n'est actuellement pas intégré à HTTP Request/OAuth2.
Cela devrait être fait de la manière décrite par Craige.