Fiyat Onaylarının Şifresini Çözün

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

  1. OpenRTB teklif verme uygulamanız ${AUCTION_PRICE} içerir makroyu Google'a döndürdüğü HTML snippet'ine veya VAST URL'sine ekleyebilir.
  2. Google, makro için kazanan fiyatı doldurulmamış web güvenli dosyasında değiştirir base64 kodlaması (RFC 3548).
  3. Snippet, onayı seçtiğiniz biçimde iletir. Örneğin, Örneğin onay, görünmez bir pikselin URL'sinde isteğidir.
  4. 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.