From 674ce28420b935cd8ff4270caf6298654b064c0b Mon Sep 17 00:00:00 2001 From: CJKmkp <2564608840@qq.com> Date: Fri, 6 Feb 2026 17:21:31 +0800 Subject: [PATCH] =?UTF-8?q?improve:=E8=AE=BE=E5=A4=87ID?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Ink Canvas/Helpers/DeviceIdentifier.cs | 363 +++++++++++++++---------- 1 file changed, 213 insertions(+), 150 deletions(-) diff --git a/Ink Canvas/Helpers/DeviceIdentifier.cs b/Ink Canvas/Helpers/DeviceIdentifier.cs index d326079e..9bb45e9f 100644 --- a/Ink Canvas/Helpers/DeviceIdentifier.cs +++ b/Ink Canvas/Helpers/DeviceIdentifier.cs @@ -46,20 +46,40 @@ namespace Ink_Canvas.Helpers { try { - // 1. 尝试从主文件读取设备ID - string deviceId = LoadDeviceIdFromFile(DeviceIdFilePath); - if (!string.IsNullOrEmpty(deviceId)) + // 计算当前设备的硬件指纹 + string currentHardwareFingerprint = GenerateHardwareFingerprint(); + + // 1. 尝试从主文件读取设备ID及其硬件指纹 + var storedInfo = LoadDeviceIdFromFile(DeviceIdFilePath); + if (storedInfo != null && !string.IsNullOrEmpty(storedInfo.DeviceId) && IsValidDeviceId(storedInfo.DeviceId)) { - LogHelper.WriteLogToFile($"DeviceIdentifier | 从主文件读取设备ID: {deviceId}"); - return deviceId; + if (!string.IsNullOrEmpty(storedInfo.HardwareFingerprint)) + { + if (storedInfo.HardwareFingerprint == currentHardwareFingerprint) + { + LogHelper.WriteLogToFile($"DeviceIdentifier | 从主文件读取设备ID且硬件信息一致: {storedInfo.DeviceId}"); + return storedInfo.DeviceId; + } + + LogHelper.WriteLogToFile("DeviceIdentifier | 检测到当前硬件信息与保存的设备ID不一致,将重新生成设备ID"); + } + else + { + LogHelper.WriteLogToFile("DeviceIdentifier | 检测到旧格式设备ID文件(无硬件信息),将基于当前硬件重新生成设备ID并升级文件格式"); + } } - // 2. 生成新的设备ID - string newDeviceId = GenerateDeviceId(); + // 2. 基于当前硬件指纹生成新的设备ID + string newDeviceId = GenerateDeviceIdFromFingerprint(currentHardwareFingerprint); LogHelper.WriteLogToFile($"DeviceIdentifier | 生成新设备ID: {newDeviceId}"); - // 3. 保存到主文件 - SaveDeviceIdToFile(DeviceIdFilePath, newDeviceId); + // 3. 保存到主文件(包含硬件指纹) + var newInfo = new DeviceIdInfo + { + DeviceId = newDeviceId, + HardwareFingerprint = currentHardwareFingerprint + }; + SaveDeviceIdToFile(DeviceIdFilePath, newInfo); return newDeviceId; } @@ -79,143 +99,9 @@ namespace Ink_Canvas.Helpers { try { - // 收集硬件信息 - var hardwareInfo = new StringBuilder(); - - // 使用反射获取硬件信息,避免直接引用System.Management - try - { - // 尝试加载System.Management程序集 - var assembly = Assembly.Load("System.Management"); - if (assembly != null) - { - // CPU信息 - try - { - var searcherType = assembly.GetType("System.Management.ManagementObjectSearcher"); - var searcher = Activator.CreateInstance(searcherType, "SELECT ProcessorId FROM Win32_Processor"); - var getMethod = searcherType.GetMethod("Get"); - var enumerator = getMethod.Invoke(searcher, null); - - var moveNextMethod = enumerator.GetType().GetMethod("MoveNext"); - var currentProperty = enumerator.GetType().GetProperty("Current"); - - if ((bool)moveNextMethod.Invoke(enumerator, null)) - { - var obj = currentProperty.GetValue(enumerator); - var indexer = obj.GetType().GetProperty("Item", new[] { typeof(string) }); - var processorId = indexer.GetValue(obj, new object[] { "ProcessorId" }); - hardwareInfo.Append(processorId?.ToString() ?? ""); - } - - var disposeMethod = searcher.GetType().GetMethod("Dispose"); - disposeMethod?.Invoke(searcher, null); - } - catch { } - - // 主板序列号 - try - { - var searcherType = assembly.GetType("System.Management.ManagementObjectSearcher"); - var searcher = Activator.CreateInstance(searcherType, "SELECT SerialNumber FROM Win32_BaseBoard"); - var getMethod = searcherType.GetMethod("Get"); - var enumerator = getMethod.Invoke(searcher, null); - - var moveNextMethod = enumerator.GetType().GetMethod("MoveNext"); - var currentProperty = enumerator.GetType().GetProperty("Current"); - - if ((bool)moveNextMethod.Invoke(enumerator, null)) - { - var obj = currentProperty.GetValue(enumerator); - var indexer = obj.GetType().GetProperty("Item", new[] { typeof(string) }); - var serialNumber = indexer.GetValue(obj, new object[] { "SerialNumber" }); - hardwareInfo.Append(serialNumber?.ToString() ?? ""); - } - - var disposeMethod = searcher.GetType().GetMethod("Dispose"); - disposeMethod?.Invoke(searcher, null); - } - catch { } - - // BIOS序列号 - try - { - var searcherType = assembly.GetType("System.Management.ManagementObjectSearcher"); - var searcher = Activator.CreateInstance(searcherType, "SELECT SerialNumber FROM Win32_BIOS"); - var getMethod = searcherType.GetMethod("Get"); - var enumerator = getMethod.Invoke(searcher, null); - - var moveNextMethod = enumerator.GetType().GetMethod("MoveNext"); - var currentProperty = enumerator.GetType().GetProperty("Current"); - - if ((bool)moveNextMethod.Invoke(enumerator, null)) - { - var obj = currentProperty.GetValue(enumerator); - var indexer = obj.GetType().GetProperty("Item", new[] { typeof(string) }); - var serialNumber = indexer.GetValue(obj, new object[] { "SerialNumber" }); - hardwareInfo.Append(serialNumber?.ToString() ?? ""); - } - - var disposeMethod = searcher.GetType().GetMethod("Dispose"); - disposeMethod?.Invoke(searcher, null); - } - catch { } - - // 主硬盘序列号 - try - { - var searcherType = assembly.GetType("System.Management.ManagementObjectSearcher"); - var searcher = Activator.CreateInstance(searcherType, "SELECT SerialNumber FROM Win32_DiskDrive WHERE MediaType='Fixed hard disk media'"); - var getMethod = searcherType.GetMethod("Get"); - var enumerator = getMethod.Invoke(searcher, null); - - var moveNextMethod = enumerator.GetType().GetMethod("MoveNext"); - var currentProperty = enumerator.GetType().GetProperty("Current"); - - if ((bool)moveNextMethod.Invoke(enumerator, null)) - { - var obj = currentProperty.GetValue(enumerator); - var indexer = obj.GetType().GetProperty("Item", new[] { typeof(string) }); - var serialNumber = indexer.GetValue(obj, new object[] { "SerialNumber" }); - hardwareInfo.Append(serialNumber?.ToString() ?? ""); - } - - var disposeMethod = searcher.GetType().GetMethod("Dispose"); - disposeMethod?.Invoke(searcher, null); - } - catch { } - } - } - catch { } - - // 如果硬件信息不足,添加系统信息 - if (hardwareInfo.Length < 10) - { - hardwareInfo.Append(Environment.MachineName); - hardwareInfo.Append(Environment.UserName); - hardwareInfo.Append(Environment.OSVersion); - } - - // 生成哈希 - using (var sha256 = SHA256.Create()) - { - byte[] hashBytes = sha256.ComputeHash(Encoding.UTF8.GetBytes(hardwareInfo.ToString())); - string hashString = BitConverter.ToString(hashBytes).Replace("-", ""); - - // 取前25个字符,确保唯一性 - string deviceId = hashString.Substring(0, 25); - - // 添加校验位(第25位) - int checksum = 0; - for (int i = 0; i < 24; i++) - { - checksum += Convert.ToInt32(deviceId[i]); - } - checksum %= 36; // 0-9, A-Z - char checksumChar = checksum < 10 ? (char)(checksum + '0') : (char)(checksum - 10 + 'A'); - - return deviceId.Substring(0, 24) + checksumChar; - } + // 基于当前硬件指纹生成设备ID + string hardwareFingerprint = GenerateHardwareFingerprint(); + return GenerateDeviceIdFromFingerprint(hardwareFingerprint); } catch (Exception ex) { @@ -224,6 +110,157 @@ namespace Ink_Canvas.Helpers } } + /// + /// 生成当前设备的硬件指纹字符串(用于生成和校验设备ID) + /// + private static string GenerateHardwareFingerprint() + { + // 收集硬件信息 + var hardwareInfo = new StringBuilder(); + + try + { + var assembly = Assembly.Load("System.Management"); + if (assembly != null) + { + // CPU信息 + try + { + var searcherType = assembly.GetType("System.Management.ManagementObjectSearcher"); + var searcher = Activator.CreateInstance(searcherType, "SELECT ProcessorId FROM Win32_Processor"); + var getMethod = searcherType.GetMethod("Get"); + var enumerator = getMethod.Invoke(searcher, null); + + var moveNextMethod = enumerator.GetType().GetMethod("MoveNext"); + var currentProperty = enumerator.GetType().GetProperty("Current"); + + if ((bool)moveNextMethod.Invoke(enumerator, null)) + { + var obj = currentProperty.GetValue(enumerator); + var indexer = obj.GetType().GetProperty("Item", new[] { typeof(string) }); + var processorId = indexer.GetValue(obj, new object[] { "ProcessorId" }); + hardwareInfo.Append(processorId?.ToString() ?? ""); + } + + var disposeMethod = searcher.GetType().GetMethod("Dispose"); + disposeMethod?.Invoke(searcher, null); + } + catch { } + + // 主板序列号 + try + { + var searcherType = assembly.GetType("System.Management.ManagementObjectSearcher"); + var searcher = Activator.CreateInstance(searcherType, "SELECT SerialNumber FROM Win32_BaseBoard"); + var getMethod = searcherType.GetMethod("Get"); + var enumerator = getMethod.Invoke(searcher, null); + + var moveNextMethod = enumerator.GetType().GetMethod("MoveNext"); + var currentProperty = enumerator.GetType().GetProperty("Current"); + + if ((bool)moveNextMethod.Invoke(enumerator, null)) + { + var obj = currentProperty.GetValue(enumerator); + var indexer = obj.GetType().GetProperty("Item", new[] { typeof(string) }); + var serialNumber = indexer.GetValue(obj, new object[] { "SerialNumber" }); + hardwareInfo.Append(serialNumber?.ToString() ?? ""); + } + + var disposeMethod = searcher.GetType().GetMethod("Dispose"); + disposeMethod?.Invoke(searcher, null); + } + catch { } + + // BIOS序列号 + try + { + var searcherType = assembly.GetType("System.Management.ManagementObjectSearcher"); + var searcher = Activator.CreateInstance(searcherType, "SELECT SerialNumber FROM Win32_BIOS"); + var getMethod = searcherType.GetMethod("Get"); + var enumerator = getMethod.Invoke(searcher, null); + + var moveNextMethod = enumerator.GetType().GetMethod("MoveNext"); + var currentProperty = enumerator.GetType().GetProperty("Current"); + + if ((bool)moveNextMethod.Invoke(enumerator, null)) + { + var obj = currentProperty.GetValue(enumerator); + var indexer = obj.GetType().GetProperty("Item", new[] { typeof(string) }); + var serialNumber = indexer.GetValue(obj, new object[] { "SerialNumber" }); + hardwareInfo.Append(serialNumber?.ToString() ?? ""); + } + + var disposeMethod = searcher.GetType().GetMethod("Dispose"); + disposeMethod?.Invoke(searcher, null); + } + catch { } + + // 主硬盘序列号 + try + { + var searcherType = assembly.GetType("System.Management.ManagementObjectSearcher"); + var searcher = Activator.CreateInstance(searcherType, "SELECT SerialNumber FROM Win32_DiskDrive WHERE MediaType='Fixed hard disk media'"); + var getMethod = searcherType.GetMethod("Get"); + var enumerator = getMethod.Invoke(searcher, null); + + var moveNextMethod = enumerator.GetType().GetMethod("MoveNext"); + var currentProperty = enumerator.GetType().GetProperty("Current"); + + if ((bool)moveNextMethod.Invoke(enumerator, null)) + { + var obj = currentProperty.GetValue(enumerator); + var indexer = obj.GetType().GetProperty("Item", new[] { typeof(string) }); + var serialNumber = indexer.GetValue(obj, new object[] { "SerialNumber" }); + hardwareInfo.Append(serialNumber?.ToString() ?? ""); + } + + var disposeMethod = searcher.GetType().GetMethod("Dispose"); + disposeMethod?.Invoke(searcher, null); + } + catch { } + } + } + catch + { + } + + if (hardwareInfo.Length < 10) + { + hardwareInfo.Append(Environment.MachineName); + hardwareInfo.Append(Environment.UserName); + hardwareInfo.Append(Environment.OSVersion); + } + + return hardwareInfo.ToString(); + } + + /// + /// 基于硬件指纹生成25字符的设备ID + /// + private static string GenerateDeviceIdFromFingerprint(string hardwareFingerprint) + { + // 生成哈希 + using (var sha256 = SHA256.Create()) + { + byte[] hashBytes = sha256.ComputeHash(Encoding.UTF8.GetBytes(hardwareFingerprint ?? string.Empty)); + string hashString = BitConverter.ToString(hashBytes).Replace("-", ""); + + // 取前25个字符,确保唯一性 + string deviceId = hashString.Substring(0, 25); + + // 添加校验位(第25位) + int checksum = 0; + for (int i = 0; i < 24; i++) + { + checksum += Convert.ToInt32(deviceId[i]); + } + checksum %= 36; // 0-9, A-Z + char checksumChar = checksum < 10 ? (char)(checksum + '0') : (char)(checksum - 10 + 'A'); + + return deviceId.Substring(0, 24) + checksumChar; + } + } + /// /// 生成备用设备ID(基于时间戳) /// @@ -282,16 +319,33 @@ namespace Ink_Canvas.Helpers /// /// 从文件加载设备ID /// - private static string LoadDeviceIdFromFile(string filePath) + private static DeviceIdInfo LoadDeviceIdFromFile(string filePath) { try { if (File.Exists(filePath)) { string content = File.ReadAllText(filePath).Trim(); + + try + { + var info = JsonConvert.DeserializeObject(content); + if (info != null && !string.IsNullOrEmpty(info.DeviceId) && IsValidDeviceId(info.DeviceId)) + { + return info; + } + } + catch + { + } + if (IsValidDeviceId(content)) { - return content; + return new DeviceIdInfo + { + DeviceId = content, + HardwareFingerprint = null + }; } } } @@ -305,7 +359,7 @@ namespace Ink_Canvas.Helpers /// /// 保存设备ID到文件 /// - private static void SaveDeviceIdToFile(string filePath, string deviceId) + private static void SaveDeviceIdToFile(string filePath, DeviceIdInfo info) { try { @@ -316,7 +370,8 @@ namespace Ink_Canvas.Helpers Directory.CreateDirectory(directory); } - File.WriteAllText(filePath, deviceId); + string json = JsonConvert.SerializeObject(info, Formatting.Indented); + File.WriteAllText(filePath, json); LogHelper.WriteLogToFile($"DeviceIdentifier | 设备ID已保存到: {filePath}"); } @@ -326,6 +381,14 @@ namespace Ink_Canvas.Helpers } } + private class DeviceIdInfo + { + [JsonProperty("deviceId")] + public string DeviceId { get; set; } + + [JsonProperty("hardwareFingerprint")] + public string HardwareFingerprint { get; set; } + } ///