Decriptazione dei prezzi di conferma

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

  1. La tua applicazione per le offerte OpenRTB include il ${AUCTION_PRICE} nello snippet HTML o nell'URL VAST che restituisce a Google.
  2. Google sostituisce il prezzo vincente con la macro in un ambiente non riempito, sicuro per il web Codifica Base64 (RFC 3548).
  3. 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.
  4. 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.