独特的获取本机PC唯一指纹信息方法
大家如果有写共享软件,就会发现要给共享软件写一个普通的激活码,这个激活码往往又要和电脑本机的一些唯一信息组合再哈希成唯一编码。唯一的标识一个设备是一个基本功能,可以拥有很多应用场景,比如软件授权(如何保证你的软件在授权后才能在特定机器上使用)、软件License,设备标识,设备身份识别等。在C#中,我们常用WMI(Windows Management Instrumentation)技术获取硬件的信息,现在再列举出一些除了WMI方式获得唯一指纹值方式,供你举一反三。
一、注册表
Windows系统的注册表中存储了大量的系统信息,其中一些信息可以作为PC的唯一指纹。例如,你可以使用C#来读取HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography下的MachineGuid键,这个键在安装Windows时生成,并且在系统生命周期内保持不变。
using Microsoft.Win32;
string location = @"SOFTWARE\Microsoft\Cryptography";
string name = "MachineGuid";
using (RegistryKey localMachineX64 = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64))
{
using (RegistryKey rk = localMachineX64.OpenSubKey(location))
{
if (rk == null)
throw new KeyNotFoundException(
string.Format("Key Not Found: {0}", location));
object machineGuid = rk.GetValue(name);
if (machineGuid == null)
throw new IndexOutOfRangeException(
string.Format("Index Not Found: {0}", name));
Console.WriteLine(machineGuid.ToString());
}
}
二、MAC地址:
返回第一个处于活动状态的以太网接口的MAC地址。如果没有找到符合条件的接口,它会返回一个空字符串。
using System;
using System.Linq;
using System.Net.NetworkInformation;
public string GetMacAddress()
{
foreach (NetworkInterface nic in NetworkInterface.GetAllNetworkInterfaces())
{
// 只获取第一个以太网接口的MAC地址
if (nic.NetworkInterfaceType == NetworkInterfaceType.Ethernet &&
nic.OperationalStatus == OperationalStatus.Up)
{
return nic.GetPhysicalAddress().ToString();
}
}
return String.Empty;
}
三、环境变量
环境变量中的某些值可以作为PC的独特指纹,比如PROCESSOR_IDENTIFIER,PROCESSOR_REVISION等。
string processorId = Environment.GetEnvironmentVariable("PROCESSOR_IDENTIFIER");
string processorRevision = Environment.GetEnvironmentVariable("PROCESSOR_REVISION");
Console.WriteLine("Processor ID: " + processorId);
Console.WriteLine("Processor Revision: " + processorRevision);
四、使用系统的区域设置(辅助结合唯一性)
系统的区域设置(如语言、货币格式等)可以作为唯一指纹的一部分。虽然用户可能会更改这些设置,但在大多数情况下,这些设置会保持不变。
using System.Globalization;
CultureInfo cultureInfo = CultureInfo.CurrentCulture;
Console.WriteLine("Culture info: " + cultureInfo.ToString());
不过,不管使用怎样的硬件信息或者牛气的算法来进行用户或者设备的标识,还是一句老话“道高一尺,魔高一丈”,都是可以被攻破的,即便你的标识伪造不了、克隆不了,攻击者也可以使用其它攻击方式,如逆向你的验证check代码,然后将其修改掉,使其check失灵。因此,无论设备标识或者用户标识,很多情况下可能只防君子、不防小人,甚至悲观者认为这些手段都是防止合法用户的,影响用户使用的方便性,大可以取消掉。笔者认为,没有必要这么悲观,知识产权等信息是尊敬人的价值和劳动的表现,即便不能完全防止小人,我们也要通过这些方法将一般的小人排除在技术门槛之外,并尽量增加高级小人破解时的代价。