目录
简介
- MAC地址是物理地址,用来唯一标识一个网络接口。。
- MAC地址是48bit的,通常用6个字节表示,用冒号分隔,比如:xx:xx:xx:xx:xx:xx,其中,xx表示一个字节,即0~0xFF。
- MAC 地址通常分为两个部分:
- 厂商识别码(OUI,Organizationally Unique Identifier):前 24 位(前 3 个字节)由 IEEE 注册管理机构分配给设备制造商。
- 设备识别码:后 24 位(后 3 个字节)由设备制造商分配给具体设备。
- 虽然 MAC 地址是全球唯一的,但在网络通信中,它通常用于识别设备而不是加密或安全认证。在一些场景中,MAC 地址可以被篡改或伪造,因此在安全敏感的网络环境中,通常还需要其他形式的安全措施。
- 本人主要用于作为一个设备依据,采集这个信息做其他用途。(比如结合其他设备信息验证设备的唯一性,但是此信息可被伪造,所以还需要结合设备的其他信息)
代码实现
基于C/C++的实现
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winsock2.h>
#include <iphlpapi.h>
#include <windows.h>
#pragma comment(lib, "iphlpapi.lib") /*编译器链接所需的库*/
#pragma comment(lib, "ws2_32.lib")
/// <summary>
/// 检查当前设备的MAC是否和输入的一致
/// </summary>
/// <param name="mac_addr"></param>
/// <returns></returns>
bool cmp_mac_address( byte const* i_macAddr) {
bool result = false;
PIP_ADAPTER_INFO AdapterInfo;
DWORD dwBufLen = sizeof(AdapterInfo);
AdapterInfo = (IP_ADAPTER_INFO*)malloc(sizeof(IP_ADAPTER_INFO));
if (AdapterInfo == NULL) {
printf("Error allocating memory needed to call GetAdaptersinfo\n");
return result;
}
// Make an initial call to GetAdaptersInfo to get the necessary size into the dwBufLen variable
if (GetAdaptersInfo(AdapterInfo, &dwBufLen) == ERROR_BUFFER_OVERFLOW) {
free(AdapterInfo);
AdapterInfo = (IP_ADAPTER_INFO*)malloc(dwBufLen);
if (AdapterInfo == NULL) {
printf("Error allocating memory needed to call GetAdaptersinfo\n");
return result;
}
}
// Get the list of adapters
if (GetAdaptersInfo(AdapterInfo, &dwBufLen) == NO_ERROR) {
PIP_ADAPTER_INFO pAdapterInfo = AdapterInfo;
do {
#if 0 /* 打开此开关,可以打印获取到的所有MAC信息,记得注释break;*/
printf("MAC Address --- pAdapterInfo->AdapterName : %s \r\n", pAdapterInfo->AdapterName);
for (UINT64 i = 0; i < pAdapterInfo->AddressLength; i++) {
if (i == (pAdapterInfo->AddressLength - 1))
printf("%.2X\n", (int)pAdapterInfo->Address[i]);
else
printf("%.2X-", (int)pAdapterInfo->Address[i]);
}
#endif
if (pAdapterInfo->AddressLength == 6 && memcmp(pAdapterInfo->Address, i_macAddr, 6) == 0) {
result = true;
break;
}
pAdapterInfo = pAdapterInfo->Next;
} while (pAdapterInfo);
}
if (AdapterInfo) {
free(AdapterInfo);
}
return result;
}
基于C#的代码实现
using System;
using System.Net.NetworkInformation;
///获取所有的网卡信息
///如果需要获取激活的网卡信息,可以增加(nic.OperationalStatus == OperationalStatus.Up)条件
public void GetAllMacInfos()
{
foreach (NetworkInterface nic in NetworkInterface.GetAllNetworkInterfaces())
{
string macAddress = nic.GetPhysicalAddress().ToString();
Console.WriteLine("MAC Address: " + macAddress);
}
}
基于Python的代码实现
///待补充
需要源代码请私信我获取(基于V2022的C++版本)