Xác nhận giá giải mã

Khi mẫu quảng cáo của bạn thắng một phiên đấu giá, Google có thể thông báo cho bạn quảng cáo nào thắng là nếu quảng cáo có chứa macro có liên quan.

Nếu bên đặt giá thầu của bạn được định cấu hình để sử dụng giao thức OpenRTB, mẫu quảng cáo đi kèm với giá thầu của bạn nên sử dụng ${AUCTION_PRICE} của IAB macro.

Nếu bên đặt giá thầu của bạn sử dụng giao thức RTB của Google không dùng nữa, thì mẫu quảng cáo phải sử dụng %%WINNING_PRICE%% của Google macro.

Khi các macro này được mở rộng, chúng sẽ trả về giá chiến thắng trong mã hóa. Chúng có thể được đưa vào một mẫu quảng cáo, ví dụ: với yêu cầu pixel vô hình được hiển thị như một phần của quảng cáo:

<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>

Macro ${AUCTION_PRICE} cũng có thể được bao gồm trong URL VAST của quảng cáo video nhưng không có trong URL hiển thị trong VAST:

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

Trường hợp

  1. Ứng dụng đặt giá thầu OpenRTB của bạn bao gồm ${AUCTION_PRICE} trong đoạn mã HTML hoặc URL VAST trả về cho Google.
  2. Google thay thế giá chiến thắng cho macro trong quảng cáo an toàn trên web không có khoảng đệm mã hoá base64 (RFC 3548).
  3. Đoạn mã này chuyển thông báo xác nhận theo định dạng mà bạn đã chọn. Để ví dụ: thông báo xác nhận có thể được chuyển trong URL của một pixel vô hình yêu cầu được hiển thị như một phần của quảng cáo.
  4. Trên máy chủ, ứng dụng base64 an toàn trên web của bạn giải mã mức giá chiến thắng thông tin và giải mã kết quả.

Phần phụ thuộc

Bạn cần có một thư viện mật mã hỗ trợ HMAC SHA-1, chẳng hạn như Openssl.

Mã mẫu

Mã mẫu được cung cấp trong Java và C++ và có thể được tải xuống từ privatedatacommunicationprotocol dự án.

  • Mã mẫu Java sử dụng bộ giải mã base64 từ tài khoản Apache dự án commons. Bạn sẽ không cần tải mã Apache commons xuống, vì việc triển khai tham chiếu bao gồm phần cần thiết và do đó độc lập.

  • Mã mẫu C++ sử dụng lớp OpenSSL phương thức BIO base64. Hệ thống sẽ lấy một chuỗi được mã hoá base64 an toàn trên web (RFC 3548) và giải mã chuỗi đó. Thông thường, các chuỗi base64 an toàn cho web sẽ thay thế "=" khoảng đệm có "." (lưu ý rằng dấu ngoặc kép được thêm vào để giúp người dùng hiểu rõ hơn và không được đưa vào giao thức) nhưng phép thay thế macro không làm tăng giá đã mã hoá. Chiến lược phát hành đĩa đơn phương thức triển khai tham chiếu sẽ thêm khoảng đệm vì OpenSSL gặp sự cố với chuỗi không được đệm.

Mã hoá

Việc mã hoá và giải mã giá của chiến thắng yêu cầu hai bí mật, nhưng được chia sẻ, khoá. Khoá toàn vẹn và khoá mã hoá (còn gọi là i_key) và e_key tương ứng. Cả hai khoá này đều được cung cấp khi thiết lập tài khoản dưới dạng chuỗi base64 an toàn trên web. Bạn có thể tìm thấy các chuỗi này trên trang Authorized Buyers trong Bên đặt giá thầu cài đặt > Cài đặt RTB > Khoá mã hoá.

Ví dụ về khoá mã hoá và tính toàn vẹn:

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

Khoá phải được giải mã theo cách an toàn trên web, sau đó được giải mã base64 bằng ứng dụng:

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

Giao thức mã hoá

Giá được mã hoá bằng một lược đồ mã hoá tuỳ chỉnh được thiết kế để giảm thiểu mức hao tổn kích thước trong khi vẫn đảm bảo mức độ bảo mật đầy đủ. Giao thức mã hoá sử dụng thuật toán HMAC có khoá để tạo bàn phím bí mật dựa trên mã duy nhất mã sự kiện hiển thị.

Giá đã mã hoá có độ dài cố định là 28 byte. Nó bao gồm một Vectơ khởi tạo 16 byte, 8 byte văn bản mật mã và tính toàn vẹn 4 byte của bạn. Giá đã mã hoá được mã hoá base64 an toàn trên web, theo RFC 3548, bỏ qua các ký tự khoảng đệm. Do đó, giá được mã hoá 28 byte là được mã hoá dưới dạng chuỗi base-64 an toàn trên web gồm 38 ký tự bất kể chiến thắng mức giá phải trả.

Ví dụ về giá đã mã hoá:

YWJjMTIzZGVmNDU2Z2hpN7fhCuPemCce_6msaw  // 100 CPI micros
YWJjMTIzZGVmNDU2Z2hpN7fhCuPemCAWJRxOgA  // 1900 CPI micros
YWJjMTIzZGVmNDU2Z2hpN7fhCuPemC32prpWWw  // 2700 CPI micros

Định dạng được mã hoá là:

{initialization_vector (16 bytes)}{encrypted_price (8 bytes)}
{integrity (4 bytes)}

Giá được mã hoá dưới dạng <price xor HMAC(encryption_key, initialization_vector)> để quá trình giải mã được tính HMAC(encryption_key,initialization_vector) và xor bằng giá đã mã hoá để đảo ngược quá trình mã hoá. Giai đoạn tính toàn vẹn chiếm 4 byte <HMAC(integrity_key, price||initialization_vector)> trong đó || là phép nối.

Thông tin đầu vào
iv vectơ khởi tạo (16 byte – duy nhất cho hiển thị)
e_key khoá mã hoá (32 byte – được cung cấp khi thiết lập tài khoản)
i_key khoá tính toàn vẹn (32 byte – được cung cấp khi thiết lập tài khoản)
price (8 byte - tính bằng đơn vị tiền tệ của tài khoản)
Ký hiệu
hmac(k, d) HMAC SHA-1 của dữ liệu d, sử dụng khoá k
a || b chuỗi a nối với chuỗi b
Mã giả
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 )

Giao thức giải mã

Mã giải mã của bạn phải giải mã giá bằng khoá mã hoá và xác minh bit tính toàn vẹn bằng khoá tính toàn vẹn. Các khoá sẽ được cung cấp cho bạn trong quá trình thiết lập. Không có bất kỳ hạn chế nào đối với thông tin về cách bạn cấu trúc quá trình triển khai của bạn. Trong hầu hết trường hợp, bạn sẽ có thể tận dụng mã mẫu và điều chỉnh theo nhu cầu của bạn.

Thông tin đầu vào
e_key khoá mã hoá, 32 byte – được cung cấp khi thiết lập tài khoản
i_key khoá tính toàn vẹn, 32 byte – được cung cấp khi thiết lập tài khoản
final_message 38 ký tự được mã hoá base64 an toàn trên web
Mã giả
// 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)

Phát hiện các cuộc tấn công phản hồi cũ

Để phát hiện phản hồi cũ hoặc phát lại, các cuộc tấn công, bạn nên lọc các phản hồi có dấu thời gian khác biệt đáng kể so với hệ thống sau khi tính đến sự khác biệt về múi giờ.

Vectơ khởi tạo chứa dấu thời gian trong 8 byte đầu tiên. Chiến dịch này có thể được đọc bằng hàm C++ sau:

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)
}

Dấu thời gian có thể được chuyển đổi sang dạng thức mà con người có thể đọc được bằng cách sử dụng Mã 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);

Thư viện Java

Thay vì triển khai thuật toán mật mã để mã hoá và giải mã giá trúng thầu, bạn có thể sử dụng DoubleClickCrypto.java. Để biết thêm thông tin, hãy xem Mật mã học.