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

כאשר הקריאייטיב זוכה במכרז, Google יכולה ליידע אותך מה היה המחיר הזוכה, אם קטע הקוד של ה-HTML או כתובת ה-URL של 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 גם בכתובת ה-URL מסוג VAST של קריאייטיב וידאו (אבל לא בכתובת ה-URL לחשיפות ב-VAST):

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

תרחיש

  1. האפליקציה כוללת את פקודת המאקרו WINNING_PRICE בקטע הקוד של ה-HTML או בכתובת ה-URL של VAST שהיא מחזירה ל-Google.
  2. Google מחליפה את המחיר הזוכה של המאקרו בקידוד base64 ללא שמירה באינטרנט (RFC 3548).
  3. קטע הקוד מעביר את האישור בפורמט שבחרתם. לדוגמה, יכול להיות שהאישור יועבר בכתובת ה-URL של בקשת פיקסל בלתי נראה שמוצגת כחלק מהמודעה.
  4. בשרת, האפליקציה סיווג בסיס64 בטוחה לשימוש באינטרנט, מפענחת את פרטי המחיר הזוכה ומפענחת את התוצאה.

יחסי תלות

אתם צריכים ספריית הצפנה שתומכת ב-SHA-1 HMAC, כמו Openssl.

קוד לדוגמה

הקוד לדוגמה מסופק ב-Java וב-C++ וניתן להוריד אותו מהפרויקט Privatedatacommunicationprotocol.

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

  • בקוד לדוגמה C++ נעשה שימוש בשיטת OpenSSL base64 BIO. הוא לוקח מחרוזת בקידוד base64 בקידוד 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 מפתח כדי ליצור pad סודי על סמך מזהה אירוע החשיפה הייחודי.

למחיר המוצפן יש אורך קבוע של 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 קידוד בקידוד 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. מידע נוסף זמין במאמר קריפטוגרפיה.