Zum Abfragen einer REST-API muss ich mich mit HMAC-SHA256 authentifizieren. Kennt jemand eine Möglichkeit, dies in JSL zu tun? Wir könnten dafür sogar eine andere REST-API oder einen anderen Webscraper verwenden. Zum Beispiel diese Webseite: https://www.devglan.com/online-tools/hmac-sha256-online kann den Hash berechnen, aber wie mache ich es zum Laufen?
certutil unter Windows. openssl auf mac. (Aber ich denke, Sie müssen es vielleicht nicht, siehe letzten Satz unten.)
Vor langer Zeit in 7 Dinge, die man über Twitter wissen sollte Ich brauchte einen SHA1. "certutil" ist bereits unter Windows installiert und wird anscheinend auch SHA256 ausführen. Sie können mit dem Code in der ZIP-Datei AUTH.jsl beginnen, die runprogram verwendet und die Ausgabe analysiert.
Bei 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 AUTH.jsl-Datei. Es ist lange her, dass ich darüber nachgedacht habe.
Ich denke, dies kann auch in die httpRequest/oauth2-Funktionen von JMP integriert werden @Paul_Nelson @bryan_boone aber ich habe sie noch nicht studiert.
Interessieren Sie sich definitiv für die eingebaute Lösung, aber in der Zwischenzeit funktioniert Ihre Lösung auch! Ich habe SHA1 in Zeile 9 Ihrer auth.jsl-Datei durch SHA256 ersetzt und blocksize = 256, danke!
@Craige_Hales Aus irgendeinem Grund habe ich es heute früher zum Laufen gebracht, es dann gespeichert und jetzt funktioniert es nicht mehr. Siehst du meinen Fehler? BITS.jsl und AUTH.jsl aus Ihrem Twitterpaket sind ebenfalls als Referenz beigefügt.
Update, es war die Blockgröße, es ist 64 für SHA265, ich hatte angenommen, dass es 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 certutil SHA256-Funktion überprüft und das generiert korrekte Hashes. Es scheint, dass der HMACSHA256 oder in den BITS funktioniert, die er aufruft, wo es schief geht.
versuchen Sie uppercase() auf dem Testwert auf der linken Seite. Sieht so aus, als ob es funktioniert.
HMAC-SHA256 ist derzeit nicht in HTTP Request/OAuth2 integriert.
Es müsste so gemacht werden, wie Craige es beschrieben hat.