解密广告 ID

Authorized Buyers 现在支持在移动应用广告资源出价请求中传递 Android 广告 ID。

广告 ID 简介

借助 Google Play 服务 v4.0,Android 发布了一种可由用户重置的新型广告标识符,称为广告 ID

广告客户可以使用广告 ID 投放再营销广告系列和记录“转化次数”(购买或下载)。广告 ID 有两项主要功能:

  • 用户可以随时重置广告 ID。
  • 用户可以随时直接通过“Google 设置”应用选择停用针对用户兴趣的广告。此设置适用于使用广告 ID 的所有广告公司。

技术定义

广告 ID 通过实时出价协议中的 BidRequest.Mobile.encrypted_advertising_id 传递:

optional bytes encrypted_advertising_id = 20;

该字段为 36 个字节,包含 3 个部分:

  • initialization_vector:16 个字节。
  • ciphertext:16 字节,广告 ID 的已加密 16 字节 UUID
  • integrity_signature:4 个字节。
{initialization_vector (16 bytes)}{ciphertext (16 bytes)}{integrity_signature (4 bytes)}

定义

变量 具体说明
initialization_vector 16 个字节 - 展示所独有。
ciphertext 16 个字节 - 生成方式:<advertising_id <xor> hmac(encryption_key, initialization_vector)>
integrity_signature 4 个字节 - 生成为 hmac(integrity_key, advertising_id || initialization_vector) 的前 4 个字节
encryption_key 32 个字节 - 在帐号设置时提供。
integrity_key 32 个字节 - 在帐号设置时提供。
advertising_id 16 个字节 - 未加密的原始广告 ID,即 UUID
final_message 36 个字节 - 通过 encrypted_advertising_id 字段发送的字节数组。
运算符 具体说明
hmac(key, data) SHA-1 HMAC,使用 key 加密 data
a || b 字符串 a 与字符串 b 串联。

加密架构

广告 ID 的加密架构与解密价格确认所使用的架构相同。

  1. 广告 ID 存储在一个字节数组中,该字节数组使用自定义加密机制进行加密,该机制旨在将大小开销降至最低,同时确保足够的安全性。
  2. 该加密方案使用密钥加密的 HMAC 算法,基于展示事件所独有的 initialization_vector 生成密钥填充。

加密伪代码

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

解密方案

您的解密代码应 1) 使用加密密钥对 encrypted_advertising_id 字段进行解密,并(可选)2) 使用完整性密钥验证完整性位。系统会在帐号设置期间向您提供这些密钥。对于如何构造实现没有任何限制。

  1. 生成平铺hmac(encryption_key, initialization_vector)
  2. XOR:将此结果与<xor>及密文搭配使用以逆转加密。
  3. 验证:完整性签名传递 HMAC(integrity_key, advertising_id || initialization_vector) 的 4 个字节

解密伪代码

(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 库

您可以使用 DoubleClickCrypto.java,而不是实现加密算法来对广告 ID 进行编码和解码。如需了解详情,请参阅加密