improve:用户分级

This commit is contained in:
2025-09-06 18:03:23 +08:00
parent b16000f8e5
commit 67a982e6e4
+59 -29
View File
@@ -856,33 +856,21 @@ 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生成解密密钥 // 首先尝试使用新的固定密钥解密
using (var sha256 = SHA256.Create()) var stats = TryDecryptWithKey(data, checksum, "ICC_Usage_Stats_Fixed_Key_2024", filePath);
if (stats != null)
{ {
byte[] keyBytes = sha256.ComputeHash(Encoding.UTF8.GetBytes(DeviceId + "ICC_Usage_Stats_Salt")); return stats;
}
// XOR解密 // 如果新密钥失败,尝试使用旧的设备ID密钥(向后兼容)
byte[] decryptedData = new byte[data.Length]; stats = TryDecryptWithKey(data, checksum, DeviceId + "ICC_Usage_Stats_Salt", filePath);
for (int i = 0; i < data.Length; i++) if (stats != null)
{ {
decryptedData[i] = (byte)(data[i] ^ keyBytes[i % keyBytes.Length]); LogHelper.WriteLogToFile($"DeviceIdentifier | 使用旧密钥成功解密,将使用新密钥重新保存: {filePath}");
} // 使用新密钥重新保存,确保下次使用新密钥
SaveUsageStatsToFile(filePath, stats);
// 验证校验 return stats;
byte[] computedChecksum = sha256.ComputeHash(decryptedData);
if (!checksum.SequenceEqual(computedChecksum))
{
LogHelper.WriteLogToFile($"DeviceIdentifier | 加密文件校验和验证失败: {filePath}", LogHelper.LogType.Error);
return null;
}
string json = Encoding.UTF8.GetString(decryptedData);
var stats = JsonConvert.DeserializeObject<UsageStats>(json);
if (stats != null && !string.IsNullOrEmpty(stats.DeviceId))
{
LogHelper.WriteLogToFile($"DeviceIdentifier | 从加密文件成功加载使用统计: {filePath}");
return stats;
}
} }
} }
} }
@@ -894,7 +882,48 @@ namespace Ink_Canvas.Helpers
} }
/// <summary> /// <summary>
/// 保存使用统计到文件(加密) /// 尝试使用指定密钥解密数据
/// </summary>
private static UsageStats TryDecryptWithKey(byte[] data, byte[] checksum, string keyString, string filePath)
{
try
{
using (var sha256 = SHA256.Create())
{
byte[] keyBytes = sha256.ComputeHash(Encoding.UTF8.GetBytes(keyString));
// XOR解密
byte[] decryptedData = new byte[data.Length];
for (int i = 0; i < data.Length; i++)
{
decryptedData[i] = (byte)(data[i] ^ keyBytes[i % keyBytes.Length]);
}
// 验证校验
byte[] computedChecksum = sha256.ComputeHash(decryptedData);
if (!checksum.SequenceEqual(computedChecksum))
{
return null; // 校验失败,不是这个密钥
}
string json = Encoding.UTF8.GetString(decryptedData);
var stats = JsonConvert.DeserializeObject<UsageStats>(json);
if (stats != null && !string.IsNullOrEmpty(stats.DeviceId))
{
LogHelper.WriteLogToFile($"DeviceIdentifier | 使用密钥成功解密使用统计: {filePath}");
return stats;
}
}
}
catch
{
// 解密失败,返回null
}
return null;
}
/// <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)