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
- Ihre OpenRTB-Bidding-Anwendung enthält das
${AUCTION_PRICE}
im HTML-Snippet oder in der VAST-URL, die es an Google zurückgibt. - Google ersetzt das Makro durch den Preis für das erfolgreiche Gebot in websicheren Materialien ohne Auffüllung. Base64-Codierung (RFC 3548)
- 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.
- 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: