تأكيدات فك التشفير

عندما تفوز موادك الإبداعية في مزاد، يمكن أن تحصل على نموذج الإعلان الفائز من Google السعر إذا كان تصميم الإعلان يتضمن وحدة الماكرو ذات الصلة.

إذا تم ضبط نظام عرض السعر على استخدام بروتوكول OpenRTB، سيتم عرض ضمن عرض السعر لديك، يجب أن تستخدم السمة ${AUCTION_PRICE} وحدة ماكرو.

إذا كان مقدّم عرض الأسعار يستخدم بروتوكول عرض الأسعار في الوقت الفعلي (RTB) المتوقّف عن العمل، يجب أن استخدام %%WINNING_PRICE%% من Google وحدة ماكرو.

عندما يتم توسيع وحدات الماكرو هذه، فإنها تعرض السعر الفائز في نموذج مشفّر. ويمكن تضمينها في تصميم إعلان، مثلاً مع طلب بكسل غير مرئي معروض كجزء من الإعلان:

<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} في عنوان URL لنموذج عرض إعلانات الفيديو تصميم إعلان فيديو، ولكن ليس في عنوان URL لمرة الظهور في نموذج عرض إعلانات الفيديو (VAST):

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

السيناريو

  1. يتضمّن تطبيق عروض أسعار OpenRTB السمة ${AUCTION_PRICE}. في مقتطف HTML أو عنوان URL لنموذج عرض إعلانات الفيديو (VAST) الذي يتم عرضه إلى Google.
  2. تستبدل Google السعر الفائز بوحدة الماكرو في بيئة غير مضافة متوافقة مع الويب بترميز base64 (RFC 3548).
  3. ويمرر المقتطف التأكيد بالتنسيق الذي اخترته. بالنسبة على سبيل المثال، قد يتم تمرير التأكيد في عنوان URL لوحدة بكسل غير مرئية الطلب المعروض كجزء من الإعلان.
  4. على الخادم، يفكك تطبيقك base64 الآمن من الويب السعر الفائز المعلومات ويفك تشفير النتيجة.

التبعيات

ستحتاج إلى مكتبة عملات مشفّرة تتوافق مع SHA-1 HMAC، مثل Openssl.

نموذج التعليمات البرمجية

يتوفر نموذج التعليمات البرمجية بلغة Java وC++ ويمكن تنزيله من privatedatacommunicationprotocol مشروعك.

  • يستخدم الرمز النموذجي لـ Java برنامج فك ترميز base64 من Apache مشروع المشاع الإبداعي. ولن تحتاج إلى تنزيل رمز Apache المشترك، لأنّ التنفيذ المرجعي يتضمّن الجزء اللازم وبالتالي بذاته.

  • يستخدم نموذج الرمز C++ طبقة OpenSSL Base64 BIO. وتستخرج هذه العملية سلسلة base64 المرمّزة الآمنة على الويب (RFC 3548) وفك ترميزها. في العادة، تحلّ سلاسل Base64 الآمنة على الويب محلّ "=" المساحة المتروكة مع "." (لاحظ أن وتتم إضافة علامات الاقتباس من أجل وضوح القراءة ولا يتم تضمينها في ) إلا أن استبدال الماكرو لا يفي بالسعر المشفر. تشير رسالة الأشكال البيانية يضيف تنفيذ المرجع مساحة متروكة لأن OpenSSL يواجه مشكلة في سلاسل غير مضافة.

الترميز

يتطلّب تشفير السعر الفائز وفك تشفيره مفتاحَين سريَّين، ولكن يمكن مشاركتهما المفاتيح. مفتاح سلامة ومفتاح تشفير، يُشار إليهما باسم i_key، وe_key على التوالي. يتم توفير كلا المفتاحَين عند إعداد الحساب سلاسل Base64 آمنة على الويب، ويمكن العثور عليها في صفحة "الشراة المعتمَدون" ضمن نظام عرض السعر الإعدادات > إعدادات عرض الأسعار في الوقت الفعلي > مفاتيح التشفير:

أمثلة على مفاتيح التكامل والتشفير:

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

يجب فك ترميز المفاتيح بأمان على الويب ثم فك ترميز base64 بواسطة app:

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

مخطط التشفير

تم تشفير السعر باستخدام نظام تشفير مخصّص تم تصميمه. تقليل النفقات العامة مع ضمان الأمان الكافي. نظام التشفير خوارزمية مصادقة المفتاح العام (HMAC) لإنشاء لوحة سرية بناءً على رقم تعريف حدث الظهور

يبلغ طول السعر المشفر 28 بايت ثابتًا. وهي تتألف من متّجه إعداد بحجم 16 بايت، و8 بايت من النص المُشفر، وسلامة بحجم 4 بايت التوقيع. السعر المشفَّر هو بترميز base64 متوافق مع الويب، وفقًا لمعيار RFC 3548، مع حذف أحرف المساحة المتروكة. ومن ثم، يكون سعر تشفير 28 بايت مشفّرة بسلسلة من 38 حرفًا متوافقة مع web-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) خوارزمية SHA-1 HMAC للبيانات d، باستخدام المفتاح k
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. لمزيد من المعلومات، يُرجى مراجعة التشفير: