जब आपका क्रिएटिव किसी नीलामी में जीतता है, तो 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}
स्थिति
- आपके OpenRTB बिडिंग ऐप्लिकेशन में
${AUCTION_PRICE}
शामिल है मैक्रो को मैन्युअल रूप से Google पर वापस करता है. - वेब-सुरक्षित मोड में, मैक्रो की जगह Google, जीतने वाली कीमत बदल देता है base64 एन्कोडिंग (RFC 3548) है.
- स्निपेट, आपके चुने गए फ़ॉर्मैट में पुष्टि को पास करता है. इसके लिए उदाहरण के लिए, हो सकता है कि पुष्टि न दिखने वाले पिक्सल के यूआरएल में पास की जाए अनुरोध किया जाता है.
- सर्वर पर, आपका ऐप्लिकेशन वेब-सुरक्षित 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 |
वेब पर काम करने वाले 38 वर्णों को कोड में बदला गया base64 कोड |
स्यूडोकोड | |
// 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. ज़्यादा जानकारी के लिए, यह देखें क्रिप्टोग्राफ़ी.