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

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

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

<div>
  <script language='JavaScript1.1' src='https://example.com?creativeID=5837243'/>
  <img src='https://example.com/t.gif?price=%%WINNING_PRICE%%' width='1' height='1'/>
</div>

WINNING_PRICE मैक्रो को वीडियो क्रिएटिव के VAST यूआरएल में भी शामिल किया जा सकता है (लेकिन VAST के इंप्रेशन यूआरएल में नहीं):

https://example.com/vast/v?price=%%WINNING_PRICE%%

उदाहरण

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

डिपेंडेंसी

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

नमूना कोड

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

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

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

एन्कोडिंग

कीमत को एन्क्रिप्ट (सुरक्षित) करने और डिक्रिप्ट करने की प्रक्रिया को जीतने के लिए, दो सीक्रेट, लेकिन शेयर किए गए पासकोड की ज़रूरत होती है. इंटिग्रिटी कुंजी और एन्क्रिप्शन कुंजी को i_key और e_key कहा जाता है. दोनों कुंजियां, खाता सेटअप करने के दौरान वेब-सुरक्षित base64 स्ट्रिंग के रूप में दी जाती हैं. इन्हें बिडर सेटिंग > आरटीबी सेटिंग > एन्क्रिप्ट (सुरक्षित) करने के तरीके में 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=')

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

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

एन्क्रिप्ट (सुरक्षित) की गई कीमत की लंबाई 28 बाइट होती है. इसमें 16-बाइट वाला इनिशलाइज़ेशन वेक्टर, 8 बाइट साइफ़रटेक्स्ट, और 4-बाइट इंटिग्रिटी सिग्नेचर होता है. एन्क्रिप्ट (सुरक्षित) की गई कीमत, आरएफ़सी 3548 के मुताबिक, वेब पर सुरक्षित base64 कोड में होती है और पैडिंग वर्ण हटा देती है. इसलिए, 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 का इस्तेमाल करता है. इंटिग्रिटी स्टेज में, <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 लाइब्रेरी

सबसे अच्छी कीमत को कोड में बदलने और डिकोड करने के लिए, क्रिप्टो एल्गोरिदम लागू करने के बजाय, DoubleClickक्रिप्टो.जावा का इस्तेमाल करें. ज़्यादा जानकारी के लिए, क्रिप्टोग्राफ़ी देखें.