实施 MAC 随机化

从 Android 8.0 开始,Android 设备在探测新网络但未与网络关联时,会使用随机 MAC 地址。在 Android 9 中,您可以启用开发者选项(默认情况下禁用)以使设备在连接到 Wi-Fi 网络时使用随机 MAC 地址。

在 Android 10 中,默认情况下为客户端模式、SoftAp 和 Wi-Fi Direct 启用 MAC 随机化。

MAC 随机化可防止监听器使用 MAC 地址构建设备活动历史记录,从而提高用户隐私。

此外,MAC 地址在 Wi-Fi AwareWi-Fi RTT 操作中也会被随机化。

有关详细信息,请参阅 MAC 随机化行为

实现

要在您的设备上实现 MAC 随机化

  1. 与 Wi-Fi 芯片供应商合作以实现以下 HAL 方法

    • IWifiStaIface#setMacAddress:配置接口的 MAC 地址。默认实现会关闭接口、更改 MAC 地址,然后重新启动接口。
    • IWifiStaIface#getFactoryMacAddress:使用 ioctl 调用获取 wlan0 的出厂 MAC 地址。
    • ISupplicantP2pIface#setMacRandomization:在 supplicant 中设置 P2P MAC 随机化开启/关闭。
  2. 在 Settings config.xml 中将 config_wifi_connected_mac_randomization_supported 设置为 true(这可以在设备自定义叠加层中完成)。

    • 此标志用于控制是否启用客户端模式 MAC 随机化。
  3. 在 Settings config.xml 中将 config_wifi_p2p_mac_randomization_supported 设置为 true(这可以在设备自定义叠加层中完成)。

    • 此标志用于控制是否启用 Wi-Fi Direct MAC 随机化。
  4. 使用 验证 中描述的方法测试您的实现。

系统 UI 必须

  • 具有为每个 SSID 启用或禁用随机化的选项。
  • 默认情况下,为所有新添加的网络启用 MAC 随机化。

使用 Settings UI 的 参考实现 来实现新的提示。

运行 Android 9 或更低版本的设备可能不支持 Wi-Fi MAC 随机化。当将此类设备升级到 Android 10 时,可以通过在 Wi-Fi 供应商 HAL make 文件中将 WIFI_HIDL_FEATURE_DISABLE_AP_MAC_RANDOMIZATION 标志设置为 true 来禁用 Wi-Fi MAC 随机化功能。

验证

要验证该功能是否按预期工作,请运行手动测试

  1. 通过检查设备叠加层中 config_wifi_connected_mac_randomization_supported 是否设置为 true,验证 MAC 随机化是否在设备上启用。
  2. 连接到 Wi-Fi 网络。
  3. 点按网络以转到“网络详情”页面。验证 MAC 随机化已开启。验证显示的 MAC 地址是随机 MAC 地址,其本地生成位设置为 1,多播位设置为 0。
  4. 关闭 MAC 随机化。连接到同一网络,并验证是否正在使用出厂 MAC 地址。
  5. 通过在“网络详情”页面上点按忘记来删除网络。
  6. 连接到同一网络,并验证是否正在使用相同的随机 MAC 地址。

要在升级到 Android 10 或更高版本的 Android 10 之前的设备(能够支持 MAC 随机化)上测试 MAC 随机化

  1. 在运行 Android 9 或更低版本的设备上至少保存一个网络。
  2. 刷写 Android 10 系统镜像。
  3. 在 Wi-Fi 选择器中,验证所有已保存网络的 MAC 随机化均已关闭。
  4. 开启 MAC 随机化。连接到同一网络,并验证是否正在使用随机 MAC 地址。