Am creat un serviciu de criptare folosind AES-GCM pentru a cripta datele sensibile din baza de date. În primul rând, generez o cheie criptografică dintr-o parolă (probabil va fi stocată în Kubernetes Secrets) utilizând Rfc2898DeriveBytes. Apoi treceți această cheie instanței AesGcm.Puteți găsi implementarea mai jos.
CryptoService de clasă publică: ICryptoService, IDisposable
{
    private readonly AesGcm _aesGcm;
    CryptoService public (parolă șir, sare de șir)
    {
        cheie byte[] = Rfc2898DeriveBytes nou(parolă, Encoding.UTF8.GetBytes(sare), 200000, HashAlgorithmName.SHA512).GetBytes(32);
        
        //Obține cheia de criptare a datelor criptate generată aleatoriu în siguranță din Azure Vault.
        string encryptedEncryptionKey = AzureVault.GetDataEncryptionKey();
        byte[] encryptionKey = AzureVault.Decrypt(encryptedEncryptionKey, cheie);
        _aesGcm = AesGcm nou(encryptionKey);
    }
    șir public Encrypt(string plainText)
    {
        byte[] plainBytes = Encoding.UTF8.GetBytes(plainText);
        int nonceSize = AesGcm.NonceByteSizes.MaxSize;
        int tagSize = AesGcm.TagByteSizes.MaxSize;
        int cipherSize = plainBytes.Length;
        // Combinați pentru o codificare mai ușoară
        int encryptedDataLength = 4 + nonceSize + 4 + tagSize + cipherSize;
        Span<byte> encryptedData = encryptedDataLength < 1024 ? stackalloc byte[encryptedDataLength] : octet nou[encryptedDataLength].AsSpan();
        BinaryPrimitives.WriteInt32LittleEndian(encryptedData.Slice(0, 4), nonceSize);
        BinaryPrimitives.WriteInt32LittleEndian(encryptedData.Slice(4 + nonceSize, 4), tagSize);
        var nonce = encryptedData.Slice(4, nonceSize);
        var tag = encryptedData.Slice(4 + nonceSize + 4, tagSize);
        var cipherBytes = encryptedData.Slice(4 + nonceSize + 4 + tagSize, cipherSize);
        RandomNumberGenerator.Fill(nonce);
        _aesGcm.Encrypt(nonce, plainBytes.AsSpan(), cipherBytes, tag);
        return Convert.ToBase64String(encryptedData);
    }   
    șir public Decriptare (șir cipherText)
    {
        Span<byte> encryptedData = Convert.FromBase64String(cipherText).AsSpan();
        int nonceSize = BinaryPrimitives.ReadInt32LittleEndian(encryptedData.Slice(0, 4));
        int tagSize = BinaryPrimitives.ReadInt32LittleEndian(encryptedData.Slice(4 + nonceSize, 4));
        int cipherSize = encryptedData.Length - 4 - nonceSize - 4 - tagSize;
        var nonce = encryptedData.Slice(4, nonceSize);
        var tag = encryptedData.Slice(4 + nonceSize + 4, tagSize);
        var cipherBytes = encryptedData.Slice(4 + nonceSize + 4 + tagSize, cipherSize);
        Span<octet> plainBytes = cipherSize < 1024 ? stackalloc byte[cipherSize] : octet nou[cipherSize];
        _aesGcm.Decrypt(nonce, cipherBytes, tag, plainBytes);
        return Encoding.UTF8.GetString(plainBytes);
    }    
}
Iată întrebarea mea. Mă întreb dacă această implementare este suficient de sigură, deoarece nu sunt un expert în securitate. Îmi lipsește un punct sau o gaură de securitate, cu excepția siguranței parolei? Orice sfat și sugestie ar fi foarte apreciat.
Mulțumiri.