डिक्रिप्ट की गई कीमत की पुष्टि

जब आपका क्रिएटिव किसी नीलामी में जीतता है, तो Google आपको बता सकता है कि नीलामी में कौनसा क्रिएटिव जीत रहा है क्रिएटिव में काम का मैक्रो शामिल होने पर ही कीमत तय होती थी.

अगर बिड करने वाले को OpenRTB प्रोटोकॉल का इस्तेमाल करने के लिए कॉन्फ़िगर किया गया है, तो क्रिएटिव अपनी बोली के साथ शामिल करने पर IAB के ${AUCTION_PRICE} का उपयोग करना चाहिए मैक्रो.

अगर बिड करने वाला व्यक्ति ऐसे Google आरटीबी प्रोटोकॉल का इस्तेमाल करता है जो अब काम नहीं करता, तो क्रिएटिव को Google के %%WINNING_PRICE%% का इस्तेमाल करें मैक्रो.

जब इन मैक्रो को विस्तृत किया जाता है, तो वे एन्क्रिप्ट किया गया रूप है. उन्हें किसी क्रिएटिव में शामिल किया जा सकता है, उदाहरण के लिए, विज्ञापन के हिस्से के तौर पर दिखने वाला पिक्सल का अनुरोध:

<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} मैक्रो को इसके VAST URL में भी शामिल किया जा सकता है वीडियो क्रिएटिव है, लेकिन VAST में इंप्रेशन यूआरएल में नहीं:

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

स्थिति

  1. आपके OpenRTB बिडिंग ऐप्लिकेशन में ${AUCTION_PRICE} शामिल है एचटीएमएल स्निपेट या VAST यूआरएल में मैक्रो.
  2. वेब-सुरक्षित मोड में, मैक्रो की जगह Google, जीत हासिल करने वाली कीमत बदल देता है base64 एन्कोडिंग (RFC 3548) है.
  3. स्निपेट, आपके चुने गए फ़ॉर्मैट में पुष्टि को पास करता है. इसके लिए उदाहरण के लिए, हो सकता है कि पुष्टि न दिखने वाले पिक्सल के यूआरएल में पास की जाए अनुरोध किया जाता है.
  4. सर्वर पर, आपका ऐप्लिकेशन वेब-सुरक्षित base64 बोली जीतने की कीमत को डिकोड करता है और खोज के नतीजे को डिक्रिप्ट करता है.

डिपेंडेंसी

आपको एक ऐसी क्रिप्टो लाइब्रेरी की ज़रूरत होगी जो SHA-1 एचएमएसी के साथ काम करती हो, जैसे Openएसएसएल.

नमूना कोड

नमूना कोड Java और C++ में दिया जाता है और इसे privatedatacommunicationprotocol से डाउनलोड किया जा सकता है प्रोजेक्ट.

  • Java का सैंपल कोड, Apache के base64 डिकोडर का इस्तेमाल करता है Commons Project से बनाया गया है. आपको Apache Commons कोड डाउनलोड करने की ज़रूरत नहीं है, क्योंकि रेफ़रंस के तौर पर लागू करने की प्रोसेस में ज़रूरी हिस्सा शामिल होता है, इसलिए अपने-आप में पूरा हो.

  • C++ नमूना कोड OpenSSL का इस्तेमाल करता है base64 BIO तरीका. यह वेब पर सुरक्षित रहने वाली base64 कोड में बदली गई स्ट्रिंग (RFC 3548) लेता है और उसे डिकोड करता है. आम तौर पर, वेब पर सुरक्षित रहने वाली Base64 स्ट्रिंग, "=" को बदल देती हैं पैडिंग के साथ "." (ध्यान दें कि साफ़ तौर पर पढ़ने के लिए कोटेशन मार्क जोड़े जाते हैं और उन्हें प्रोटोकॉल) शामिल किया जाता है, लेकिन मैक्रो प्रतिस्थापन एन्क्रिप्टेड मूल्य को पैड नहीं करता है. कॉन्टेंट बनाने संदर्भ लागू करने की प्रोसेस के दौरान पैडिंग (जगह) जोड़ी जाती है, क्योंकि OpenSSL को बिना पैड वाली स्ट्रिंग.

एन्कोडिंग

जीत की कीमत को एन्क्रिप्ट (सुरक्षित) करने और डिक्रिप्ट करने की सुविधा के लिए, आपको दो सीक्रेट टोकन की ज़रूरत होती है. हालांकि, इन्हें शेयर करना ज़रूरी है, बटन का इस्तेमाल करें. इंटिग्रिटी कुंजी और एन्क्रिप्ट (सुरक्षित) करने की कुंजी, जिसे i_key कहा जाता है, और e_key, दोनों में से एक है. खाता सेटअप करते समय, दोनों कुंजियां इस तरह से दी जाती हैं बुनियादी 64 स्ट्रिंग, वेब पर सुरक्षित हैं. इन्हें Authorized Buyers पेज पर जाकर देखा जा सकता है बिडर के नीचे सेटिंग > आरटीबी सेटिंग > एन्क्रिप्ट (सुरक्षित) करने वाली कुंजियां.

इंटिग्रिटी और एन्क्रिप्ट (सुरक्षित) करने वाली कुंजियों के उदाहरण:

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

कुंजियां, वेब पर सुरक्षित रहने वाली कुंजियों को डिकोड करके होनी चाहिए. इसके बाद, base64 को आपके कोड से डिकोड किया जाना चाहिए ऐप्लिकेशन:

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

एन्क्रिप्शन स्कीम

कीमत को एन्क्रिप्ट (सुरक्षित) करने की ऐसी कस्टम स्कीम का इस्तेमाल करके एन्क्रिप्ट (सुरक्षित) किया जाता है जिसे इस तरह से डिज़ाइन किया गया है पर्याप्त सुरक्षा पक्का करते हुए ओवरहेड को कम से कम रखें. एन्क्रिप्शन स्कीम एक कुंजी वाले HMAC एल्गोरिदम का इस्तेमाल करके, इंप्रेशन इवेंट आईडी का इस्तेमाल करें.

एन्क्रिप्ट (सुरक्षित) की गई कीमत की लंबाई 28 बाइट होती है. इसमें शामिल है 16-बाइट इनिशलाइज़ेशन वेक्टर, 8 बाइट साइफ़रटेक्स्ट, और 4-बाइट इंटिग्रिटी हस्ताक्षर करें. आरएफ़सी के मुताबिक, एन्क्रिप्ट (सुरक्षित) की गई कीमत को वेब पर सुरक्षित रखा गया है और इसकी Base64 कोड में बदली गई कीमत है 3548 है, जिसमें पैडिंग वर्ण शामिल नहीं हैं. इस तरह, 28-बाइट एन्क्रिप्ट की गई कीमत कोड में बदली गई, 38 वर्ण की वेब-सेफ़ स्ट्रिंग-64 स्ट्रिंग के तौर पर एन्कोड की गई है. भले ही, इस गेम में कोई भी विजेता हो कीमत चुका दी गई है.

एन्क्रिप्ट (सुरक्षित) की गई कीमतों के उदाहरण:

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

एन्क्रिप्ट (सुरक्षित) किया गया फ़ॉर्मैट यह है:

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

कीमत को <price xor HMAC(encryption_key, initialization_vector)> के तौर पर एन्क्रिप्ट (सुरक्षित) किया जाता है. इसलिए, डिक्रिप्शन कैलकुलेट करता है HMAC(encryption_key,initialization_vector) और xor's कीमत को पहले जैसा करने के लिए, कीमत को एन्क्रिप्ट (सुरक्षित) किया जाता है. इंटिग्रिटी स्टेज में, 4 बाइट <HMAC(integrity_key, price||initialization_vector)> जहां || को जोड़ने की प्रोसेस है.

इनपुट
iv इनिशलाइज़ेशन वेक्टर (16 बाइट - इंप्रेशन के लिए यूनीक)
e_key एन्क्रिप्शन की (32 बाइट - खाता सेट अप के समय दी जाती है)
i_key इंटिग्रिटी कुंजी (32 बाइट - खाते के सेट अप के समय दी जाती है)
price (8 बाइट - खाते की मुद्रा के माइक्रो में)
नोटेशन
hmac(k, d) k कुंजी का इस्तेमाल करके, d डेटा का SHA-1 HMAC
a || b स्ट्रिंग a को b स्ट्रिंग से जोड़ा गया है
स्यूडोकोड
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 )

डिक्रिप्शन स्कीम

आपके डिक्रिप्शन कोड को कीमत को एन्क्रिप्ट (सुरक्षित) करने वाली कुंजी का इस्तेमाल करके डिक्रिप्ट करना होगा. इसके लिए, इंटिग्रिटी कुंजी की मदद से, इंटिग्रिटी बिट की पुष्टि करें. ये कुंजियां दी जाएंगी आपके. आपकी जानकारी पर कोई पाबंदी नहीं है लागू करने के लिए एक स्ट्रक्चर तैयार करें. ज़्यादातर मामलों में, आपको और इसे अपनी ज़रूरत के हिसाब से बदल सकते हैं.

इनपुट
e_key एन्क्रिप्शन की, 32 बाइट - खाता सेट अप करते समय दी जाती है
i_key इंटिग्रिटी कुंजी, 32 बाइट - खाते के सेट अप के समय दी जाती है
final_message वेब-सुरक्षित base64 कोड में 38 वर्ण
स्यूडोकोड
// 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)

पुरानी जानकारी वाले जवाब के हमलों का पता लगाएं

पुरानी जानकारी का पता लगाने या उसे फिर से चलाने के लिए, हमारा सुझाव है कि ऐसे टाइमस्टैंप के साथ जवाबों को फ़िल्टर करें जो सिस्टम से काफ़ी अलग हों समय.

इनिशलाइज़ेशन वेक्टर में शुरुआती 8 बाइट का टाइमस्टैंप होता है. यह काम कर सकता है इन्हें नीचे दिए गए 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)
}

नीचे दिए गए तरीके का इस्तेमाल करके टाइमस्टैंप को ऐसे फ़ॉर्मैट में बदला जा सकता है जिसे कोई भी व्यक्ति पढ़ सके 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);

Java लाइब्रेरी

कोड में बदलने और डिकोड करने के लिए, क्रिप्टो एल्गोरिदम लागू करने के बजाय सही कीमत हासिल की है, तो इसका इस्तेमाल करें DoubleClickCrypto.java. ज़्यादा जानकारी के लिए, यह देखें क्रिप्टोग्राफ़ी.