6

Ich arbeite derzeit mit Google Apps-Skript und versuche zu schreiben & eine HTTP-Anfrage an AWS CloudWatch zu unterzeichnen.Binäre Ausgabe von Google Script HMAC Beschreibung

In der Amazon API-Dokumentation here zum Erstellen eines Signaturschlüssels wird Pseudo verwendet, um zu erklären, dass der HMAC-Algorithmus das Binärformat zurückgibt.

HMAC(key, data) represents an HMAC-SHA256 function 
that returns output in binary format. 

Google Apps Script ein Verfahren bietet eine solche Hash zu tun,

Utilities.computeHmacSignature(Utilities.MacAlgorithm.HMAC_SHA_256, 
              data, 
              key); 

aber der Rückgabetyp ist immer ein Byte-Array.

Byte[] 

Wie konvertiere ich das Byte [] in die Binärdaten, die AWS haben will? Oder gibt es eine JavaScript-Funktion von Vanille, die ich in Google Apps Script verwenden kann, um den Hash zu berechnen?

Dank

+1

Haben Sie versucht, zuerst zu konvertieren String (von Byte []) und dann, es in Binär konvertieren wäre einfacher? – Rpranata

+0

Ja, ich habe das versucht, indem ich das Byte [] in einen Blob umwandelte und dann die Daten als String las, der in die nächste Iteration des Hashing übergeben wurde, aber ohne Erfolg – user2495753

Antwort

1

Die Umwandlung von Byte-Array auf die binären Daten sollten einfach erforderlich sein:

kDate = Utilities.computeHmacSignature(Utilities.MacAlgorithm.HMAC_SHA_256, 
      '20130618', 'AWS4' + kSecret); 
kDate = Utilities.newBlob(kDate).getDataAsString(); 
kRegion = Utilities.computeHmacSignature(Utilities.MacAlgorithm.HMAC_SHA_256, 
      'eu-west-1', kDate); 

ABER muss man auf this open issue in the bugtracker finden - es einige Probleme bei der Umwandlung sein könnte.

vielleicht könnten Sie versuchen, eine String.fromCharCode() Schleife zu machen und vermeiden negative numers:

kDateB = Utilities.computeHmacSignature(Utilities.MacAlgorithm.HMAC_SHA_256, 
      '20130618', 'AWS4' + kSecret); 
kDate = ''; 
for (var i=0; i<kDateB.length; i++) 
    kDate += String.fromCharCode(kDateB[i]<0?256+kDateB[i]:0+kDateB[i]); 
kRegion = Utilities.computeHmacSignature(Utilities.MacAlgorithm.HMAC_SHA_256, 
      'eu-west-1', kDate); 
+0

Danke für die Antwort. Das ist definitiv frustrierend. Ich habe einen Kommentar zum Bugtracker geschrieben, also hoffe ich, dass das Google-Team zumindest eine Antwort auf dieses bekannte Problem erhält. – user2495753

+0

haben Sie die Option'String.fromCharCode' versucht? Das Problem scheint mit negativen Byte-Werten zu erscheinen. Hinzufügen von 256 zu diesen sollte das Problem lösen. – Taras

+0

Ich habe versucht, dies zu tun und negative Werte durch Hinzufügen von 256 loszuwerden, aber leider bekomme ich immer noch das falsche Ergebnis. Google hat gesagt, dass dies ein bekanntes Problem ist und arbeitet daran, aber sie haben auch festgestellt, dass es zu diesem Zeitpunkt keine Aktualisierung zu diesem Fehler gibt. – user2495753

2

Ich bin ziemlich sicher, dass es ein Fehler ist, dass Utilities.computeHmacSignature Schlüssel als ASCII nehmen. Aber es gab keine Möglichkeit, byte [] zu analysieren richtig

in GAS ASCII und die Bibliothek Schriftsteller ist zu dumm, zu gerade Funktion bereitzustellen, die Schlüssel nehmen als byte []

So verwende ich diese stattdessen: http://caligatio.github.com/jsSHA/

Kopieren Sie einfach SHA.js und SHA-256.js, dann funktioniert es gut

PS. es verschwendet meine Zeit für ganze 2 Tage, also bin ich sehr ärgerlich