Preisbestätigungen entschlüsseln

Wenn Ihre Anzeige eine Auktion gewinnt, kann Google Ihnen mitteilen, „price“ betrug, wenn das Creative das relevante Makro enthält.

Wenn der Bieter für die Verwendung des OpenRTB-Protokolls konfiguriert ist, wird das Creative die in Ihrem Gebot enthalten sind, sollten die ${AUCTION_PRICE} des IAB verwenden. .

Wenn Ihr Bieter das eingestellte RTB-Protokoll von Google verwendet, sollte das Creative %%WINNING_PRICE%% von Google verwenden .

Wenn diese Makros erweitert werden, geben sie den Preis für das erfolgreiche Gebot in einem in einem verschlüsselten Formular aus. Sie können in ein Creative eingefügt werden, zum Beispiel mit einem Anfrage mit einem unsichtbaren Pixel, die als Teil der Anzeige gerendert wird:

<div>
  <script language='JavaScript1.1' src='https://example.com?creativeID=5837243'/>
  <img src='https://example.com/t.gif?price=${AUCTION_PRICE}' width='1' height='1'/>
</div>

Das ${AUCTION_PRICE}-Makro kann auch in die VAST-URL von Video-Creative, aber nicht in der Impressions-URL im VAST-Code:

https://example.com/vast/v?price=${AUCTION_PRICE}

Szenario

  1. Ihre OpenRTB-Bidding-Anwendung enthält das ${AUCTION_PRICE} im HTML-Snippet oder in der VAST-URL, die es an Google zurückgibt.
  2. Google ersetzt das Makro durch den Preis für das erfolgreiche Gebot in websicheren Materialien ohne Auffüllung. Base64-Codierung (RFC 3548)
  3. Das Snippet übergibt die Bestätigung im ausgewählten Format. Für Beispiel: Die Bestätigung kann in der URL eines unsichtbaren Pixels übergeben werden. die als Teil der Anzeige gerendert wird.
  4. Auf dem Server decodiert Ihre Anwendung mit base64 websicher den Preis für das erfolgreiche Gebot. und entschlüsselt das Ergebnis.

Abhängigkeiten

Sie benötigen eine Kryptobibliothek, die SHA-1 HMAC unterstützt, z. B. OpenSSL.

Beispielcode

Der Beispielcode wird in Java und C++ bereitgestellt und kann vom privatedatacommunicationprotocol heruntergeladen werden. Projekt.

  • Der Java-Beispielcode verwendet den base64-Decoder der Apache Commons-Projekt. Sie müssen den Apache Commons-Code nicht herunterladen, da die Referenzimplementierung den notwendigen Teil umfasst und daher als eigenständiges Produkt.

  • Der C++ Beispielcode verwendet die OpenSSL base64-BIO-Methode. Dabei wird ein websicherer Base64-codierter String (RFC 3548) decodiert. Normalerweise ersetzen websichere Base64-Strings „=“, Abstand mit "." (Hinweis: Anführungszeichen zur Verdeutlichung hinzugefügt und sind nicht in den -Protokoll). Der verschlüsselte Preis wird jedoch durch die Makroersetzung nicht mit Padding versehen. Die Referenzimplementierung fügt Padding hinzu, da OpenSSL Probleme Zeichenfolgen ohne Padding.

Codierung

Die Verschlüsselung und Entschlüsselung des Erfolgreichenpreises erfordert zwei Secrets, die aber gemeinsam genutzt werden. Schlüssel. Ein Integritätsschlüssel und ein Verschlüsselungsschlüssel, die als i_key bezeichnet werden, bzw. e_key. Beide Schlüssel werden bei der Kontoeinrichtung als websichere Base64-Strings. Sie finden sie auf der Seite „Authorized Buyers“. unter Bieter Einstellungen > RTB-Einstellungen > Verschlüsselungsschlüssel

Beispiele für Integritäts- und Verschlüsselungsschlüssel:

skU7Ax_NL5pPAFyKdkfZjZz2-VhIN8bjj1rVFOaJ_5o=  // Encryption key (e_key)
arO23ykdNqUQ5LEoQ0FVmPkBd7xB5CO89PDZlSjpFxo=  // Integrity key (i_key)

Schlüssel sollten websicher decodiert und dann von Ihrem Computer mit base64 decodiert werden. Anwendung:

e_key = WebSafeBase64Decode('skU7Ax_NL5pPAFyKdkfZjZz2-VhIN8bjj1rVFOaJ_5o=')
i_key = WebSafeBase64Decode('arO23ykdNqUQ5LEoQ0FVmPkBd7xB5CO89PDZlSjpFxo=')

Verschlüsselungsschema

Der Preis wird mit einem benutzerdefinierten Verschlüsselungsschema verschlüsselt, das den Größenaufwand zu minimieren und gleichzeitig angemessene Sicherheit zu gewährleisten. Das Verschlüsselungsschema verwendet einen verschlüsselten HMAC-Algorithmus, um ein geheimes Pad basierend auf dem eindeutigen Impressionsereignis-ID.

Der verschlüsselte Preis hat eine feste Länge von 28 Byte. Sie besteht aus einem 16-Byte-Initialisierungsvektor, 8 Byte Geheimtext und eine 4-Byte-Integrität Signatur. Der verschlüsselte Preis ist gemäß RFC websicher mit Base64 verschlüsselt 3548, ohne Abstandszeichen. Daher ist der Preis für 28-Byte-verschlüsselte codiert als websicherer Base64-String mit 38 Zeichen, unabhängig vom Gewinner gezahlter Preis.

Beispiele für verschlüsselte Preise:

YWJjMTIzZGVmNDU2Z2hpN7fhCuPemCce_6msaw  // 100 CPI micros
YWJjMTIzZGVmNDU2Z2hpN7fhCuPemCAWJRxOgA  // 1900 CPI micros
YWJjMTIzZGVmNDU2Z2hpN7fhCuPemC32prpWWw  // 2700 CPI micros

Das verschlüsselte Format ist:

{initialization_vector (16 bytes)}{encrypted_price (8 bytes)}
{integrity (4 bytes)}

Der Preis wird als <price xor HMAC(encryption_key, initialization_vector)> verschlüsselt, sodass die Entschlüsselung berechnet wird HMAC(encryption_key,initialization_vector) und xor mit dem verschlüsselter Preis, um die Verschlüsselung umzukehren. Die Integritätsstufe benötigt 4 Byte <HMAC(integrity_key, price||initialization_vector)>, wobei || steht für Verkettung.

Eingaben
iv Initialisierungsvektor (16 Bytes – für die Impression eindeutig)
e_key Verschlüsselungsschlüssel (32 Byte – bei Kontoeinrichtung bereitgestellt)
i_key Integritätsschlüssel (32 Byte – bei Kontoeinrichtung bereitgestellt)
price (8 Bytes – in Mikros der Kontowährung)
Notation
hmac(k, d) SHA-1 HMAC der Daten d unter Verwendung des Schlüssels k
a || b String „a“ verkettet mit String „b
Pseudocode
pad = hmac(e_key, iv)  // first 8 bytes
enc_price = pad <xor> price
signature = hmac(i_key, price || iv)  // first 4 bytes

final_message = WebSafeBase64Encode( iv || enc_price || signature )

Entschlüsselungsschema

Der Entschlüsselungscode muss den Preis mithilfe des Verschlüsselungsschlüssels entschlüsseln. um die Integritätsbits mit dem Integritätsschlüssel zu verifizieren. Die Schlüssel werden an während der Einrichtung. Es gibt keine Einschränkungen im Hinblick auf die Art und Weise, wie Sie Strukturierung Ihrer Implementierung. Sie sollten größtenteils in der Lage sein, und passen Sie ihn Ihren Bedürfnissen an.

Eingaben
e_key Verschlüsselungsschlüssel, 32 Byte – bei Kontoeinrichtung bereitgestellt
i_key Integritätsschlüssel, 32 Byte – bei Kontoeinrichtung bereitgestellt
final_message 38 Zeichen websichere Base64-Codierung
Pseudocode
// Base64 padding characters are omitted.
// Add any required base64 padding (= or ==).
final_message_valid_base64 = AddBase64Padding(final_message)

// Web-safe decode, then base64 decode.
enc_price = WebSafeBase64Decode(final_message_valid_base64)

// Message is decoded but remains encrypted.
(iv, p, sig) = enc_price // Split up according to fixed lengths.
price_pad = hmac(e_key, iv)
price = p <xor> price_pad

conf_sig = hmac(i_key, price || iv)
success = (conf_sig == sig)

Angriffe auf veraltete Antworten erkennen

Um Angriffe mit veralteten Antworten oder Replay-Angriffen zu erkennen, sollten Sie Antworten mit einem Zeitstempel filtern, der sich erheblich vom System unterscheidet unter Berücksichtigung der Zeitzonenunterschiede.

Der Initialisierungsvektor enthält in den ersten 8 Byte einen Zeitstempel. Es kann von der folgenden C++-Funktion gelesen werden:

void GetTime(const char* iv, struct timeval* tv) {
    uint32 val;
    memcpy(&val, iv, sizeof(val));
    tv->tv_sec = htonl(val);
    memcpy(&val, iv+sizeof(val), sizeof(val));
    tv->tv_usec = htonl(val)
}

Der Zeitstempel kann mit folgendem Befehl in ein für Menschen lesbares Format konvertiert werden: C++-Code:

struct tm tm;
localtime_r(&tv->tv_sec, &tm);

printf("%04d-%02d-%02d|%02d:%02d:%02d.%06ld",
       tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday,
       tm.tm_hour, tm.tm_min, tm.tm_sec,
       tv_.tv_usec);

Java-Bibliothek

Anstatt Kryptoalgorithmen zum Codieren und Decodieren zu implementieren, den Preis für das erfolgreiche Gebot erhalten, können Sie DoubleClickCrypto.java. Weitere Informationen finden Sie unter Kryptografie: