Der HMAC-Generator signiert eine Nachricht mit einem geheimen Schlüssel und druckt die Schlüssel-Zusammenfassung. Die gesamte Berechnung ist ein WebCrypto-Aufruf im Browser: Die Nachricht und der Schlüssel bleiben auf der Seite, nichts wird an einen Server gesendet, und das Ergebnis ist eine deterministische Zeichenfolge, die sich in einen Request-Header, einen Abfrageparameter oder einen Testvektor kopieren lässt. Starten Sie beim HMAC-Generator, geben Sie The quick brown fox jumps over the lazy dog als Nachricht ein, geben Sie key als Geheimnis ein, belassen Sie SHA-256 und Hex und drücken Sie Generieren: Die Zusammenfassung druckt f7bc83f430538424b13298e6aa6fb143ef4d59a14946175997479dbc2d1a3cd8.
Die vier Steuerelemente
Vier Eingaben steuern die Zusammenfassung: das Nachrichtenfeld, das Schlüsselfeld mit seiner Text/Hex-Umschaltung, die Algorithmus-Auswahl und die Ausgabeformat-Auswahl. Die Nachricht ist ein mehrzeiliges Textfeld: Zeilenumbrüche sind Teil der Nachricht und werden signiert, so dass dieselben Wörter in zwei Zeilen anders signieren als dieselben Wörter, durch ein Leerzeichen verbunden, und die UTF-8-Bytes von 你好 signieren unter dem Schlüssel key als 309b75c0cbbfb27bb35b8d7b8f4adb4b9399cd54339ab5faeb8798e1b9f7f00c. Der geheime Schlüssel ist ein einzeiliges Feld, und seine Umschaltung entscheidet, wie die Zeichenfolge gelesen wird. Die Algorithmus-Auswahl bietet SHA-256, SHA-384 und SHA-512, und die Formatauswahl bietet Hex und Base64. Generieren ist eine explizite Taste: Nichts wird berechnet, bevor sie gedrückt wird, und die Zusammenfassung erscheint in einem nur lesbaren Feld mit einer Kopieren-Taste daneben.
Text-Schlüssel und Hex-Schlüssel
Im Text-Modus wird der Schlüssel als die UTF-8-Bytes gelesen, genau wie eingegeben: Jedes Zeichen ist Teil des Schlüssels, einschließlich eines Leerzeichens am Ende, so dass der Schlüssel key abc als 9c196e32dc0175f86f4b1cb89289d6619de6bee699e4c378e68309ed97a1a6ab signiert, während key mit einem Leerzeichen am Ende dasselbe abc als 0324ef70f9e605e123731b458dcdce99cf5f8d23572f604fbdabf371aedb0f68 signiert. Im Hex-Modus wird die Zeichenfolge zunächst von allen Leerraumzeichen befreit und dann als rohe Bytepaare gelesen, so dass 616263 die drei Bytes 0x61, 0x62 und 0x63 sind, nicht die sechs Zeichen des Textes 616263: Unter der Nachricht msg signiert der Hex-Schlüssel 616263 als eb14f17c9f056479f147adcf8020d27914f1e5971f049e75bf21a669cbd747e2, während der Text-Schlüssel 616263 als 49962d2f0cde29c6a4848f8ea64575424ad42d3d108452127c0512cb88444a41 signiert. Die Hex-Zeichenfolge muss mindestens zwei Zeichen lang sein, eine gerade Länge haben, und jedes Zeichen eine Hexziffer sein; 6162635 fällt an der Prüfung, bevor irgendeine Kryptographie läuft, ebenso wie ungerade Längen und Buchstaben außerhalb von a bis f.
Die drei Algorithmen
Die Länge der Zusammenfassung ist durch den Algorithmus festgelegt: SHA-256 druckt 32 Bytes, das sind 64 Hex-Zeichen oder 44 Base64-Zeichen mit einem = als Füllzeichen; SHA-384 druckt 48 Bytes, 96 Hex-Zeichen oder 64 Base64-Zeichen ohne Füllung; SHA-512 druckt 64 Bytes, 128 Hex-Zeichen oder 88 Base64-Zeichen mit doppelter Füllung. Alle drei sind dieselbe Schlüssel-Konstruktion über drei Hash-Funktionen, so dass die Umschaltung der Auswahl die Länge und den Wert ändert, nicht die Form der Eingabe. Das Tool reproduziert die Testvektoren der RFC 4231: Mit dem Hex-Schlüssel 0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b und der Nachricht Hi There druckt SHA-256 b0344c61d8db38535ca8afceaf0bf12b881dc200c9833da726e9376c2e32cff7 und SHA-512 druckt 87aa7cdea5ef619d4ff0b4241a1d6cb02379f4e2ce4ec2787ad0b30545e17cdedaa833b7d6b8a702038b274eaea3f4e4be9d914eeb61f1702e696c203a126854, und mit dem Text-Schlüssel Jefe und der Nachricht what do ya want for breakfast? druckt SHA-256 47f69d8f80f0a6326746beec23a9040fd533642b5ba38a99287670639d8b862a.
Hex und Base64
Hex druckt die Zusammenfassung Byte für Byte in Kleinbuchstaben, zwei Zeichen pro Byte, und Base64 druckt dieselben Bytes mit Standard-Füllung. Die beiden Schreibweisen tragen dieselben 32 Bytes: Die fox-Nachricht unter dem Schlüssel key ist f7bc83f430538424b13298e6aa6fb143ef4d59a14946175997479dbc2d1a3cd8 in Hex und 97yD9DBThCSxMpjmqm+xQ+9NWaFJRhdZl0edvC0aPNg= in Base64, das abschließende = ist Füllung und kein signiertes Zeichen. Die Jefe-Nachricht druckt R/adj4DwpjJnRr7sI6kED9UzZCtbo4qZKHZwY52Lhio= unter SHA-256, MxTAcsyrQOuSUFsKlh1Gv2UuDowpCJfZzsFDvCo65FGJ15G5QCeCSey3RFF3dIlG unter SHA-384, wo die 48 Bytes die Base64-Gruppen genau füllen und keine Füllung erscheint, und af7nmi5sP0zyOeCqttVBl2h4BIXw5B/8dZckor99FGR+CncEsWts5Zi2pWU1HIhhnQ3+0nKMj8+Ja0GvkB1UCA== unter SHA-512, wo die 64 Bytes ein Byte in der letzten Gruppe übrig lassen und das doppelte = es auffüllt. Die Kopieren-Taste legt die gedruckte Zeichenfolge in die Zwischenablage und liest sich für zwei Sekunden kopiert.
Determinismus und die Eingabeprüfungen
Dieselbe Nachricht, derselbe Schlüssel und derselbe Algorithmus drucken immer dieselbe Zusammenfassung: Es gibt kein Salz, keinen Zeitstempel und keine Zufallszahl, und das ist die Eigenschaft, die HMAC als Testvektor und als gemeinsame Prüfung zwischen zwei Systemen nutzbar macht. Zwei Eingaben werden abgewiesen, bevor irgendeine Kryptographie läuft: Eine leere oder nur aus Leerraumzeichen bestehende Nachricht löst den Fehler Nachricht ein, und ein leerer oder nur aus Leerraumzeichen bestehender Schlüssel löst den Fehler Schlüssel ein; ein Hex-Schlüssel, der an der Hex-Prüfung scheitert, löst den Fehler ungültiges Hex aus, und in allen drei Fällen behalten die Felder ihren Inhalt zur Korrektur. Die Schlüssel-Länge hat ansonsten keine Einschränkung: Ein ein Byte langer Schlüssel signiert abc als df55998f9fc33d78ac99d1d8ebc2b6e16aa076c4189946942a82b55d5dee8dc7, und ein 100 Byte langer Schlüssel signiert dasselbe abc als 30f0f7f4a3d31b9750666b038c048550020795dd2743759bf83bcf5e0f125b36, weil die HMAC-Konstruktion einen zu langen Schlüssel zunächst auf die Hash-Größe herunterschlägt. Ein Plattform-Eck bleibt: Die WebCrypto-Subtle-API existiert nur in sicheren Kontexten, so dass die Taste auf einer Seite, die über einfaches http ausgeliefert wird, den Fehler Ausfall löst, statt zu berechnen.
Was er nicht ist
Der HMAC-Generator ist kein reiner Hash-Generator: Für eine Zusammenfassung der Nachricht allein, ohne jeden Schlüssel, führt der Hash-Generator MD5, SHA-1 und die SHA-2-Familie über den Text. Auch ist er kein JWT-Tool: Für das Lesen, Aufteilen und Base64-Entcoden eines Tokens statt dessen Signierens macht der JWT-Dekoder das. Und er verschlüsselt nicht: Die Zusammenfassung ist eine Signatur, kein Geheimnis-Behälter, und der AES-Guide behandelt die Richtung der Verschlüsselung. Und er hält keinen Zustand jenseits der vier Eingaben: Es gibt keinen Verlauf, keinen gespeicherten Schlüssel und keine Erinnerung an eine frühere Zusammenfassung, und das Schließen der Seite verwirft die Nachricht und das Geheimnis.