Reklam öğeniz bir açık artırmayı kazandığında Google, kazananın ne olacağını size bildirebilir. fiyatı reklam öğesinin alakalı makroyu içermesidir.
Teklif vereniniz OpenRTB protokolünü kullanacak şekilde yapılandırılmışsa reklam öğesi
dahil edilen reklamlarda IAB'nin ${AUCTION_PRICE}
makrosu ile ilgili bazı bilgiler bulabilirsiniz.
Teklif vereniniz kullanımdan kaldırılan Google GZT protokolünü kullanıyorsa reklam öğesi
Google'ın %%WINNING_PRICE%%
bağlantısını kullanın
makrosu ile ilgili bazı bilgiler bulabilirsiniz.
Bu makrolar genişletildiğinde, kazanan fiyatı şifrelenmiş formdur. Bunlar bir reklam öğesine dahil edilebilir. Örneğin, reklamın bir parçası olarak oluşturulan görünmez piksel isteği:
<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>
${AUCTION_PRICE}
makrosu,
bir video reklam öğesidir, ancak VAST'taki gösterim URL'sinde yer almaz:
https://example.com/vast/v?price=${AUCTION_PRICE}
Senaryo
- OpenRTB teklif verme uygulamanız
${AUCTION_PRICE}
içerir makroyu Google'a döndürdüğü HTML snippet'ine veya VAST URL'sine ekleyebilir. - Google, makro için kazanan fiyatı doldurulmamış web güvenli dosyasında değiştirir base64 kodlaması (RFC 3548).
- Snippet, onayı seçtiğiniz biçimde iletir. Örneğin, Örneğin onay, görünmez bir pikselin URL'sinde isteğidir.
- Sunucuda, web güvenli base64 uygulamanız kazanan fiyatın kodunu çözer ve sonucun şifresini çözer.
Bağımlılıklar
SHA-1 HMAC'yi destekleyen bir şifreleme kitaplığına ihtiyacınız olacak. Örneğin: Openssl.
Örnek kod
Örnek kod Java ve C++'ta sağlanır ve privatedatacommunicationprotocol'dan indirilebilir inceleyebilirsiniz.
Java örnek kodu, Apache'deki base64 kod çözücüyü kullanır ortak bir projedir. Apache ortak kodunu indirmeniz gerekmez. referans uygulama gerekli kısmı içerdiğinden bağımsız olması gerekir.
C++ örnek kodu, OpenSSL base64 BIO yöntemini kullanın. Web güvenli base64 kodlu bir dize (RFC 3548) alır ve bu dizenin kodunu çözer. Normalde, web güvenli base64 dizeleri "=" dolgu "." ( anlaşılabilir olması için tırnak işaretleri eklenir ve bu protokolü) ancak makro değişikliği şifrelenmiş fiyatı doldurmaz. İlgili içeriği oluşturmak için kullanılan OpenSSL'nin tamamlanmamış dizeler bulunur.
Kodlama
Fiyat şifreleme ve şifre çözme işlemlerini kazanmak için iki gizli anahtar gerekir ama paylaşılan,
tuşlarını kullanın. i_key
olarak adlandırılan bir bütünlük anahtarı ve şifreleme anahtarı
ve e_key
. Her iki anahtar da hesap kurulumu sırasında
web için güvenli base64 dizeleri bulunur ve Authorized Buyers sayfasında bulunabilir
Teklif veren altında
Ayarlar > GZT ayarları > Şifreleme anahtarları.
Örnek bütünlük ve şifreleme anahtarları:
skU7Ax_NL5pPAFyKdkfZjZz2-VhIN8bjj1rVFOaJ_5o= // Encryption key (e_key) arO23ykdNqUQ5LEoQ0FVmPkBd7xB5CO89PDZlSjpFxo= // Integrity key (i_key)
Anahtarların kodu web'de güvenli bir şekilde çözülmeli ve ardından uygulama:
e_key = WebSafeBase64Decode('skU7Ax_NL5pPAFyKdkfZjZz2-VhIN8bjj1rVFOaJ_5o=') i_key = WebSafeBase64Decode('arO23ykdNqUQ5LEoQ0FVmPkBd7xB5CO89PDZlSjpFxo=')
Şifreleme şeması
Fiyat, aşağıdaki şartları karşılayan özel bir şifreleme şeması kullanılarak şifrelenir: ve yeterli güvenliği sağlarken ek yükü de en aza indirmelidir. Şifreleme şeması benzersiz verilere ve gizli alan oluşturmak için anahtarlı bir HMAC algoritması gösterim etkinlik kimliği.
Şifrelenmiş fiyatın 28 bayt sabit uzunluğu vardır. Web bileşenlerinden oluşan bir 16 baytlık başlatma vektörü, 8 baytlık şifrelenmiş metin ve 4 baytlık bütünlük imzası var. Şifrelenmiş fiyat, RFC'ye göre web güvenli base64 kodludur 3548, dolgu karakterleri atlanmıştır. Bu nedenle, 28 baytlık şifrelenmiş fiyat kazanandan bağımsız olarak 38 karakterlik web güvenli base-64 dizesi olarak kodlanır ücreti ödemek istemezsiniz.
Şifrelenmiş fiyatlara örnek:
YWJjMTIzZGVmNDU2Z2hpN7fhCuPemCce_6msaw // 100 CPI micros YWJjMTIzZGVmNDU2Z2hpN7fhCuPemCAWJRxOgA // 1900 CPI micros YWJjMTIzZGVmNDU2Z2hpN7fhCuPemC32prpWWw // 2700 CPI micros
Şifrelenmiş biçim:
{initialization_vector (16 bytes)}{encrypted_price (8 bytes)} {integrity (4 bytes)}
Fiyat, <price xor HMAC(encryption_key,
initialization_vector)>
olarak şifrelendiği için şifre çözme işlemi
HMAC(encryption_key,initialization_vector)
ve xor'lar
şifrelemeyi tersine çevirmek için şifrelenmiş fiyatı kullanın. Bütünlük aşaması 4 bayt
<HMAC(integrity_key, price||initialization_vector)>
burada:
||
birleştiriliyor.
Girişler | |
---|---|
iv |
başlatma vektörü (16 bayt - gösterime özgü) |
e_key |
şifreleme anahtarı (32 bayt - hesap kurulumu sırasında sağlanır) |
i_key |
bütünlük anahtarı (32 bayt - hesap kurulumu sırasında sağlanır) |
price |
(8 bayt - hesap para biriminin mikro cinsinden) |
Notasyon | |
hmac(k, d) |
k anahtarı kullanılarak d verilerinin SHA-1 HMAC'si |
a || b |
a dizesi, b dizesiyle birleştirilmiş |
Sözde kod | |
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 ) |
Şifre çözme şeması
Şifre çözme kodunuz, şifreleme anahtarını kullanarak fiyatın şifresini çözmelidir ve bütünlük bitlerini bütünlük anahtarıyla doğrular. Anahtarlar, size yardımcı olabilir. Bilgileriniz için geçerli ayrıntılarla ilgili herhangi bir kısıtlama ve yapın. Çoğunlukla, projeyle ilgili ve ihtiyaçlarınıza göre uyarlayın.
Girişler | |
---|---|
e_key |
şifreleme anahtarı, 32 bayt (hesap kurulumu sırasında sağlanır) |
i_key |
bütünlük anahtarı, 32 bayt - hesap kurulumu sırasında sağlanır |
final_message |
Web güvenli base64 kodlu 38 karakter |
Sözde kod | |
// 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) |
Eski yanıt saldırılarını tespit etme
Eski yanıtları veya tekrar oynatılan saldırıları tespit etmek için Sistemden önemli ölçüde farklı bir zaman damgasıyla yanıtları filtrele elde edebilirsiniz.
Başlatma vektörü, ilk 8 baytta bir zaman damgası içerir. O da aşağıdaki C++ işlevi tarafından okunmalıdır:
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) }
Zaman damgası, aşağıdaki kullanılarak okunabilir bir forma dönüştürülebilir. C++ kodu:
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 kitaplığı
Kodlamak ve kodunu çözmek için kripto algoritmalarını uygulamak yerine her halükarda DoubleClickCrypto.java. Daha fazla bilgi için bkz. Kriptografi.