improve:设备ID

This commit is contained in:
2026-02-06 17:21:31 +08:00
parent 60c07c3738
commit 674ce28420
+87 -24
View File
@@ -46,20 +46,40 @@ namespace Ink_Canvas.Helpers
{ {
try try
{ {
// 1. 尝试从主文件读取设备ID // 计算当前设备的硬件指纹
string deviceId = LoadDeviceIdFromFile(DeviceIdFilePath); string currentHardwareFingerprint = GenerateHardwareFingerprint();
if (!string.IsNullOrEmpty(deviceId))
// 1. 尝试从主文件读取设备ID及其硬件指纹
var storedInfo = LoadDeviceIdFromFile(DeviceIdFilePath);
if (storedInfo != null && !string.IsNullOrEmpty(storedInfo.DeviceId) && IsValidDeviceId(storedInfo.DeviceId))
{ {
LogHelper.WriteLogToFile($"DeviceIdentifier | 从主文件读取设备ID: {deviceId}"); if (!string.IsNullOrEmpty(storedInfo.HardwareFingerprint))
return deviceId; {
if (storedInfo.HardwareFingerprint == currentHardwareFingerprint)
{
LogHelper.WriteLogToFile($"DeviceIdentifier | 从主文件读取设备ID且硬件信息一致: {storedInfo.DeviceId}");
return storedInfo.DeviceId;
} }
// 2. 生成新的设备ID LogHelper.WriteLogToFile("DeviceIdentifier | 检测到当前硬件信息与保存的设备ID不一致,将重新生成设备ID");
string newDeviceId = GenerateDeviceId(); }
else
{
LogHelper.WriteLogToFile("DeviceIdentifier | 检测到旧格式设备ID文件(无硬件信息),将基于当前硬件重新生成设备ID并升级文件格式");
}
}
// 2. 基于当前硬件指纹生成新的设备ID
string newDeviceId = GenerateDeviceIdFromFingerprint(currentHardwareFingerprint);
LogHelper.WriteLogToFile($"DeviceIdentifier | 生成新设备ID: {newDeviceId}"); LogHelper.WriteLogToFile($"DeviceIdentifier | 生成新设备ID: {newDeviceId}");
// 3. 保存到主文件 // 3. 保存到主文件(包含硬件指纹)
SaveDeviceIdToFile(DeviceIdFilePath, newDeviceId); var newInfo = new DeviceIdInfo
{
DeviceId = newDeviceId,
HardwareFingerprint = currentHardwareFingerprint
};
SaveDeviceIdToFile(DeviceIdFilePath, newInfo);
return newDeviceId; return newDeviceId;
} }
@@ -78,14 +98,28 @@ namespace Ink_Canvas.Helpers
private static string GenerateDeviceId() private static string GenerateDeviceId()
{ {
try try
{
// 基于当前硬件指纹生成设备ID
string hardwareFingerprint = GenerateHardwareFingerprint();
return GenerateDeviceIdFromFingerprint(hardwareFingerprint);
}
catch (Exception ex)
{
LogHelper.WriteLogToFile($"DeviceIdentifier | 生成设备ID时出错: {ex.Message}", LogHelper.LogType.Error);
return GenerateFallbackDeviceId();
}
}
/// <summary>
/// 生成当前设备的硬件指纹字符串(用于生成和校验设备ID)
/// </summary>
private static string GenerateHardwareFingerprint()
{ {
// 收集硬件信息 // 收集硬件信息
var hardwareInfo = new StringBuilder(); var hardwareInfo = new StringBuilder();
// 使用反射获取硬件信息,避免直接引用System.Management
try try
{ {
// 尝试加载System.Management程序集
var assembly = Assembly.Load("System.Management"); var assembly = Assembly.Load("System.Management");
if (assembly != null) if (assembly != null)
{ {
@@ -186,9 +220,10 @@ namespace Ink_Canvas.Helpers
catch { } catch { }
} }
} }
catch { } catch
{
}
// 如果硬件信息不足,添加系统信息
if (hardwareInfo.Length < 10) if (hardwareInfo.Length < 10)
{ {
hardwareInfo.Append(Environment.MachineName); hardwareInfo.Append(Environment.MachineName);
@@ -196,10 +231,18 @@ namespace Ink_Canvas.Helpers
hardwareInfo.Append(Environment.OSVersion); hardwareInfo.Append(Environment.OSVersion);
} }
return hardwareInfo.ToString();
}
/// <summary>
/// 基于硬件指纹生成25字符的设备ID
/// </summary>
private static string GenerateDeviceIdFromFingerprint(string hardwareFingerprint)
{
// 生成哈希 // 生成哈希
using (var sha256 = SHA256.Create()) using (var sha256 = SHA256.Create())
{ {
byte[] hashBytes = sha256.ComputeHash(Encoding.UTF8.GetBytes(hardwareInfo.ToString())); byte[] hashBytes = sha256.ComputeHash(Encoding.UTF8.GetBytes(hardwareFingerprint ?? string.Empty));
string hashString = BitConverter.ToString(hashBytes).Replace("-", ""); string hashString = BitConverter.ToString(hashBytes).Replace("-", "");
// 取前25个字符,确保唯一性 // 取前25个字符,确保唯一性
@@ -217,12 +260,6 @@ namespace Ink_Canvas.Helpers
return deviceId.Substring(0, 24) + checksumChar; return deviceId.Substring(0, 24) + checksumChar;
} }
} }
catch (Exception ex)
{
LogHelper.WriteLogToFile($"DeviceIdentifier | 生成设备ID时出错: {ex.Message}", LogHelper.LogType.Error);
return GenerateFallbackDeviceId();
}
}
/// <summary> /// <summary>
/// 生成备用设备ID(基于时间戳) /// 生成备用设备ID(基于时间戳)
@@ -282,16 +319,33 @@ namespace Ink_Canvas.Helpers
/// <summary> /// <summary>
/// 从文件加载设备ID /// 从文件加载设备ID
/// </summary> /// </summary>
private static string LoadDeviceIdFromFile(string filePath) private static DeviceIdInfo LoadDeviceIdFromFile(string filePath)
{ {
try try
{ {
if (File.Exists(filePath)) if (File.Exists(filePath))
{ {
string content = File.ReadAllText(filePath).Trim(); string content = File.ReadAllText(filePath).Trim();
try
{
var info = JsonConvert.DeserializeObject<DeviceIdInfo>(content);
if (info != null && !string.IsNullOrEmpty(info.DeviceId) && IsValidDeviceId(info.DeviceId))
{
return info;
}
}
catch
{
}
if (IsValidDeviceId(content)) if (IsValidDeviceId(content))
{ {
return content; return new DeviceIdInfo
{
DeviceId = content,
HardwareFingerprint = null
};
} }
} }
} }
@@ -305,7 +359,7 @@ namespace Ink_Canvas.Helpers
/// <summary> /// <summary>
/// 保存设备ID到文件 /// 保存设备ID到文件
/// </summary> /// </summary>
private static void SaveDeviceIdToFile(string filePath, string deviceId) private static void SaveDeviceIdToFile(string filePath, DeviceIdInfo info)
{ {
try try
{ {
@@ -316,7 +370,8 @@ namespace Ink_Canvas.Helpers
Directory.CreateDirectory(directory); Directory.CreateDirectory(directory);
} }
File.WriteAllText(filePath, deviceId); string json = JsonConvert.SerializeObject(info, Formatting.Indented);
File.WriteAllText(filePath, json);
LogHelper.WriteLogToFile($"DeviceIdentifier | 设备ID已保存到: {filePath}"); 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; }
}
/// <summary> /// <summary>