ডিক্রিপ্ট মূল্য নিশ্চিতকরণ

যখন আপনার সৃজনশীল একটি নিলামে জয়লাভ করে, তখন Google আপনাকে জানাতে পারে যে বিজয়ী মূল্য কত ছিল, যদি HTML স্নিপেট বা VAST URL যেটি সৃজনশীলটিকে সংজ্ঞায়িত করে তাতে 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 URL-এও অন্তর্ভুক্ত করা যেতে পারে (কিন্তু VAST-এর ইম্প্রেশন URL-এ নয়):

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

দৃশ্যকল্প

  1. আপনার অ্যাপ্লিকেশানটি HTML স্নিপেটে বা VAST URL-এ WINNING_PRICE ম্যাক্রো অন্তর্ভুক্ত করে যা এটি Google-এ ফেরত দেয়৷
  2. গুগল আনপ্যাডেড ওয়েব-সেফ বেস64 এনকোডিং ( RFC 3548 ) এ ম্যাক্রোর জন্য বিজয়ী মূল্য প্রতিস্থাপন করে।
  3. স্নিপেট আপনার নির্বাচিত বিন্যাসে নিশ্চিতকরণ পাস করে। উদাহরণস্বরূপ, বিজ্ঞাপনের অংশ হিসাবে রেন্ডার করা একটি অদৃশ্য পিক্সেল অনুরোধের URL-এ নিশ্চিতকরণ পাস হতে পারে।
  4. সার্ভারে, আপনার অ্যাপ্লিকেশন ওয়েব-সেফ বেস64 বিজয়ী মূল্যের তথ্য ডিকোড করে এবং ফলাফল ডিক্রিপ্ট করে।

নির্ভরতা

আপনার একটি ক্রিপ্টো লাইব্রেরি প্রয়োজন যা SHA-1 HMAC সমর্থন করে, যেমন Openssl।

কোডের উদাহরণ

নমুনা কোড জাভা এবং C++ এ প্রদান করা হয়েছে এবং ব্যক্তিগত ডেটা কমিউনিকেশন প্রোটোকল প্রকল্প থেকে ডাউনলোড করা যেতে পারে।

  • জাভা নমুনা কোড Apache কমন্স প্রকল্প থেকে base64 ডিকোডার ব্যবহার করে। আপনাকে অ্যাপাচি কমন্স কোড ডাউনলোড করতে হবে না, কারণ রেফারেন্স বাস্তবায়নে প্রয়োজনীয় অংশ রয়েছে এবং তাই এটি স্বয়ংসম্পূর্ণ।

  • C++ নমুনা কোড OpenSSL base64 BIO পদ্ধতি ব্যবহার করে। এটি একটি ওয়েব-নিরাপদ বেস64 এনকোডেড স্ট্রিং ( RFC 3548 ) নেয় এবং এটি ডিকোড করে। সাধারণত, ওয়েব-সেফ বেস64 স্ট্রিংগুলি "=" প্যাডিংকে "" দিয়ে প্রতিস্থাপন করে। (মনে রাখবেন যে উদ্ধৃতি চিহ্নগুলি পড়ার স্পষ্টতার জন্য যোগ করা হয়েছে এবং প্রোটোকলের মধ্যে অন্তর্ভুক্ত নয়) কিন্তু ম্যাক্রো প্রতিস্থাপন এনক্রিপ্ট করা মূল্য প্যাড করে না। রেফারেন্স ইমপ্লিমেন্টেশন প্যাডিং যোগ করে কারণ OpenSSL-এর প্যাড না করা স্ট্রিং নিয়ে সমস্যা আছে।

এনকোডিং

বিজয়ী মূল্য এনক্রিপশন এবং ডিক্রিপশন দুটি গোপন, কিন্তু ভাগ করা কী প্রয়োজন। একটি অখণ্ডতা কী, এবং এনক্রিপশন কী, যথাক্রমে i_key এবং e_key হিসাবে উল্লেখ করা হয়। উভয় কীই ওয়েব-সেফ বেস64 স্ট্রিং হিসাবে অ্যাকাউন্ট সেটআপে সরবরাহ করা হয় এবং বিডার সেটিংস > RTB সেটিংস > এনক্রিপশন কীগুলির অধীনে অনুমোদিত ক্রেতা পৃষ্ঠায় পাওয়া যেতে পারে।

উদাহরণ অখণ্ডতা এবং এনক্রিপশন কী:

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

কীগুলি ওয়েব-নিরাপদ ডিকোড করা উচিত এবং তারপর আপনার অ্যাপ্লিকেশন দ্বারা বেস64 ডিকোড করা উচিত:

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

এনক্রিপশন স্কিম

মূল্য একটি কাস্টম এনক্রিপশন স্কিম ব্যবহার করে এনক্রিপ্ট করা হয়েছে যা পর্যাপ্ত নিরাপত্তা নিশ্চিত করার সময় ওভারহেডের আকার ছোট করার জন্য ডিজাইন করা হয়েছে। এনক্রিপশন স্কিম অনন্য ইমপ্রেশন ইভেন্ট আইডির উপর ভিত্তি করে একটি গোপন প্যাড তৈরি করতে একটি কীড HMAC অ্যালগরিদম ব্যবহার করে।

এনক্রিপ্ট করা মূল্য 28 বাইটের একটি নির্দিষ্ট দৈর্ঘ্য আছে। এটি একটি 16-বাইট ইনিশিয়ালাইজেশন ভেক্টর, 8 বাইট সাইফারটেক্সট এবং একটি 4-বাইট অখণ্ডতার স্বাক্ষর নিয়ে গঠিত। এনক্রিপ্ট করা মূল্য হল ওয়েব-সেফ বেস64-এনকোডেড, RFC 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 এর হিসাব করে। ইন্টিগ্রিটি স্টেজে 4 বাইট লাগে <HMAC(integrity_key, price||initialization_vector)> যেখানে || সংমিশ্রণ হয়।

ইনপুট
iv ইনিশিয়ালাইজেশন ভেক্টর (16 বাইট - ইম্প্রেশনের জন্য অনন্য)
e_key এনক্রিপশন কী (32 বাইট - অ্যাকাউন্ট সেট আপ করার সময় দেওয়া)
i_key অখণ্ডতা কী (32 বাইট - অ্যাকাউন্ট সেট আপ করার সময় দেওয়া)
price (8 বাইট - অ্যাকাউন্ট মুদ্রার মাইক্রোতে)
স্বরলিপি
hmac(k, d) d এর SHA-1 HMAC, কী k ব্যবহার করে
a || b স্ট্রিং a concatenated with string 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টি অক্ষরের ওয়েব-সেফ বেস64 এনকোড করা
সুডোকোড
// 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);

জাভা লাইব্রেরি

বিজয়ী মূল্য এনকোড এবং ডিকোড করতে ক্রিপ্টো অ্যালগরিদম প্রয়োগ করার পরিবর্তে, আপনি DoubleClickCrypto.java ব্যবহার করতে পারেন। আরও তথ্যের জন্য, ক্রিপ্টোগ্রাফি দেখুন।