광고 소재가 입찰에서 낙찰되면 Google에서는 낙찰된 광고를 알려 드립니다. 광고 소재에 관련 매크로가 포함된 경우입니다.
입찰자가 OpenRTB 프로토콜을 사용하도록 구성된 경우 광고 소재는
IAB의 ${AUCTION_PRICE}
를 사용해야 합니다.
매크로를 사용합니다.
입찰자가 지원 중단된 Google RTB 프로토콜을 사용하는 경우 광고 소재는
Google %%WINNING_PRICE%%
사용
매크로를 사용합니다.
이러한 매크로가 확장되면 암호화 양식입니다. 광고 소재에 포함할 수 있는데, 예를 들어 광고의 일부로 렌더링된 보이지 않는 픽셀 요청:
<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}
매크로는
동영상 광고 소재이지만 VAST의 노출 URL에는 없는 경우:
https://example.com/vast/v?price=${AUCTION_PRICE}
시나리오
- OpenRTB 입찰 애플리케이션에는
${AUCTION_PRICE}
이(가) 포함됩니다. 매크로를 Google에 반환하는 HTML 스니펫 또는 VAST URL에 포함합니다. - Google은 패딩되지 않은 웹에 안전한 매크로의 낙찰 가격을 대체합니다. base64 인코딩 (RFC 3548)
- 선택한 형식으로 스니펫이 확인 메시지를 전달합니다. 대상 예를 들어 보이지 않는 픽셀의 URL을 통해 확인이 전달될 수 있습니다. 요청에 따라 자동으로 처리됩니다.
- 서버에서 애플리케이션 웹 보안 base64가 낙찰 가격을 디코딩합니다. 복호화하고 결과를 복호화합니다
종속 항목
다음과 같이 SHA-1 HMAC를 지원하는 암호화 라이브러리가 필요합니다. Openssl의
샘플 코드
샘플 코드는 Java 및 C++로 제공되며 privatedatacommunicationprotocol에서 다운로드할 수 있습니다. 프로젝트의 인스턴스입니다.
Java 샘플 코드는 Apache API의 base64 디코더를 사용하여 Commons project에서 사용할 수 있습니다. Apache Commons 코드를 다운로드하지 않아도 됩니다. 참조 구현에 필요한 부분이 포함되어 있기 때문입니다. 독립 실행형입니다.
C++ 샘플 코드는 OpenSSL을 사용하여 base64 BIO 메서드를 사용합니다. 이 함수는 웹 보안 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 알고리즘을 사용하여 고유한 노출 이벤트 ID입니다.
암호화된 가격은 28바이트라는 고정된 길이를 갖습니다. Kubernetes는 16바이트 초기화 벡터, 8바이트의 암호문, 4바이트 무결성 서명합니다. 암호화된 가격은 RFC에 따라 웹 보안 base64로 인코딩됩니다. 3548, 패딩 문자가 생략되었습니다. 따라서 28바이트 암호화 가격은 38자의 웹 보안 base64 문자열로 인코딩되어 있습니다.
암호화된 가격의 예:
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의
암호화된 가격을 사용하여 암호화를 되돌릴 수 있습니다. 무결성 단계에서는
<HMAC(integrity_key, price||initialization_vector)>
각 항목의 의미는 다음과 같습니다.
||
는 연결입니다.
입력 | |
---|---|
iv |
초기화 벡터 (16바이트 - 노출에 고유함) |
e_key |
암호화 키 (32바이트 - 계정 설정 시 제공) |
i_key |
무결성 키 (32바이트 - 계정 설정 시 제공) |
price |
(8바이트 - 계정 통화의 마이크로(micro)) |
Notation | |
hmac(k, d) |
k 키를 사용한 d 데이터의 SHA-1 HMAC |
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 ) |
복호화 체계
복호화 코드는 암호화 키를 사용하여 가격을 복호화해야 합니다. 무결성 키를 사용하여 무결성 비트를 검증합니다. 키는 서비스 계정 관리자가 설정할 수 있습니다. Google Ad Manager를 사용하는 방법에 대한 구체적으로 설명해 주시기 바랍니다. 대부분의 경우 다음 작업을 할 수 있어야 합니다. 필요에 따라 수정할 수 있습니다.
입력 | |
---|---|
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. 자세한 내용은 암호화.