가격 확인 복호화하기

광고 소재가 입찰에서 낙찰에 성공하면 Google이 귀하에게 낙찰 가격을 알려 드립니다. 이를 위해서는 광고 소재를 정의하는 HTML 코드에 WINNING_PRICE 매크로가 포함되어 있어야 합니다. Google은 암호화된 형식으로 낙찰 가격을 반환합니다. 다음은 애플리케이션에서 암호화된 낙찰 가격 정보를 복호화하는 방법을 설명합니다.

  1. 시나리오
  2. 종속성
  3. 샘플 코드
  4. 암호화 체계
  5. 복호화 체계
  6. 부실 응답 공격 감지

시나리오

  1. 애플리케이션에서 Google에 반환하는 HTML 코드에 WINNING_PRICE 매크로가 포함되어야 합니다.
  2. Google은 패딩되지 않은 웹 보안 base64 인코딩(RFC 3548)을 적용하여 이 매크로를 낙찰 가격으로 바꿉니다.
  3. 귀하가 선택한 형식으로 코드가 확인 정보를 전송합니다. 예를 들어 확인 정보는 광고의 일부로 렌더링되고 보이지 않는 픽셀 요청의 URL로 전송될 수 있습니다.
  4. 서버에서 base64 애플리케이션이 낙찰가 정보의 코드를 분석하고 그 결과의 암호를 해독합니다.

종속성

SHA-1 HMAC을 지원하는 Openssl과 같은 암호화 라이브러리가 필요합니다.

샘플 코드

샘플 코드는 Java 및 C++로 제공되며 http://code.google.com/p/privatedatacommunicationprotocol에서 다운로드할 수 있습니다.

  • 자바 샘플 코드는 Apache Commons 프로젝트의 base64 디코더를 이용합니다. 참조 구현은 필요한 부분을 모두 포함하여 독립성을 갖추고 있으므로 Apache Commons 코드를 별도로 다운로드할 필요는 없습니다.

  • C++ 샘플 코드는 OpenSSL base64 BIO 메소드를 사용합니다. 이 메소드는 웹 보안 base64 인코딩 문자열(RFC 3548)을 이용하여 암호를 해독합니다. 일반적으로 웹 보안 base64 문자열은 "=" 패딩을 "."로 바꿉니다. 여기에서 인용 부호는 가독성을 위해 추가한 것이며 프로토콜에 포함되지 않습니다. 그러나 매크로는 대체 과정에서 암호화된 가격을 패딩하지 않습니다. OpenSSL은 패딩되지 않은 문자열을 사용할 경우 문제를 일으키므로 참조 구현에서는 패딩을 추가합니다.

맨 위로

암호화 체계

가격은 크기 증가를 최소화하면서 적절한 보안성을 유지하도록 설계된 맞춤형 암호화 체계로 암호화됩니다. 이 암호화 체계에서는 키 있는 HMAC 알고리즘을 사용하여 고유한 노출 이벤트 ID를 기초로 비밀 패드를 생성합니다.

암호화된 가격은 28바이트라는 고정된 길이를 갖습니다. 이 길이는 16바이트의 초기화 벡터, 8바이트의 암호문, 4바이트의 무결성 서명을 더한 것입니다. 암호화된 가격에는 RFC 3548에 따른 웹 보안 base64 인코딩이 적용되며 패딩 문자는 생략됩니다. 따라서 28바이트 길이의 암호화된 가격은 38자 길이의 웹 보안 base64 문자열로 인코딩됩니다.

암호화 형식은 다음과 같습니다.

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

가격은 &lt;price xor HMAC(encryption_key, initialization_vector)&gt;으로 암호화되므로 복호화 과정에서는 HMAC(encryption_key,initialization_vector)을 계산하고 암호화된 가격과 xor을 수행하여 암호화 과정을 뒤집습니다. 무결성 단계에서는 <HMAC(integrity_key, price||initialization_vector)>의 4바이트를 취합니다. 여기에서 ||는 연결 기호입니다.

입력

iv 초기화 벡터(바이트 - 노출에 대해 고유함)
e_key 암호화 키(32바이트 - 계정 설정 시 제공)
i_key 무결성 키(32바이트 - 계정 설정 시 제공)
price (8바이트 - 계정 통화의 마이크로(micro))

기호

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 )

맨 위로

복호화 체계

복호화 코드에서는 암호화 키를 사용하여 가격의 암호를 해독하고 무결성 키로 무결성 비트를 확인해야 합니다. 키는 계정 설정 시 제공됩니다. 세부적인 구현 방법에 대해서는 제한 사항이 없습니다. 대부분의 경우에는 샘플 코드를 필요에 따라 수정하기만 하면 됩니다.

입력

e_key 암호화 키, 32바이트 - 계정 설정 시 제공
i_key 무결성 키, 32바이트 - 계정 설정 시 제공
final_message 38자의 웹 보안 base64 인코딩

유사 부호

enc_price = WebSafeBase64Decode(final_message)
(iv, p, sig) = dec_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);

맨 위로

 

다음에 대한 의견 보내기...

DoubleClick Ad Exchange Real-Time Bidding Protocol