Authorized Buyers now supports passing the Android advertising ID in mobile application inventory bid requests.
About the advertising ID
With Google Play services v4.0, Android launched a new user-resettable identifier for advertising called the advertising ID.
The advertising ID may be used by advertisers to run remarketing campaigns and record "conversions" (purchasing or downloading). The advertising ID has two key features:
- Users can reset the advertising ID at any time.
- Users can opt out of interest-based ads at any time, right from the Google Settings app. This setting applies across all ad companies that use the advertising ID.
Technical definition
Advertising ID is passed through BidRequest.Mobile.encrypted_advertising_id
in the real-time bidding proto:
optional bytes encrypted_advertising_id = 20;
The field is 36 bytes and contains 3 sections:
initialization_vector
: 16 bytes.ciphertext
: 16 bytes, the encrypted 16-byte UUID of the advertising ID.integrity_signature
: 4 bytes.
{initialization_vector (16 bytes)}{ciphertext (16 bytes)}{integrity_signature (4 bytes)}
Definitions
Variable | Details |
---|---|
initialization_vector |
16 bytes - unique to the impression. |
ciphertext |
16 bytes - generated as: <advertising_id <xor> hmac(encryption_key, initialization_vector)> |
integrity_signature |
4 bytes - generated as first 4 bytes of: hmac(integrity_key, advertising_id || initialization_vector) |
encryption_key |
32 bytes - provided at account setup. |
integrity_key |
32 bytes - provided at account setup. |
advertising_id |
16 bytes - The original, unencrypted advertising ID, which is a UUID |
final_message |
36 bytes - The byte array sent through the encrypted_advertising_id field. |
Operators | Details |
---|---|
hmac(key, data) |
SHA-1 HMAC, using key to encrypt data . |
a || b |
string a concatenated with string b . |
Encryption scheme
The encryption scheme for advertising ID is based on the same scheme used for decrypting price confirmations.
- The advertising ID is stored in a byte array, which is encrypted using a custom encryption scheme designed to minimize size overhead while ensuring adequate security.
- The encryption scheme uses a keyed HMAC algorithm to generate a secret pad based on the
initialization_vector
, which is unique to the impression event.
Encryption pseudocode
advertising_id = advertising ID from mobile device pad = hmac(encryption_key, initialization_vector) // first 16 bytes ciphertext = pad <xor> advertising_id integrity_signature = hmac(integrity_key, advertising_id || initialization_vector) // first 4 bytes final_message = initialization_vector || ciphertext || integrity_signature
Decryption scheme
Your decryption code should 1) decrypt the encrypted_advertising_id
field using the encryption key, and optionally 2) verify the integrity bits with the
integrity key. The keys will be provided to you during account setup. There aren't
any restrictions on how you structure your implementation.
- Generate your pad:
hmac(encryption_key, initialization_vector)
- XOR: Take this result and
<xor>
with the ciphertext to reverse the encryption. - Verify: The integrity signature passes 4 bytes of
HMAC(integrity_key, advertising_id || initialization_vector)
Decryption pseudocode
(initialization_vector, ciphertext, integrity_signature) = final_message // split up according to length pad = hmac(encryption_key, initialization_vector) // first 16 bytes advertising_id = ciphertext <xor> pad confirmation_signature = hmac(integrity_key, advertising_id || initialization_vector) // first 4 bytes success = (confirmation_signature == integrity_signature)
Java library
Instead of implementing the crypto algorithms to encode and decode the advertising ID, you can use DoubleClickCrypto.java. For more information, see Cryptography.