macid 1.1.3

build a unique machine id
Documentation

macid

一个用于生成跨平台机器标识(Machine ID / HWID)的 Rust 库。

项目基于 machineid-rs 思路扩展,提供更贴近实际业务的组件组合能力,可在 Windows、Linux、macOS 上采集设备信息,并生成稳定的加密标识。

特性

  • 跨平台支持:Windows、Linux、macOS
  • 支持按需组合多个硬件/系统字段生成机器指纹
  • 支持直接获取原始 ID,或再进行 HMAC-MD5 编码
  • 提供不同长度的摘要输出:MD5MD520MD516
  • 无需管理员权限即可获取大部分常见机器特征

安装

cargo add macid

或手动加入 Cargo.toml

[dependencies]
macid = "1.1.2"

快速开始

生成加密后的机器 ID

use macid::{Encryption, HWIDComponent, IdBuilder};

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut builder = IdBuilder::new();

    builder
        .add_component(HWIDComponent::SystemID)
        .add_component(HWIDComponent::DriveSerial)
        .add_component(HWIDComponent::MacAddress);

    let encoded = builder.encode("my-secret-key", Encryption::MD5)?;
    println!("encoded machine id: {}", encoded);

    Ok(())
}

先获取原始 ID,再单独编码

use macid::{Encryption, HWIDComponent, IdBuilder};

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut builder = IdBuilder::new();
    builder
        .add_component(HWIDComponent::SystemID)
        .add_component(HWIDComponent::OSName)
        .add_component(HWIDComponent::CPUCores);

    let raw_id = builder.get_id()?;
    let short_id = builder.encode_id(raw_id, "my-secret-key", Encryption::MD516)?;

    println!("short machine id: {}", short_id);
    Ok(())
}

添加全部常用组件

use macid::{Encryption, IdBuilder};

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut builder = IdBuilder::new();
    builder.add_all();

    let encoded = builder.encode("my-secret-key", Encryption::MD520)?;
    println!("{}", encoded);

    Ok(())
}

核心 API

IdBuilder

用于拼装机器指纹的构建器。

  • IdBuilder::new():创建空构建器
  • add_component(...):添加单个机器特征
  • add_all():添加全部内置常用特征
  • get_id():获取未加密的原始机器 ID
  • encode(key, hash):直接获取加密后的机器 ID
  • encode_id(id, key, hash):对已有 ID 进行再次编码
  • print_all():打印全部内置特征值
  • print_self():打印当前构建器中已添加的特征值

HWIDComponent

可选的机器特征组件:

  • SystemID:系统唯一标识
  • CPUCores:CPU 核心数
  • OSName:操作系统名称/版本
  • Username:当前用户名
  • MachineName:主机名
  • MacAddress:网卡 MAC 地址
  • CPUID:CPU Vendor ID 信息
  • DriveSerial:系统盘/根盘序列或 UUID
  • FileToken(&'static str):从指定文件读取或生成一个 token 参与指纹计算

Encryption

当前支持以下编码方式:

  • MD5:完整 32 位十六进制摘要
  • MD520:截取前 20 位
  • MD516:截取前 16 位

说明:当前版本内部使用的是基于 key 的 HMAC-MD5,而不是普通裸 MD5。

平台实现说明

不同平台下,各组件的数据来源略有不同:

  • Windows
    • SystemID:注册表 MachineGuid
    • DriveSerial:WMI Win32_PhysicalMedia.SerialNumber
    • MacAddress:WMI 网卡信息
  • Linux
    • SystemID/var/lib/dbus/machine-id/etc/machine-id
    • DriveSerial:通过 lsblk 获取根分区 UUID
    • MacAddress:从物理网卡列表中筛选
  • macOS
    • SystemIDioreg 中的 IOPlatformUUID
    • DriveSerialdiskutil info / 中的 Volume UUID
    • MacAddressifconfig 获取

使用建议

  • 如果你需要“相对稳定”的设备标识,优先组合 SystemID + DriveSerial + MacAddress
  • 如果你希望降低硬件变更带来的影响,可以减少对 MacAddressCPUCores 这类字段的依赖
  • 如果你需要与业务账号、授权文件绑定,可以额外加入 FileToken("license.dat")
  • 不同组件组合会直接影响最终 ID,请在首次发布后尽量保持组合策略稳定

注意事项

  • get_id() 返回的是拼接后的原始字符串,适合调试或二次处理
  • encode() / encode_id() 更适合生产环境使用
  • FileToken(path) 会依赖本地文件内容,因此适合做“本机 + 本地文件”联合绑定
  • 机器硬件、系统重装、网卡变更、磁盘替换等情况,都可能导致最终结果变化

开发

cargo test
cargo fmt

License

MIT