kstools-license-manager-test / revit-plugin /HardwareFingerprint.cs
KyrosDev's picture
Initial commit: Complete KSTools License Management System
ad67bb9
using System;
using System.Management;
using System.Security.Cryptography;
using System.Text;
namespace KSTools.Licensing
{
/// <summary>
/// 硬體指紋生成器
/// 用於生成唯一的硬體識別碼,確保授權與特定設備綁定
/// </summary>
public static class HardwareFingerprint
{
/// <summary>
/// 生成硬體指紋ID
/// </summary>
/// <returns>32位字符的硬體指紋</returns>
public static string GetHardwareId()
{
try
{
string hwInfo = "";
// 取得 CPU ID
string cpuId = GetCpuId();
if (!string.IsNullOrEmpty(cpuId))
{
hwInfo += cpuId;
}
// 取得主機板序號
string motherboardSerial = GetMotherboardSerial();
if (!string.IsNullOrEmpty(motherboardSerial))
{
hwInfo += motherboardSerial;
}
// 如果主要資訊都無法取得,使用 MAC 地址作為備選
if (string.IsNullOrEmpty(hwInfo))
{
hwInfo = GetMacAddress();
}
// 生成 SHA256 雜湊並取前32位
using (var sha256 = SHA256.Create())
{
var hash = sha256.ComputeHash(Encoding.UTF8.GetBytes(hwInfo + "KSTOOLS_SALT"));
string hashString = Convert.ToBase64String(hash);
// 移除特殊字符並截取前32位
hashString = hashString.Replace("+", "").Replace("/", "").Replace("=", "");
return hashString.Length >= 32 ? hashString.Substring(0, 32) : hashString.PadRight(32, '0');
}
}
catch (Exception ex)
{
// 如果發生錯誤,使用電腦名稱和當前用戶作為備選方案
string fallback = Environment.MachineName + Environment.UserName + "KSTOOLS";
using (var sha256 = SHA256.Create())
{
var hash = sha256.ComputeHash(Encoding.UTF8.GetBytes(fallback));
string hashString = Convert.ToBase64String(hash);
hashString = hashString.Replace("+", "").Replace("/", "").Replace("=", "");
return hashString.Length >= 32 ? hashString.Substring(0, 32) : hashString.PadRight(32, '0');
}
}
}
/// <summary>
/// 取得 CPU 處理器 ID
/// </summary>
/// <returns>CPU ID 字符串</returns>
private static string GetCpuId()
{
try
{
using (var searcher = new ManagementObjectSearcher("SELECT ProcessorId FROM Win32_Processor"))
{
foreach (ManagementObject obj in searcher.Get())
{
return obj["ProcessorId"]?.ToString() ?? "";
}
}
}
catch (Exception)
{
// 忽略 WMI 存取錯誤
}
return "";
}
/// <summary>
/// 取得主機板序號
/// </summary>
/// <returns>主機板序號字符串</returns>
private static string GetMotherboardSerial()
{
try
{
using (var searcher = new ManagementObjectSearcher("SELECT SerialNumber FROM Win32_BaseBoard"))
{
foreach (ManagementObject obj in searcher.Get())
{
string serial = obj["SerialNumber"]?.ToString() ?? "";
// 排除一些常見的無效序號
if (!string.IsNullOrEmpty(serial) &&
serial != "To be filled by O.E.M." &&
serial != "Default string" &&
serial != "None")
{
return serial;
}
}
}
}
catch (Exception)
{
// 忽略 WMI 存取錯誤
}
return "";
}
/// <summary>
/// 取得 MAC 地址作為備選方案
/// </summary>
/// <returns>MAC 地址字符串</returns>
private static string GetMacAddress()
{
try
{
using (var searcher = new ManagementObjectSearcher("SELECT MACAddress FROM Win32_NetworkAdapter WHERE NetEnabled=true"))
{
foreach (ManagementObject obj in searcher.Get())
{
string mac = obj["MACAddress"]?.ToString() ?? "";
if (!string.IsNullOrEmpty(mac) && mac != "00:00:00:00:00:00")
{
return mac;
}
}
}
}
catch (Exception)
{
// 忽略 WMI 存取錯誤
}
return Environment.MachineName;
}
/// <summary>
/// 驗證硬體指紋格式
/// </summary>
/// <param name="hardwareId">要驗證的硬體指紋</param>
/// <returns>是否為有效格式</returns>
public static bool IsValidHardwareId(string hardwareId)
{
return !string.IsNullOrEmpty(hardwareId) &&
hardwareId.Length == 32 &&
System.Text.RegularExpressions.Regex.IsMatch(hardwareId, @"^[A-Za-z0-9]+$");
}
/// <summary>
/// 取得硬體資訊摘要 (用於日誌記錄)
/// </summary>
/// <returns>硬體資訊摘要</returns>
public static string GetHardwareInfo()
{
try
{
var info = new StringBuilder();
info.AppendLine($"電腦名稱: {Environment.MachineName}");
info.AppendLine($"作業系統: {Environment.OSVersion}");
info.AppendLine($"處理器架構: {Environment.ProcessorCount} 核心");
info.AppendLine($"使用者: {Environment.UserName}");
// 嘗試取得更詳細的硬體資訊
try
{
using (var searcher = new ManagementObjectSearcher("SELECT Name FROM Win32_Processor"))
{
foreach (ManagementObject obj in searcher.Get())
{
info.AppendLine($"處理器: {obj["Name"]}");
break;
}
}
using (var searcher = new ManagementObjectSearcher("SELECT TotalPhysicalMemory FROM Win32_ComputerSystem"))
{
foreach (ManagementObject obj in searcher.Get())
{
long memory = Convert.ToInt64(obj["TotalPhysicalMemory"]);
info.AppendLine($"記憶體: {memory / (1024 * 1024 * 1024)} GB");
break;
}
}
}
catch
{
// 忽略詳細資訊取得錯誤
}
return info.ToString();
}
catch (Exception ex)
{
return $"硬體資訊取得失敗: {ex.Message}";
}
}
}
}