פענוח של אישורי מחיר

כשהקריאייטיב שלכם זוכה במכרז, Google יכולה להודיע לכם מהו המחיר היה אם הקריאייטיב כולל את המאקרו הרלוונטי.

אם מגיש הצעות המחיר מוגדר להשתמש בפרוטוקול OpenRTB, הקריאייטיב שכלולות בהצעת המחיר שלך צריכות להשתמש ב${AUCTION_PRICE} של IAB במאקרו.

אם מגיש הצעות המחיר משתמש בפרוטוקול RTB של Google שהוצא משימוש, הקריאייטיב להשתמש ב-%%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 של VAST קריאייטיב וידאו, אבל לא בכתובת ה-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 project.

  • הקוד לדוגמה של Java משתמש במפענח base64 מ-Apache Commons project. לא תצטרכו להוריד את קוד Apache Commons מאחר שהטמעת קובץ העזר כוללת את החלק הדרוש, עצמאי.

  • הקוד לדוגמה של C++ משתמש ב-OpenSSL base64 BIO method. היא לוקחת מחרוזת בקידוד base64 שמתאימה לאינטרנט (RFC 3548) ומפענחת אותה. בדרך כלל, מחרוזות base64 בטוחות לאינטרנט מחליפות את "=" מרווח פנימי עם "." (שימו לב המירכאות מתווספות לצורך בהירות הטקסט והן לא כלולות ), אבל החלפת המאקרו לא מספקת את המחיר המוצפן. הטמעת קובץ עזר מוסיפה מרווח פנימי כי ל-OpenSSL יש בעיה עם מחרוזות ללא ריפוד.

קידוד

כדי לזכות בהצפנת המחיר ובפענוח, נדרשים שני סודות, אבל הם משותפים מקשי קיצור. מפתח תקינות ומפתח הצפנה, שנקראים i_key, ו-e_key בהתאמה. שני המפתחות מסופקים בתהליך הגדרת החשבון: מחרוזות base64 בטוחות לאינטרנט, וניתן למצוא אותן בדף Authorized Buyers בקטע מגיש הצעות המחיר הגדרות > הגדרות בזמן אמת (RTB) > מפתחות הצפנה.

דוגמאות לתקינות ולמפתחות הצפנה:

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 בייטים של מידע מוצפן (ciphertext) ותקינות של 4 בייטים לחתימה. המחיר המוצפן בקידוד base64 בטוח לשימוש באינטרנט, בהתאם ל-RFC 3548, ללא תווי מרווח פנימי. כך, המחיר המוצפן בגודל 28 בייטים מקודדים כמחרוזת base-64 בטוחה של 38 תווים, ללא קשר למנצחת המחיר שולם.

דוגמאות למחירים מוצפנים:

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) 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 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. מידע נוסף זמין במאמר הבא: קריפטוגרפיה.