Browse Source

Refactor encryption methods for enhanced code clarity and null safety.

pull/23059/head
Emre KARA 1 year ago
parent
commit
cd9d7503d0
  1. 89
      framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Activity/Storage/TelemetryActivityStorage.cs

89
framework/src/Volo.Abp.Core/Volo/Abp/Telemetry/Activity/Storage/TelemetryActivityStorage.cs

@ -20,7 +20,7 @@ public class TelemetryActivityStorage : ITelemetryActivityStorage, ISingletonDep
private const int RetryDelayMs = 100; private const int RetryDelayMs = 100;
private const int MutexTimeoutMs = 5000; private const int MutexTimeoutMs = 5000;
private const string MutexName = "Global\\TelemetryActivityStorage"; private const string MutexName = "Global\\TelemetryActivityStorage";
private readonly static byte[] EncryptionKey = "AbpTelemetryStorageKey"u8.ToArray(); private const string EncryptionKey = "AbpTelemetryStorageKey";
private readonly TelemetryActivityStorageOptions _options; private readonly TelemetryActivityStorageOptions _options;
private TelemetryActivityStorageState? _cachedState; private TelemetryActivityStorageState? _cachedState;
@ -160,7 +160,7 @@ public class TelemetryActivityStorage : ITelemetryActivityStorage, ISingletonDep
return new TelemetryActivityStorageState(); return new TelemetryActivityStorageState();
} }
var json = DecryptData(encryptedJson); var json = Decrypt(encryptedJson);
return JsonSerializer.Deserialize<TelemetryActivityStorageState?>(json, GetJsonSerializerOptions()) return JsonSerializer.Deserialize<TelemetryActivityStorageState?>(json, GetJsonSerializerOptions())
?? new TelemetryActivityStorageState(); ?? new TelemetryActivityStorageState();
}) ?? new TelemetryActivityStorageState(); }) ?? new TelemetryActivityStorageState();
@ -267,7 +267,7 @@ public class TelemetryActivityStorage : ITelemetryActivityStorage, ISingletonDep
private Task SaveAsync() private Task SaveAsync()
{ {
var json = JsonSerializer.Serialize(_cachedState ?? new TelemetryActivityStorageState(), GetJsonSerializerOptions()); var json = JsonSerializer.Serialize(_cachedState ?? new TelemetryActivityStorageState(), GetJsonSerializerOptions());
var encryptedJson = EncryptData(json); var encryptedJson = Encrypt(json);
File.WriteAllText(TelemetryPaths.ActivityStorage, encryptedJson, Encoding.UTF8); File.WriteAllText(TelemetryPaths.ActivityStorage, encryptedJson, Encoding.UTF8);
return Task.CompletedTask; return Task.CompletedTask;
} }
@ -286,7 +286,7 @@ public class TelemetryActivityStorage : ITelemetryActivityStorage, ISingletonDep
if (!File.Exists(TelemetryPaths.ActivityStorage)) if (!File.Exists(TelemetryPaths.ActivityStorage))
{ {
var json = JsonSerializer.Serialize(_cachedState ?? new TelemetryActivityStorageState(), GetJsonSerializerOptions()); var json = JsonSerializer.Serialize(_cachedState ?? new TelemetryActivityStorageState(), GetJsonSerializerOptions());
var encryptedJson = EncryptData(json); var encryptedJson = Encrypt(json);
File.WriteAllText(TelemetryPaths.ActivityStorage, encryptedJson, Encoding.UTF8); File.WriteAllText(TelemetryPaths.ActivityStorage, encryptedJson, Encoding.UTF8);
} }
} }
@ -311,65 +311,32 @@ public class TelemetryActivityStorage : ITelemetryActivityStorage, ISingletonDep
{ {
return lastSend is null || DateTimeOffset.UtcNow - lastSend > _options.InfoExpirationPeriod; return lastSend is null || DateTimeOffset.UtcNow - lastSend > _options.InfoExpirationPeriod;
} }
private static string EncryptData(string plainText)
{
try
{
using var aes = Aes.Create();
aes.Key = EncryptionKey;
aes.GenerateIV();
var encryptor = aes.CreateEncryptor(aes.Key, aes.IV); private static string Encrypt(string plainText)
{
using var msEncrypt = new MemoryStream(); using var aes = Aes.Create();
using var csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write); using var sha256 = SHA256.Create();
using var swEncrypt = new StreamWriter(csEncrypt); aes.Key = sha256.ComputeHash(Encoding.UTF8.GetBytes(EncryptionKey));
aes.Mode = CipherMode.ECB;
swEncrypt.Write(plainText); aes.Padding = PaddingMode.PKCS7;
csEncrypt.FlushFinalBlock();
var encryptor = aes.CreateEncryptor();
var encrypted = msEncrypt.ToArray(); var inputBytes = Encoding.UTF8.GetBytes(plainText);
var result = new byte[aes.IV.Length + encrypted.Length]; var encryptedBytes = encryptor.TransformFinalBlock(inputBytes, 0, inputBytes.Length);
Array.Copy(aes.IV, 0, result, 0, aes.IV.Length); return Convert.ToBase64String(encryptedBytes);
Array.Copy(encrypted, 0, result, aes.IV.Length, encrypted.Length);
return Convert.ToBase64String(result);
}
catch
{
return plainText;
}
} }
private static string DecryptData(string cipherText) private static string Decrypt(string cipherText)
{ {
try using var aes = Aes.Create();
{ using var sha256 = SHA256.Create();
var fullCipher = Convert.FromBase64String(cipherText); aes.Key = sha256.ComputeHash(Encoding.UTF8.GetBytes(EncryptionKey));
aes.Mode = CipherMode.ECB;
using var aes = Aes.Create(); aes.Padding = PaddingMode.PKCS7;
aes.Key = EncryptionKey;
var decryptor = aes.CreateDecryptor();
var iv = new byte[aes.IV.Length]; var inputBytes = Convert.FromBase64String(cipherText);
var cipher = new byte[fullCipher.Length - iv.Length]; var decryptedBytes = decryptor.TransformFinalBlock(inputBytes, 0, inputBytes.Length);
return Encoding.UTF8.GetString(decryptedBytes);
Array.Copy(fullCipher, 0, iv, 0, iv.Length);
Array.Copy(fullCipher, iv.Length, cipher, 0, cipher.Length);
aes.IV = iv;
var decryptor = aes.CreateDecryptor(aes.Key, aes.IV);
using var msDecrypt = new MemoryStream(cipher);
using var csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read);
using var srDecrypt = new StreamReader(csDecrypt);
return srDecrypt.ReadToEnd();
}
catch
{
return cipherText;
}
} }
} }
Loading…
Cancel
Save