- Hinzufügen der `Encryptor`-Klasse für AES-Verschlüsselung und -Entschlüsselung. - Implementierung des `EncryptionController` zur Bereitstellung von Endpunkten für Verschlüsselung, Entschlüsselung und Generierung von Verschlüsselungsparametern. - Erweiterung der DI-Konfiguration mit `AddEncryptor`-Erweiterungsmethode und Integration in `Program.cs`. - Bedingte Registrierung des `EncryptionController` basierend auf der Konfiguration `UseEncryptor`, um sicherzustellen, dass der Controller nur bei Bedarf verfügbar ist. - Implementierung von Lazy Loading für die Verbindungszeichenfolge in `UserManagerDbContext` zur sicheren Handhabung von verschlüsselten Verbindungszeichenfolgen.
78 lines
2.7 KiB
C#
78 lines
2.7 KiB
C#
using DigitalData.UserManager.Application.Services.Options;
|
|
using Microsoft.Extensions.Options;
|
|
using System.Security.Cryptography;
|
|
using System.Text;
|
|
|
|
namespace DigitalData.UserManager.Application.Services
|
|
{
|
|
public class Encryptor
|
|
{
|
|
public const int KeyByteLength = 32;
|
|
|
|
private readonly EncryptionParameters _params;
|
|
|
|
public Encryptor(IOptions<EncryptionParameters> options)
|
|
{
|
|
_params = options.Value;
|
|
}
|
|
|
|
public string Encrypt(string plainText) => Encrypt(plainText, _params.Key, _params.IV);
|
|
|
|
public string Decrypt(string cipherText) => Decrypt(cipherText, _params.Key, _params.IV);
|
|
|
|
public static string Encrypt(string plainText, string key, string iv)
|
|
{
|
|
using Aes aes = Aes.Create();
|
|
aes.KeySize = KeyByteLength * 8;
|
|
aes.Key = AdjustKeySize(Encoding.UTF8.GetBytes(key), aes.KeySize / 8);
|
|
aes.IV = AdjustKeySize(Encoding.UTF8.GetBytes(iv), aes.BlockSize / 8);
|
|
|
|
ICryptoTransform encryptor = aes.CreateEncryptor(aes.Key, aes.IV);
|
|
|
|
using MemoryStream ms = new();
|
|
using (CryptoStream cs = new(ms, encryptor, CryptoStreamMode.Write))
|
|
{
|
|
using StreamWriter sw = new(cs);
|
|
sw.Write(plainText);
|
|
}
|
|
return Convert.ToBase64String(ms.ToArray());
|
|
}
|
|
|
|
public static string Decrypt(string cipherText, string key, string iv)
|
|
{
|
|
using Aes aes = Aes.Create();
|
|
aes.KeySize = KeyByteLength * 8;
|
|
aes.Key = AdjustKeySize(Encoding.UTF8.GetBytes(key), aes.KeySize / 8);
|
|
aes.IV = AdjustKeySize(Encoding.UTF8.GetBytes(iv), aes.BlockSize / 8);
|
|
|
|
ICryptoTransform decryptor = aes.CreateDecryptor(aes.Key, aes.IV);
|
|
|
|
using MemoryStream ms = new(Convert.FromBase64String(cipherText));
|
|
using CryptoStream cs = new(ms, decryptor, CryptoStreamMode.Read);
|
|
using StreamReader sr = new(cs);
|
|
return sr.ReadToEnd();
|
|
}
|
|
|
|
public static EncryptionParameters GenerateParameters()
|
|
{
|
|
using Aes aes = Aes.Create();
|
|
aes.KeySize = KeyByteLength * 8;
|
|
aes.GenerateKey();
|
|
aes.GenerateIV();
|
|
return new EncryptionParameters
|
|
{
|
|
Key = Convert.ToBase64String(aes.Key),
|
|
IV = Convert.ToBase64String(aes.IV)
|
|
};
|
|
}
|
|
|
|
private static byte[] AdjustKeySize(byte[] key, int size)
|
|
{
|
|
if (key.Length < size)
|
|
Array.Resize(ref key, size);
|
|
else if (key.Length > size)
|
|
Array.Resize(ref key, size);
|
|
return key;
|
|
}
|
|
}
|
|
} |