Quando la tua creatività vince un'asta, Google può comunicarti qual è se la creatività include la macro pertinente.
Se lo strumento di offerta è configurato
per usare il protocollo OpenRTB, la creatività
inclusa nell'offerta deve utilizzare lo standard ${AUCTION_PRICE}
di IAB
.
Se lo strumento di offerta utilizza il protocollo RTB di Google obsoleto, la creatività deve
utilizza l'app %%WINNING_PRICE%%
di Google
.
Quando queste macro vengono espanse, restituiscono il prezzo vincente in una in forma criptata. Possono essere incluse in una creatività, ad esempio, con un richiesta di pixel invisibile visualizzata come parte dell'annuncio:
<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>
La macro ${AUCTION_PRICE}
può essere inclusa anche nell'URL VAST di
una creatività video, ma non nell'URL impressione in VAST:
https://example.com/vast/v?price=${AUCTION_PRICE}
Scenario
- La tua applicazione per le offerte OpenRTB include il
${AUCTION_PRICE}
nello snippet HTML o nell'URL VAST che restituisce a Google. - Google sostituisce il prezzo vincente con la macro in un ambiente non riempito, sicuro per il web Codifica Base64 (RFC 3548).
- Lo snippet trasmette la conferma nel formato che hai scelto. Per Ad esempio, la conferma potrebbe essere trasmessa nell'URL di un pixel invisibile richiesta visualizzata come parte dell'annuncio.
- Sul server, la tua applicazione, sicura per il web, in base64 decodifica il prezzo vincente informazioni e decripta il risultato.
Dipendenze
È necessaria una libreria crittografica che supporti l'HMAC SHA-1, come Apre
Codice di esempio
Il codice campione è fornito in Java e C++ e può essere scaricato dal privatedatacommunicationprotocol progetto.
Il codice di esempio Java utilizza il decoder base64 del database Apache progetto Commons. Non dovrai scaricare il codice Apache Commons, poiché l'implementazione del riferimento include la parte necessaria ed è quindi indipendente.
Il codice di esempio C++ utilizza la classe OpenSSL metodo BIO base64. Prende una stringa sicura per il web con codifica Base64 (RFC 3548) e la decodifica. Normalmente, le stringhe Base64 sicure per il web sostituiscono "=" spaziatura interna con "." (tieni presente che le virgolette vengono aggiunte per maggiore chiarezza e non sono incluse nel ) ma la sostituzione della macro non copre il prezzo criptato. La dell'implementazione nei riferimenti aggiunge spaziatura interna perché OpenSSL ha problemi con stringhe non riempite.
Codifica
Per ottenere la crittografia e la decrittografia di un prezzo vincente, sono necessari due segreti, ma condivisi
chiave. Una chiave di integrità e una chiave di crittografia, denominata i_key
,
e e_key
rispettivamente. Entrambe le chiavi sono fornite al momento della creazione dell'account
stringhe base64 sicure per il web e disponibili sulla pagina di Authorized Buyers
sotto Offerente
impostazioni > Impostazioni RTB > Chiavi di crittografia.
Esempi di chiavi di integrità e crittografia:
skU7Ax_NL5pPAFyKdkfZjZz2-VhIN8bjj1rVFOaJ_5o= // Encryption key (e_key) arO23ykdNqUQ5LEoQ0FVmPkBd7xB5CO89PDZlSjpFxo= // Integrity key (i_key)
Le chiavi devono essere decodificate in modo sicuro per il web e poi decodificate in base64 dal applicazione:
e_key = WebSafeBase64Decode('skU7Ax_NL5pPAFyKdkfZjZz2-VhIN8bjj1rVFOaJ_5o=') i_key = WebSafeBase64Decode('arO23ykdNqUQ5LEoQ0FVmPkBd7xB5CO89PDZlSjpFxo=')
Schema di crittografia
Il prezzo è criptato utilizzando uno schema di crittografia personalizzato progettato per ridurre al minimo l'overhead delle dimensioni garantendo al contempo una sicurezza adeguata. Lo schema di crittografia utilizza un algoritmo HMAC con chiave per generare un secret pad basato sul codice ID evento di impressione.
Il prezzo criptato ha una lunghezza fissa di 28 byte. È composto da un Vettore di inizializzazione da 16 byte, 8 byte di testo crittografato e integrità a 4 byte firma. Il prezzo criptato è sicuro per il web con codifica Base64, secondo la specifica RFC 3548, con caratteri di spaziatura omessi. Di conseguenza, il prezzo criptato da 28 byte codificata come stringa base-64 sicura per il web di 38 caratteri, indipendentemente dalla prezzo pagato.
Esempi di prezzi criptati:
YWJjMTIzZGVmNDU2Z2hpN7fhCuPemCce_6msaw // 100 CPI micros YWJjMTIzZGVmNDU2Z2hpN7fhCuPemCAWJRxOgA // 1900 CPI micros YWJjMTIzZGVmNDU2Z2hpN7fhCuPemC32prpWWw // 2700 CPI micros
Il formato criptato è:
{initialization_vector (16 bytes)}{encrypted_price (8 bytes)} {integrity (4 bytes)}
Il prezzo è criptato come <price xor HMAC(encryption_key,
initialization_vector)>
, quindi la decrittografia calcola
HMAC(encryption_key,initialization_vector)
e xor's con
prezzo criptato per invertire la crittografia. La fase di integrità accetta 4 byte di
<HMAC(integrity_key, price||initialization_vector)>
dove
||
è una concatenazione.
Input | |
---|---|
iv |
vettore di inizializzazione (16 byte, univoco per l'impressione) |
e_key |
chiave di crittografia (32 byte, fornita al momento della configurazione dell'account) |
i_key |
chiave di integrità (32 byte, fornita al momento della configurazione dell'account) |
price |
(8 byte - in micro della valuta dell'account) |
Notazione | |
hmac(k, d) |
HMAC SHA-1 dei dati d , con la chiave k |
a || b |
stringa a concatenata con la stringa b |
Pseudocodice | |
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 ) |
Schema di decriptazione
Il codice di decriptazione deve decriptare il prezzo utilizzando la chiave di crittografia e verificare i bit di integrità con la chiave di integrità. Le chiavi verranno fornite durante la configurazione. Non sono previste limitazioni sui dettagli a strutturare la tua implementazione. Per la maggior parte, dovresti essere in grado di il codice campione e adattalo alle tue esigenze.
Input | |
---|---|
e_key |
chiave di crittografia, 32 byte, fornita al momento della configurazione dell'account |
i_key |
chiave di integrità, 32 byte, fornita al momento della configurazione dell'account |
final_message |
38 caratteri sicuri per il web con codifica Base64 |
Pseudocodice | |
// 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) |
Rileva gli attacchi a risposta inattivo
Per rilevare attacchi inattivi, o di ripetizione, ti consigliamo di filtra le risposte con un timestamp significativamente diverso da quello del sistema nel tempo, dopo aver tenuto conto delle differenze di fuso orario.
Il vettore di inizializzazione contiene un timestamp nei primi 8 byte. Può possono essere lette dalla seguente funzione C++:
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) }
Il timestamp può essere convertito in un formato leggibile utilizzando: Codice C++:
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);
Libreria Java
Anziché implementare gli algoritmi di crittografia per codificare e decodificare il prezzo vincente, puoi utilizzare DoubleClickCrypto.java. Per ulteriori informazioni, vedi Crittografia.