improve:用户分级

This commit is contained in:
2025-09-06 18:03:23 +08:00
parent b16000f8e5
commit 67a982e6e4
+42 -12
View File
@@ -856,10 +856,41 @@ namespace Ink_Canvas.Helpers
Array.Copy(encryptedData, 0, checksum, 0, 32); Array.Copy(encryptedData, 0, checksum, 0, 32);
Array.Copy(encryptedData, 32, data, 0, data.Length); Array.Copy(encryptedData, 32, data, 0, data.Length);
// 使用SHA256生成解密密钥 // 首先尝试使用新的固定密钥解密
var stats = TryDecryptWithKey(data, checksum, "ICC_Usage_Stats_Fixed_Key_2024", filePath);
if (stats != null)
{
return stats;
}
// 如果新密钥失败,尝试使用旧的设备ID密钥(向后兼容)
stats = TryDecryptWithKey(data, checksum, DeviceId + "ICC_Usage_Stats_Salt", filePath);
if (stats != null)
{
LogHelper.WriteLogToFile($"DeviceIdentifier | 使用旧密钥成功解密,将使用新密钥重新保存: {filePath}");
// 使用新密钥重新保存,确保下次使用新密钥
SaveUsageStatsToFile(filePath, stats);
return stats;
}
}
}
catch (Exception ex)
{
LogHelper.WriteLogToFile($"DeviceIdentifier | 从加密文件加载使用统计失败 ({filePath}): {ex.Message}", LogHelper.LogType.Error);
}
return null;
}
/// <summary>
/// 尝试使用指定密钥解密数据
/// </summary>
private static UsageStats TryDecryptWithKey(byte[] data, byte[] checksum, string keyString, string filePath)
{
try
{
using (var sha256 = SHA256.Create()) using (var sha256 = SHA256.Create())
{ {
byte[] keyBytes = sha256.ComputeHash(Encoding.UTF8.GetBytes(DeviceId + "ICC_Usage_Stats_Salt")); byte[] keyBytes = sha256.ComputeHash(Encoding.UTF8.GetBytes(keyString));
// XOR解密 // XOR解密
byte[] decryptedData = new byte[data.Length]; byte[] decryptedData = new byte[data.Length];
@@ -872,29 +903,27 @@ namespace Ink_Canvas.Helpers
byte[] computedChecksum = sha256.ComputeHash(decryptedData); byte[] computedChecksum = sha256.ComputeHash(decryptedData);
if (!checksum.SequenceEqual(computedChecksum)) if (!checksum.SequenceEqual(computedChecksum))
{ {
LogHelper.WriteLogToFile($"DeviceIdentifier | 加密文件校验和验证失败: {filePath}", LogHelper.LogType.Error); return null; // 校验失败,不是这个密钥
return null;
} }
string json = Encoding.UTF8.GetString(decryptedData); string json = Encoding.UTF8.GetString(decryptedData);
var stats = JsonConvert.DeserializeObject<UsageStats>(json); var stats = JsonConvert.DeserializeObject<UsageStats>(json);
if (stats != null && !string.IsNullOrEmpty(stats.DeviceId)) if (stats != null && !string.IsNullOrEmpty(stats.DeviceId))
{ {
LogHelper.WriteLogToFile($"DeviceIdentifier | 从加密文件成功加载使用统计: {filePath}"); LogHelper.WriteLogToFile($"DeviceIdentifier | 使用密钥成功解密使用统计: {filePath}");
return stats; return stats;
} }
} }
} }
} catch
catch (Exception ex)
{ {
LogHelper.WriteLogToFile($"DeviceIdentifier | 从加密文件加载使用统计失败 ({filePath}): {ex.Message}", LogHelper.LogType.Error); // 解密失败,返回null
} }
return null; return null;
} }
/// <summary> /// <summary>
/// 保存使用统计到文件(加密) /// 保存使用统计到文件(使用固定密钥加密)
/// </summary> /// </summary>
private static void SaveUsageStatsToFile(string filePath, UsageStats stats) private static void SaveUsageStatsToFile(string filePath, UsageStats stats)
{ {
@@ -910,10 +939,11 @@ namespace Ink_Canvas.Helpers
string json = JsonConvert.SerializeObject(stats, Formatting.Indented); string json = JsonConvert.SerializeObject(stats, Formatting.Indented);
byte[] data = Encoding.UTF8.GetBytes(json); byte[] data = Encoding.UTF8.GetBytes(json);
// 使用SHA256生成加密密钥(基于设备ID // 使用固定密钥进行加密,不依赖设备ID
using (var sha256 = SHA256.Create()) using (var sha256 = SHA256.Create())
{ {
byte[] keyBytes = sha256.ComputeHash(Encoding.UTF8.GetBytes(DeviceId + "ICC_Usage_Stats_Salt")); // 使用固定的应用程序密钥,确保跨设备更新时数据不会丢失
byte[] keyBytes = sha256.ComputeHash(Encoding.UTF8.GetBytes("ICC_Usage_Stats_Fixed_Key_2024"));
// 简单的XOR加密 // 简单的XOR加密
byte[] encryptedData = new byte[data.Length]; byte[] encryptedData = new byte[data.Length];
@@ -930,7 +960,7 @@ namespace Ink_Canvas.Helpers
File.WriteAllBytes(filePath, finalData); File.WriteAllBytes(filePath, finalData);
LogHelper.WriteLogToFile($"DeviceIdentifier | 加密使用统计已保存到: {filePath}"); LogHelper.WriteLogToFile($"DeviceIdentifier | 使用固定密钥加密使用统计已保存到: {filePath}");
} }
} }
catch (Exception ex) catch (Exception ex)