가격 확인 복호화

광고 소재가 입찰에서 낙찰되면 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}

시나리오

  1. OpenRTB 입찰 애플리케이션에는 ${AUCTION_PRICE}이(가) 포함됩니다. 매크로를 Google에 반환하는 HTML 스니펫 또는 VAST URL에 포함합니다.
  2. Google은 패딩되지 않은 웹에 안전한 매크로의 낙찰 가격을 대체합니다. base64 인코딩 (RFC 3548)
  3. 선택한 형식으로 스니펫이 확인 메시지를 전달합니다. 대상 예를 들어 보이지 않는 픽셀의 URL을 통해 확인이 전달될 수 있습니다. 요청에 따라 자동으로 처리됩니다.
  4. 서버에서 애플리케이션 웹 보안 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 문자열 ab 문자열과 연결됨
의사코드
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. 자세한 내용은 암호화.