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
- Ứ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. - 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).
- Đoạn mã này chuyển thông báo xác nhận theo định dạng mà bạn đã chọn. Cho 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.
- 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 sẽ 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 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.