Documentation
¶
Overview ¶
Package machineid provides support for reading the unique machine id of most OSs (without admin privileges).
https://github.com/darkit/machineid
https://godoc.org/github.com/darkit/machineid/cmd/machineid
This package is Cross-Platform (tested on Win7+, Debian 8+, Ubuntu 14.04+, OS X 10.6+, FreeBSD 11+) and does not use any internal hardware IDs (no MAC, BIOS, or CPU).
Returned machine IDs are generally stable for the OS installation and usually stay the same after updates or hardware changes.
This package allows sharing of machine IDs in a secure way by calculating HMAC-SHA256 over a user provided app ID, which is keyed by the machine id.
Caveat: Image-based environments have usually the same machine-id (perfect clone). Linux users can generate a new id with `dbus-uuidgen` and put the id into `/var/lib/dbus/machine-id` and `/etc/machine-id`. Windows users can use the `sysprep` toolchain to create images, which produce valid images ready for distribution.
Index ¶
- Constants
- func ClearCache()
- func ClearHardwareCache()
- func GetHardwareFingerprint() (string, error)
- func GetHardwareInfo() (*linuxHardwareInfo, error)
- func GetMACAddress() (string, error)
- func ID() (string, error)
- func IsContainer() bool
- func ProtectedID(appID string) (string, error)
- func ProtectedIDWithHardware(appID string) (string, error)
- func ProtectedIDWithMAC(appID string) (string, error)
- func RegisterBindingProvider(name string, provider BindingProviderFunc)
- func RegisterContainerHintProvider(provider ContainerHintProvider)
- type BindingMode
- type BindingProviderFunc
- type BindingResult
- type ContainerBindingConfig
- type ContainerBindingMode
- type ContainerHintProvider
- type FingerprintStatus
- type HardwareInfo
- type HardwareWeight
- type Info
- type MACInfo
Constants ¶
const (
// the environment variable name pointing to the machine id pathname
ENV_VARNAME = "MACHINE_ID_FILE"
)
Variables ¶
This section is empty.
Functions ¶
func GetHardwareFingerprint ¶ added in v1.0.6
GetHardwareFingerprint 生成硬件指纹
func GetHardwareInfo ¶ added in v1.0.6
func GetHardwareInfo() (*linuxHardwareInfo, error)
GetHardwareInfo 获取详细硬件信息
func GetMACAddress ¶ added in v1.0.6
GetMACAddress 获取主网卡的MAC地址,提供给用户直接使用
func ID ¶
ID returns the platform specific machine id of the current host OS. Regard the returned id as "confidential" and consider using ProtectedID() instead.
func ProtectedID ¶
ProtectedID returns a hashed version of the machine ID in a cryptographically secure way, using intelligent priority-based hardware binding when available.
Priority order: 1. Hardware fingerprint (most stable) 2. MAC address binding (fallback) 3. Pure machine ID (basic)
func ProtectedIDWithHardware ¶ added in v1.0.6
ProtectedIDWithHardware 基于硬件指纹的保护ID
func ProtectedIDWithMAC ¶ added in v1.0.6
ProtectedIDWithMAC returns a hashed version of the machine ID bound to MAC address. Deprecated: Use ProtectedID instead, which intelligently handles hardware binding.
func RegisterBindingProvider ¶ added in v1.0.9
func RegisterBindingProvider(name string, provider BindingProviderFunc)
RegisterBindingProvider 注册自定义绑定提供者,名称需唯一
func RegisterContainerHintProvider ¶ added in v1.0.9
func RegisterContainerHintProvider(provider ContainerHintProvider)
RegisterContainerHintProvider 注册自定义容器指纹提供者
Types ¶
type BindingMode ¶ added in v1.0.7
type BindingMode string
BindingMode 表示保护ID最终采用的绑定模式
const ( BindingModeFingerprint BindingMode = "fingerprint" BindingModeMAC BindingMode = "mac" BindingModeMachineID BindingMode = "machine_id" BindingModeCustom BindingMode = "custom" )
type BindingProviderFunc ¶ added in v1.0.9
BindingProviderFunc 提供额外绑定方式
type BindingResult ¶ added in v1.0.7
type BindingResult struct {
Hash string
Mode BindingMode
Provider string
FingerprintError error
MACError error
ContainerMode string // ContainerMode 容器绑定模式: "host"/"container"/"hybrid"/"none"
ContainerID string // ContainerID 容器ID(如果检测到)
}
BindingResult 描述生成保护ID时采用的模式与降级原因
func ProtectedIDResult ¶ added in v1.0.7
func ProtectedIDResult(appID string) (*BindingResult, error)
ProtectedIDResult 返回包含详细绑定信息的结果
func ProtectedIDWithContainerAware ¶ added in v1.0.9
func ProtectedIDWithContainerAware(appID string, config *ContainerBindingConfig) (*BindingResult, error)
ProtectedIDWithContainerAware 容器感知的保护ID生成
容器绑定逻辑说明: - 非容器环境:保持历史行为,走“硬件指纹 → MAC → machine-id”的优先级链路(ContainerMode="none")。 - 容器环境:根据 ContainerBindingConfig 选择策略:
- host_hardware:在容器具备宿主机硬件可见性时,优先使用宿主机硬件指纹;不可用且允许降级则落到容器级。
- container_scoped:仅使用容器命名空间/挂载等稳定特征派生;再不行使用容器 ID;最后落回标准 machine-id。
- hybrid:尽量组合宿主机硬件指纹与容器稳定特征,兼顾稳定性与隔离性。
func ProtectedIDWithMACResult ¶ added in v1.0.7
func ProtectedIDWithMACResult(appID string) (*BindingResult, error)
ProtectedIDWithMACResult 返回强制 MAC 绑定模式下的详细结果
type ContainerBindingConfig ¶ added in v1.0.9
type ContainerBindingConfig struct {
Mode ContainerBindingMode
PreferHostHardware bool
FallbackToContainer bool
PersistentVolume string
}
ContainerBindingConfig 描述容器绑定的策略配置。
说明:
- Mode 用于指定绑定模式:自动/强制宿主机/强制容器级。
- PreferHostHardware 用于在自动模式下表达偏好:尽可能使用宿主机硬件作为绑定依据。
- FallbackToContainer 用于在宿主机硬件不可用/不稳定时是否允许降级到容器级。
- PersistentVolume 用于指向持久卷路径:当采用容器级标识时,可用来存储/读取稳定标识, 以避免每次容器重建都改变绑定结果。
func DefaultContainerBindingConfig ¶ added in v1.0.9
func DefaultContainerBindingConfig() *ContainerBindingConfig
DefaultContainerBindingConfig 返回默认容器绑定配置。
默认策略: - Mode: 自动检测 - PreferHostHardware: true(优先使用宿主机硬件) - FallbackToContainer: true(宿主机硬件不可用时允许降级) - PersistentVolume: 空(由业务自行配置持久卷路径)
func (*ContainerBindingConfig) Validate ¶ added in v1.0.9
func (c *ContainerBindingConfig) Validate() error
Validate 校验配置是否自洽。
该方法只做“静态配置”层面的校验(例如字段组合是否合理),不做路径存在性/权限等运行时校验, 以避免在库初始化阶段引入文件系统副作用。
type ContainerBindingMode ¶ added in v1.0.9
type ContainerBindingMode int
ContainerBindingMode 表示容器绑定配置模式。
该配置用于在“宿主机级绑定”(更稳定、更贴近真实硬件)与“容器级绑定”(更适合容器镜像复制/隔离) 之间做选择。业务侧可通过配置控制机器码派生逻辑在容器环境下的行为。
const ( // ContainerBindingAuto 表示自动检测:由运行时根据环境与可用硬件信息选择绑定级别。 ContainerBindingAuto ContainerBindingMode = iota // ContainerBindingHost 表示强制宿主机:优先/强制使用宿主机硬件信息进行绑定。 ContainerBindingHost // ContainerBindingContainer 表示强制容器级:使用容器环境内可用信息派生容器级标识。 ContainerBindingContainer )
func (ContainerBindingMode) String ¶ added in v1.0.9
func (m ContainerBindingMode) String() string
type ContainerHintProvider ¶ added in v1.0.9
type ContainerHintProvider func() []string
ContainerHintProvider 提供用于容器派生机器码的附加指纹
type FingerprintStatus ¶ added in v1.0.7
FingerprintStatus 描述硬件指纹的值与稳定性
func GetHardwareFingerprintStatus ¶ added in v1.0.7
func GetHardwareFingerprintStatus() (*FingerprintStatus, error)
GetHardwareFingerprintStatus 返回指纹值及稳定性
type HardwareInfo ¶ added in v1.0.9
type HardwareInfo interface {
// ProductUUID 返回主机级产品 UUID(例如 SMBIOS/DMI UUID)。
ProductUUID() string
// BoardSerial 返回主板序列号(若可用)。
BoardSerial() string
// CPUSignature 返回 CPU 的可重复签名(不要求是真正的序列号;可为族/型号/步进组合)。
CPUSignature() string
// DiskSerials 返回磁盘序列号列表(尽量只包含物理盘,且保持顺序稳定)。
DiskSerials() []string
// TPMSupported 返回是否检测到 TPM(或等价硬件安全模块)可用。
TPMSupported() bool
// Fingerprint 返回当前平台的硬件指纹(通常为 hash),以及可能的错误。
Fingerprint() (string, error)
// IsStable 返回当前硬件信息是否“稳定到足以用于绑定”。
IsStable() bool
}
HardwareInfo 是跨平台统一的“硬件信息视图”接口。
设计目标:
- 跨平台一致性:不同平台(Linux/Windows/macOS/其他)应尽量输出同一语义的字段。 - “同一语义”指:同一个方法在各平台返回的应是同类硬件标识(例如 ProductUUID 都是主机级 UUID)。
- 稳定性优先:硬件特征优先于软件特征。硬件特征不应随重装系统/改主机名而变化。
- 向后兼容:该接口是新增能力,不要求改动现有结构体字段与对外 API。
- 最小依赖:实现侧应尽量使用操作系统原生信息源(sysfs/registry/ioreg 等),避免引入额外依赖。
- 失败可降级:信息源缺失(例如容器、权限不足、文件不存在)时,不应导致整体失败;返回空值即可。
注意:
- DiskSerials 返回应尽量排序并去重,以保证指纹可重复。
- Fingerprint 返回的指纹值应只依赖稳定特征;IsStable 用于标识“足够稳定”的硬件组合是否可得。
type HardwareWeight ¶ added in v1.0.6
HardwareWeight 硬件信息权重
type Info ¶ added in v1.0.6
type Info struct {
MachineID string `json:"machine_id"` // 原始机器码
ProtectedID string `json:"protected_id"` // 应用保护机器码
MACAddress string `json:"mac_address,omitempty"` // MAC地址(可选硬件绑定)
IsContainer bool `json:"is_container"` // 是否容器环境
ContainerID string `json:"container_id,omitempty"` // 容器ID
}
Info 返回系统信息摘要
