MAC地址构成:
总共48位;前24位是OUI(厂商代码)、后24位是序列号(厂商随机分配)
合法的OUI列表
https://standards-oui.ieee.org/oui/oui.txt
通常采用12个16进制的字符表示,如:00:11:22:AA:BB:CC
通过 MAC 地址的第二位,判断 MAC 地址的真伪。如果第二位是偶数0、2、4、6、8、A、C、E时,即是真实 MAC 地址;反之,就是随机 MAC 地址。
随机分配MAC原理
Android
- 本地管理位(Locally Administered Bit):这一位通常位于第25至32位之间,用于区分全球唯一的MAC地址和本地管理的MAC地址。当这一位设置为1时,表示该地址是由本地网络管理员分配的,而不是由IEEE注册机构分配的全球唯一地址。
- 单播/组播位(Unicast/Group bit):这一位通常位于第33位,用于指示MAC地址是单播地址还是组播地址。当这一位设置为0时,表示这是一个单播地址,即指向单个网络接口的地址。
- 在随机分配MAC地址的功能中,本地管理位被设置为1,单播位被设置为0,以确保地址是本地管理的单播地址。剩余的46位则是随机分配的,这样可以确保每个随机生成的MAC地址都是唯一的
Android 一般默认使用持久随机化类型。即在不更改ssid的名称和加密方式的情况下,无论是断开重连还是忘记网络重接,每次连接该ssid都会保持使用同一个随机mac地址。
Windows
当启用了随机MAC地址功能,Windows会在连接至无线网络时生成一个随机的、临时的MAC地址。这个地址是通过将网络名(SSID)、设备的真实MAC地址、连接标识符(connectionId)以及一个密钥(secret)作为输入参数,经过SHA-256哈希算法计算得出。这种机制可以确保每次连接时生成的随机MAC地址都是唯一的,而且与特定的网络和设备相关联。
address = SHA-256(SSID, Real MAC address, connectionId, secret)
Windows中的随机分配MAC地址算法是为了提高用户在网络中的隐私保护,通过使用SHA-256哈希函数来生成一个与特定网络和设备相关的临时地址,以此来防止设备被跟踪和关联
Linux
Linux内核提供了一个名为random-ethernet-mac的功能,可以在网络上发送数据包时使用随机MAC地址。这可以通过在内核启动参数中添加random-ethernet-mac
来实现。
IOS
具体来说,iOS设备的MAC地址随机化主要发生在无线局域网(Wi-Fi)的扫描阶段。当设备进行Wi-Fi扫描以发现和连接已知的无线局域网时,它会使用一个随机生成的MAC地址,而不是真实的MAC地址。这个过程对于主动扫描和被动扫描都适用。在主动扫描中,设备广播一个包含虚拟MAC地址的请求,而在被动扫描中,设备只是监听周围的beacon包。这个虚拟的MAC地址不会对后续的关联阶段和数据传输阶段产生影响,因为在那些阶段,设备会使用真实的MAC地址。
此外,Apple在其官方支持页面上提到,当iOS设备未与无线局域网关联或设备处理器处于睡眠状态时,也会使用随机MAC地址进行增强型首选网络卸载(ePNO)扫描。这种扫描用于支持使用地理围栏的App,如基于位置的提醒事项或在Apple地图中固定位置。重要的是,即使在设备接入蜂窝网络时,由于MAC地址会更改,无线局域网流量的被动观察程序也无法使用该地址持续跟踪设备。
为了更好地保护隐私,iOS 14、iPadOS 14 和 watchOS 7 会在每个无线局域网中使用不同的 MAC 地址。这个唯一的静态 MAC 地址是您设备的私有无线局域网地址,仅用于相应网络。
设备6周(42天)未加入过某ssid,则下次接入该ssid时设备所用私有地址会刷新;2周(14天)未加入会刷新”