Zum Abfragen einer REST-API muss ich mich mit HMAC-SHA256 authentifizieren. Kennt jemand eine Möglichkeit, dies in JSL zu tun? Möglicherweise verwenden wir dafür sogar eine andere REST-API oder einen anderen Webscraper. Zum Beispiel diese Website: https://www.devgan.com/online-tools/hmac-sha256-online kann den Hash berechnen, aber wie bringe ich ihn zum Laufen?
Vielen Dank für die Bestätigung
HMAC-SHA256 ist derzeit nicht in HTTP Request/OAuth2 integriert.
Es müsste so gemacht werden, wie Craige es beschrieben hat.
Versuchen Sie es mit Uppercase() für den Testwert auf der linken Seite. Sieht so aus, als ob es funktioniert.
@Craige_Hales Aus irgendeinem Grund habe ich es heute früher zum Laufen gebracht, es dann gespeichert und jetzt funktioniert es nicht mehr. Kannst du meinen Fehler sehen? BITS.jsl und AUTH.jsl aus Ihrem Twitterpaket sind ebenfalls als Referenz beigefügt.
Update, es war die Blockgröße, sie beträgt 64 für SHA265. Ich hatte angenommen, dass sie 265 sein sollte
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"));Ich habe die Funktion certutil SHA256 überprüft und sie generiert korrekte Hashes. Es scheint, dass bei HMACSHA256 oder in den BITS-Funktionen, die es aufruft, ein Fehler auftritt.
Ich bin auf jeden Fall an der integrierten Lösung interessiert, aber in der Zwischenzeit funktioniert Ihre Lösung auch! Ich habe SHA1 in Zeile 9 Ihrer auth.jsl-Datei durch SHA256 ersetzt, danke!
certutil unter Windows. OpenSSL auf dem Mac. (Aber ich denke, das ist möglicherweise nicht nötig, siehe letzter Satz unten.)
Vor langer Zeit in 7 Dinge, die Sie über Twitter wissen sollten Ich brauchte einen SHA1. „certutil“ ist bereits unter Windows installiert und unterstützt offenbar auch SHA256. Sie können mit dem Code in der ZIP-Datei AUTH.jsl beginnen, der runprogram verwendet und die Ausgabe analysiert.
Mit dieser Suche erhalten Sie eine Reihe von Auswahlmöglichkeiten unterschiedlicher Qualität https://www.google.com/search?q=windows+hmac+sha256+certutil
Der HMAC-Teil wird beschrieben https://en.wikipedia.org/wiki/HMAC Und Es scheint eine verwandte Funktion zu geben in der Datei AUTH.jsl. Es ist lange her, seit ich darüber nachgedacht habe. Bearbeiten: Ich habe wahrscheinlich das Wikipedia-Beispiel verwendet, als die JSL geschrieben wurde. Wikipedia bietet auch einige Testfälle, wenn Sie Ihre eigenen schreiben.
Ich denke, dass dies möglicherweise auch in die httpRequest/oauth2-Funktionen von JMP integriert ist @Paul_Nelson @bryan_boone aber ich habe sie noch nicht studiert.