MAC 随机化行为

MAC 随机化功能允许设备在连接到 Wi-Fi 网络时使用随机 MAC 地址。有关实施说明,请参阅实施 MAC 随机化。本页介绍了 Android 中 MAC 随机化的行为。

设备在连接到 Wi-Fi 网络或接入点时会使用 MAC 地址。由于这些 MAC 地址是在未经加密的情况下传输的,因此它们可以被捕获并用于潜在地跟踪用户的位置。过去,设备使用出厂 MAC 地址关联到 Wi-Fi 网络。工厂 MAC 地址是全球唯一且静态的,允许跟踪和单独识别设备。

MAC 随机化功能通过在连接到 Wi-Fi 网络时使用随机 MAC 地址来增加用户隐私。

MAC 地址长 48 位,通常由 12 个十六进制数字(6 个八位字节,因为每个八位字节为 8 位)表示,例如00:11:22:AA:BB:CC 。 MAC 随机化功能通过将本地管理的位设置为 1 并将单播位设置为 0 来随机化地址。其他 46 位是随机的。

对于运行 Android 10 或更高版本的设备,框架默认使用随机 MAC 地址。用户可以通过设置中的网络详细信息屏幕中的选项启用或禁用单个网络的 MAC 随机化,如图 1 所示。如果用户禁用网络的 MAC 随机化,则框架使用工厂 MAC 地址(全局唯一地址)。

MAC 随机化选项

图 1. MAC 随机化选项。

MAC 随机化类型

Android 框架使用两种类型的 MAC 随机化:持久随机化非持久随机化。如果用户禁用 MAC 随机化,则使用出厂 MAC 地址。

当设备关联到 Wi-Fi 网络时,Android 会确定要使用的 MAC 随机化类型。默认情况下,Android 使用持久随机化。从 Android 12 开始,Android 在以下情况下使用非持久随机化:

  • 网络建议应用程序通过WifiNetworkSuggestion.Builder#setMacRandomizationSetting API 指定对网络使用非持久随机化。
  • 该网络是一个未遇到强制门户的开放网络,并且config_wifiAllowEnhancedMacRandomizationOnOpenSsids覆盖设置为true 。默认情况下禁用此覆盖(设置为false )。

持续随机化

启用 MAC 随机化功能后,Android 默认使用持久随机化类型。 Android 根据网络配置文件的参数(包括 SSID、安全类型或 FQDN(适用于 Passpoint 网络))生成持久的随机 MAC 地址。此 MAC 地址在出厂重置之前保持不变。如果用户忘记并重新添加 Wi-Fi 网络,MAC 地址不会重新随机化,因为 MAC 地址取决于网络配置文件的参数。

在网络依赖 MAC 地址的持久性为用户提供有用功能的情况下,持久性 MAC 地址是必要的,例如,记住设备并允许用户按预期绕过登录屏幕,或启用家长控制。

对于 Android 10 和 11,框架在启用 MAC 随机化时对所有网络使用持久随机化。

非持续随机化

在 Android 12 或更高版本中的某些网络使用的非持久随机化类型下,Wi-Fi 模块在每次连接开始时重新随机化 MAC 地址或框架使用现有的随机化 MAC 地址连接到网络。 Wi-Fi 模块在以下情况下重新随机化 MAC 地址:

  • DHCP 租用期限已过期,并且自设备上次从该网络断开连接已过去 4 小时以上。
  • 网络配置文件的当前随机 MAC 是 24 小时前生成的。 MAC 地址重新随机化仅在新连接开始时发生。 Wi-Fi 不会为了重新随机化 MAC 地址而主动断开连接。

如果这些情况都不适用,则框架使用先前随机分配的 MAC 地址连接到网络。

非持久随机化的开发人员选项

对于运行 Android 11 或 12 的设备,用户可以通过开发者选项屏幕为所有 Wi-Fi 网络(已启用 MAC 随机化)全局启用非持久 MAC 随机化。为所有配置文件启用非持久 MAC 随机化的选项位于Settings > Developer Options > Wi-Fi non-persistent MAC randomization

Wi-Fi 非持久 MAC 随机化选项

图 2. Wi-Fi 非持久 MAC 随机化选项。