Déchiffrer les confirmations de prix

Lorsque votre création remporte une enchère, Google peut vous indiquer si la création inclut la macro appropriée.

Si votre système d'enchères est configuré pour utiliser le protocole OpenRTB, l'annonce inclus dans votre enchère doivent utiliser la ${AUCTION_PRICE} de l'IAB. .

Si votre système d'enchères utilise le protocole obsolète de Google RTB, la création doit utilisez la %%WINNING_PRICE%% de Google .

<ph type="x-smartling-placeholder">

Lorsque ces macros sont développées, elles renvoient le prix gagnant dans un sous forme chiffrée. Vous pouvez les inclure dans une création, par exemple à l'aide d'une demande de pixel invisible affichée dans l'annonce:

<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} peut également être incluse dans l'URL VAST de dans une création vidéo, mais pas dans l'URL d'impression VAST:

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

Scénario

  1. Votre application d'enchères OpenRTB inclut le ${AUCTION_PRICE} dans l'extrait de code HTML ou l'URL VAST qu'il renvoie à Google.
  2. Google remplace le prix gagnant dans la macro dans un format sans séparation entre les éléments adaptés au Web. Encodage base64 (RFC 3548).
  3. L'extrait transmet la confirmation au format que vous avez choisi. Pour exemple, la confirmation peut être transmise dans l'URL d'un pixel invisible s'affiche dans l'annonce.
  4. Sur le serveur, votre application au format base64 adapté au Web décode le prix gagnant les informations et déchiffre le résultat.

Dépendances

Vous avez besoin d'une bibliothèque de chiffrement compatible avec SHA-1 HMAC, telle que Openssl

Exemple de code

L'exemple de code est fourni en Java et C++ et peut être téléchargé à partir du protocole privatedatacommunicationprotocol projet.

  • L'exemple de code Java utilise le décodeur base64 du modèle Apache projet Commons. Vous n'aurez pas besoin de télécharger le code Apache Commons, car l'implémentation de référence inclut la partie nécessaire et est donc autonome.

  • L'exemple de code C++ utilise la bibliothèque OpenSSL méthode BIO en base64. Il utilise une chaîne au format base64 adapté au Web (RFC 3548) et la décode. Normalement, les chaînes base64 adaptées au Web remplacent "=" une marge intérieure avec "." (notez que Les guillemets sont ajoutés pour plus de clarté et ne sont pas inclus dans le ), mais la macro de substitution ne comble pas le prix chiffré. La de référence ajoute une marge intérieure, car OpenSSL rencontre des difficultés des chaînes sans remplissage.

Encodage

Le chiffrement et le déchiffrement des prix ont besoin de deux secrets, mais partagés clés. Une clé d'intégrité et une clé de chiffrement, appelées i_key, et e_key respectivement. Les deux clés sont fournies lors de la configuration du compte chaînes base64 adaptées au Web, disponibles sur la page Authorized Buyers sous Enchérisseur Paramètres > Paramètres RTB > Clés de chiffrement.

Exemples de clés de chiffrement et d'intégrité:

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

Les clés doivent être décodées pour le Web, puis décodées en base64 par votre application:

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

Schéma de chiffrement

Le prix est chiffré à l'aide d'un schéma personnalisé, conçu pour réduire les coûts associés à la taille tout en assurant une sécurité adéquate. Le schéma de chiffrement utilise un algorithme HMAC à clé pour générer un pad secret basé sur le code unique ID d'événement d'impression.

Le prix chiffré a une longueur fixe de 28 octets. Il se compose d'un Vecteur d'initialisation de 16 octets, 8 octets de texte chiffré et intégrité de 4 octets signature. Le prix chiffré est encodé au format base64 adapté au Web, conformément à la spécification RFC. 3548, avec des caractères de marge intérieure omis Ainsi, le prix chiffré sur 28 octets est encodée au format base64 adapté au Web de 38 caractères, quelle que soit la prix payé.

Exemples de prix chiffrés:

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

Le format chiffré est le suivant:

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

Le prix est chiffré en tant que <price xor HMAC(encryption_key, initialization_vector)>, donc le déchiffrement calcule HMAC(encryption_key,initialization_vector) et xor avec le un prix chiffré pour inverser le chiffrement. La phase d'intégrité dure 4 octets <HMAC(integrity_key, price||initialization_vector)>|| correspond à une concaténation.

Entrées
iv Vecteur d'initialisation (16 octets ; unique pour l'impression)
e_key Clé de chiffrement (32 octets ; fournie lors de la configuration du compte)
i_key Clé d'intégrité (32 octets ; fournie lors de la configuration du compte)
price (8 octets, en micro-unités de la devise du compte)
Notation
hmac(k, d) SHA-1 HMAC de données d, à l'aide de la clé k
a || b chaîne a concaténée avec la chaîne b
Pseudo-code
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 )

Schéma de déchiffrement

Votre code de déchiffrement doit déchiffrer le prix à l'aide de la clé de chiffrement. vérifier les bits d'intégrité à l'aide de la clé d'intégrité. Les clés seront fournies lors de la configuration. Aucune restriction ne s'applique structurer votre implémentation. Dans la plupart des cas, vous devriez être en mesure de l'exemple de code et de l'adapter en fonction de vos besoins.

Entrées
e_key Clé de chiffrement (32 octets) fournie lors de la configuration du compte
i_key Clé d'intégrité (32 octets) fournie lors de la configuration du compte
final_message Encodage base64 adapté au Web en 38 caractères
Pseudo-code
// 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)

Détecter les attaques de réponses obsolètes

Pour détecter les attaques par rejeu ou de réponse obsolètes, il est recommandé filtrer les réponses dont le code temporel diffère considérablement de celui du système en tenant compte des différences de fuseau horaire.

Le vecteur d'initialisation contient un horodatage dans les 8 premiers octets. Il peut être lu par la fonction C++ suivante:

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)
}

Le code temporel peut être converti dans un format lisible par l'humain à l'aide de la commande suivante : Code 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);

bibliothèque Java

Au lieu d’implémenter les algorithmes de chiffrement pour encoder et décoder le prix gagnant, vous pouvez utiliser <ph type="x-smartling-placeholder"></ph> DoubleClickCrypto.java. Pour en savoir plus, consultez Cryptographie :