Menü
Amazon Web Services
Allgemeine Referenz (Version 1.0)

Beispiele für das Ableiten eines Signaturschlüssels für Signature Version 4

Auf dieser Seite finden Sie Beispiele in verschiedenen Programmiersprachen zum Ableiten eines Signaturschlüssels für Signature Version 4. Die Beispiele auf dieser Seite zeigen nur, wie ein Signaturschlüssel abgeleitet wird, der nur ein Bestandteil der Signierung von AWS-Anforderungen ist. Beispiele, die den vollständigen Prozess zeigen, finden Sie unter Beispiele für den vollständigen Signierprozess in Version 4 (Python).

Anmerkung

Wenn Sie eines der AWS SDKs verwenden (einschließlich SDK für Java, .NET, Python, Ruby oder JavaScript), müssen Sie die Schritte zum Ableiten eines Signaturschlüssels und Hinzufügen von Authentifizierungsinformationen zu einer Anforderung nicht manuell durchführen. Die SDKs übernehmen diese Arbeit für Sie. Sie müssen Anforderungen nur manuell signieren, wenn Sie direkt HTTP- oder HTTPS-Anforderungen versenden.

Ableiten des Signaturschlüssels mit Java

Copy
static byte[] HmacSHA256(String data, byte[] key) throws Exception { String algorithm="HmacSHA256"; Mac mac = Mac.getInstance(algorithm); mac.init(new SecretKeySpec(key, algorithm)); return mac.doFinal(data.getBytes("UTF8")); } static byte[] getSignatureKey(String key, String dateStamp, String regionName, String serviceName) throws Exception { byte[] kSecret = ("AWS4" + key).getBytes("UTF8"); byte[] kDate = HmacSHA256(dateStamp, kSecret); byte[] kRegion = HmacSHA256(regionName, kDate); byte[] kService = HmacSHA256(serviceName, kRegion); byte[] kSigning = HmacSHA256("aws4_request", kService); return kSigning; }

Ableiten des Signaturschlüssels mit .NET (C#)

Copy
static byte[] HmacSHA256(String data, byte[] key) { String algorithm = "HmacSHA256"; KeyedHashAlgorithm kha = KeyedHashAlgorithm.Create(algorithm); kha.Key = key; return kha.ComputeHash(Encoding.UTF8.GetBytes(data)); } static byte[] getSignatureKey(String key, String dateStamp, String regionName, String serviceName) { byte[] kSecret = Encoding.UTF8.GetBytes(("AWS4" + key).ToCharArray()); byte[] kDate = HmacSHA256(dateStamp, kSecret); byte[] kRegion = HmacSHA256(regionName, kDate); byte[] kService = HmacSHA256(serviceName, kRegion); byte[] kSigning = HmacSHA256("aws4_request", kService); return kSigning; }

Ableiten des Signaturschlüssels mit Python

Copy
def sign(key, msg): return hmac.new(key, msg.encode("utf-8"), hashlib.sha256).digest() def getSignatureKey(key, dateStamp, regionName, serviceName): kDate = sign(("AWS4" + key).encode("utf-8"), dateStamp) kRegion = sign(kDate, regionName) kService = sign(kRegion, serviceName) kSigning = sign(kService, "aws4_request") return kSigning

Ableiten des Signaturschlüssels mit Ruby

Copy
def getSignatureKey key, dateStamp, regionName, serviceName kDate = OpenSSL::HMAC.digest('sha256', "AWS4" + key, dateStamp) kRegion = OpenSSL::HMAC.digest('sha256', kDate, regionName) kService = OpenSSL::HMAC.digest('sha256', kRegion, serviceName) kSigning = OpenSSL::HMAC.digest('sha256', kService, "aws4_request") kSigning end

Ableiten des Signaturschlüssels mit JavaScript

Im folgenden Beispiel wird die Bibliothek "crypto-js" verwendet. Weitere Informationen finden Sie unter https://www.npmjs.com/package/crypto-js und https://code.google.com/archive/p/crypto-js/.

Copy
var crypto = require("crypto-js"); function getSignatureKey(Crypto, key, dateStamp, regionName, serviceName) { var kDate = Crypto.HmacSHA256(dateStamp, "AWS4" + key); var kRegion = Crypto.HmacSHA256(regionName, kDate); var kService = Crypto.HmacSHA256(serviceName, kRegion); var kSigning = Crypto.HmacSHA256("aws4_request", kService); return kSigning; }

Ableiten des Signaturschlüssels mit anderen Sprachen

Wenn Sie diese Logik in einer anderen Programmiersprache implementieren müssen, empfehlen wir, die zwischengeschalteten Schritte des Ableitungsalgorithmus mit den Werten in diesem Abschnitt zu testen. Das folgende Beispiel zeigt die Ergebnisse in Ruby mit der hexEncode-Funktion nach jedem Schritt des Algorithmus.

Copy
def hexEncode bindata result="" data=bindata.unpack("C*") data.each {|b| result+= "%02x" % b} result end

Die Eingabewerte für den Test lauten wie folgt:

Copy
key = 'wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY' dateStamp = '20120215' regionName = 'us-east-1' serviceName = 'iam'

Ihr Programm sollte die folgende Werte für die Werte in getSignatureKey generieren. Beachten Sie, dass dies in Hexadezimalzeichen kodierte Darstellungen der binären Daten sind; der Schlüssel und die Zwischenwerte selbst sollten das Binärformat aufweisen.

Copy
kSecret = '41575334774a616c725855746e46454d492f4b374d44454e472b62507852666943594558414d504c454b4559' kDate = '969fbb94feb542b71ede6f87fe4d5fa29c789342b0f407474670f0c2489e0a0d' kRegion = '69daa0209cd9c5ff5c8ced464a696fd4252e981430b10e3d3fd8e2f197d7a70c' kService = 'f72cfd46f26bc4643f06a11eabb6c0ba18780c19a8da0c31ace671265e3c87fa' kSigning = 'f4780e2d9f65fa895f9c67b32ce1baf0b0d8a43505a000a1a9e090d414db404d'

Häufige Fehler beim Programmieren

Vermeiden Sie die folgenden häufigen Programmierfehler.

Tipp

Überprüfen Sie die HTTP-Anforderung, die Sie an AWS übermitteln, mithilfe eines Tools, das Ihnen zeigt, wie Ihre unformatierten HTTP-Anforderungen aussehen. Dies kann Ihnen dabei helfen, Probleme zu finden, die aus Ihrem Code nicht ersichtlich sind.

  • Fügen Sie kein zusätzliches Zeilenumbruchzeichen ein bzw. vergessen Sie keines an einer Stelle, an der es erforderlich ist.

  • Achten Sie auf korrekte Formatierung des Datums im Umfang der Anmeldeinformationen (z. B. Verwendung eines Zeitstempels anstelle des Formats "JJJJMMTT").

  • Stellen Sie sicher, dass die Header in den kanonischen Headern und signierten Headern übereinstimmen.

  • Verwechseln Sie nicht versehentlich den Schlüssel und die Daten (Nachricht) bei der Berechnung der Zwischenschlüssel. Das Ergebnis der Berechnung des vorherigen Schritts ist der Schlüssel, nicht die Daten. Schauen Sie in der Dokumentation mit den Verschlüsselungsgrundlagen nach, um sicherzustellen, dass Sie die Parameter in der richtigen Reihenfolge angeben.

  • Vergessen Sie nicht, beim ersten Schritt die Zeichenfolge "AWS4" vor dem Schlüssel hinzuzufügen. Wenn Sie die Schlüsselableitung über eine for-Schleife oder einen Iterator implementieren, vergessen Sie nicht, die erste Iteration so anzugeben, dass diese die Zeichenfolge "AWS4" enthält.

Weitere Informationen zu möglichen Fehlern finden Sie unter Behebung von Signaturversion 4-Fehlern bei AWS.