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 randomization option

图 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 或更高版本的设备,用户可以通过开发者选项屏幕为所有 Wi-Fi 网络(已启用 MAC 地址随机化)全局启用非持久性 MAC 地址随机化。启用所有配置文件的非持久性 MAC 地址随机化的选项位于设置 > 开发者选项 > Wi-Fi 非持久性 MAC 地址随机化

Wi-Fi non-persistent MAC randomization option

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