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; }
+ }
///