improve:用户分级
This commit is contained in:
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user