C# dilinde şifreleme ve veri güvenliği, uygulamaların güvenli veri işleme yapabilmesi için hayati öneme sahiptir. Özellikle kullanıcı bilgileri, parolalar ve hassas verilerin korunması gereken durumlarda, .NET Framework ve .NET Core içerisinde bulunan kriptografi kütüphaneleri büyük kolaylık sağlar. Bu makalede, C# kullanarak veri güvenliğini nasıl sağlayacağınızı, temel şifreleme yöntemlerini ve bunların uygulamalı örneklerini adım adım inceleyeceğiz.

C# Şifreleme Temelleri

C#’da şifreleme işlemleri genellikle System.Security.Cryptography namespace’i altında yer alan sınıflar ile yapılır. Bu namespace içerisinde simetrik ve asimetrik şifreleme, hash fonksiyonları, dijital imzalar gibi pek çok güvenli veri işleme yöntemi bulunur.

Simetrik Şifreleme

Simetrik şifreleme, aynı anahtarın hem şifreleme hem de şifre çözme işlemlerinde kullanılmasıdır. C#’da bu işlem için genellikle AES (Advanced Encryption Standard) algoritması kullanılır.

AES Şifreleme Örneği

using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;

public class AesEncryption
{
    public static byte[] Encrypt(string plainText, byte[] key, byte[] iv)
    {
        using (Aes aes = Aes.Create())
        {
            aes.Key = key;
            aes.IV = iv;

            ICryptoTransform encryptor = aes.CreateEncryptor(aes.Key, aes.IV);

            using (MemoryStream ms = new MemoryStream())
            {
                using (CryptoStream cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write))
                {
                    using (StreamWriter sw = new StreamWriter(cs))
                    {
                        sw.Write(plainText);
                    }
                    return ms.ToArray();
                }
            }
        }
    }

    public static string Decrypt(byte[] cipherText, byte[] key, byte[] iv)
    {
        using (Aes aes = Aes.Create())
        {
            aes.Key = key;
            aes.IV = iv;

            ICryptoTransform decryptor = aes.CreateDecryptor(aes.Key, aes.IV);

            using (MemoryStream ms = new MemoryStream(cipherText))
            {
                using (CryptoStream cs = new CryptoStream(ms, decryptor, CryptoStreamMode.Read))
                {
                    using (StreamReader sr = new StreamReader(cs))
                    {
                        return sr.ReadToEnd();
                    }
                }
            }
        }
    }
}

Asimetrik Şifreleme

Asimetrik şifrelemede iki anahtar kullanılır: biri herkese açık (public key), diğeri gizli (private key). C#’da bu tür işlemler RSA sınıfı ile gerçekleştirilir. RSA hem veri şifreleme hem de dijital imza için kullanılabilir.

RSA Şifreleme ve Deşifreleme Örneği

using System;
using System.Security.Cryptography;
using System.Text;

public class RsaEncryption
{
    public static void EncryptAndDecryptExample()
    {
        using (RSA rsa = RSA.Create())
        {
            string original = "Bu gizli bir mesajdır.";
            byte[] data = Encoding.UTF8.GetBytes(original);

            // Şifreleme
            byte[] encrypted = rsa.Encrypt(data, RSAEncryptionPadding.Pkcs1);

            // Deşifreleme
            byte[] decrypted = rsa.Decrypt(encrypted, RSAEncryptionPadding.Pkcs1);
            string decryptedString = Encoding.UTF8.GetString(decrypted);

            Console.WriteLine($"Orijinal: {original}");
            Console.WriteLine($"Şifreli: {Convert.ToBase64String(encrypted)}");
            Console.WriteLine($"Çözülmüş: {decryptedString}");
        }
    }
}

Hash Fonksiyonları

Veri bütünlüğünü kontrol etmek ve parolaları güvenli şekilde saklamak için hash fonksiyonları kullanılır. C#’da en yaygın kullanılan hash algoritmaları SHA256 ve MD5‘dir. Ancak güvenlik açısından MD5 artık önerilmemektedir.

SHA256 ile Hash Oluşturma

using System;
using System.Security.Cryptography;
using System.Text;

public class HashingExample
{
    public static string ComputeSha256Hash(string rawData)
    {
        using (SHA256 sha256Hash = SHA256.Create())
        {
            byte[] bytes = sha256Hash.ComputeHash(Encoding.UTF8.GetBytes(rawData));

            StringBuilder builder = new StringBuilder();
            for (int i = 0; i < bytes.Length; i++)
            {
                builder.Append(bytes[i].ToString("x2"));
            }
            return builder.ToString();
        }
    }
}

Parola Güvenliği

Parolalar veritabanında düz metin olarak saklanmamalıdır. Bunun yerine, parolalar güvenli hash algoritmalarıyla (örneğin PBKDF2) işlenerek saklanmalıdır. C#’da bu işlem için Rfc2898DeriveBytes sınıfı kullanılır.

PBKDF2 ile Parola Hashleme

using System;
using System.Security.Cryptography;
using System.Text;

public class PasswordHasher
{
    public static string HashPassword(string password)
    {
        byte[] salt;
        byte[] buffer2;
        using (Rfc2898DeriveBytes bytes = new Rfc2898DeriveBytes(password, 0x10, 0x3e8, HashAlgorithmName.SHA256))
        {
            salt = bytes.Salt;
            buffer2 = bytes.GetBytes(0x20);
        }
        byte[] dst = new byte[0x31];
        Buffer.BlockCopy(salt, 0, dst, 1, 0x10);
        Buffer.BlockCopy(buffer2, 0, dst, 0x11, 0x20);
        return Convert.ToBase64String(dst);
    }

    public static bool VerifyPassword(string password, string hashedPassword)
    {
        byte[] buffer4 = Convert.FromBase64String(hashedPassword);
        byte[] dst = new byte[0x10];
        Buffer.BlockCopy(buffer4, 1, dst, 0, 0x10);
        byte[] buffer2 = new byte[0x20];
        Buffer.BlockCopy(buffer4, 0x11, buffer2, 0, 0x20);

        using (Rfc2898DeriveBytes bytes = new Rfc2898DeriveBytes(password, dst, 0x3e8, HashAlgorithmName.SHA256))
        {
            byte[] buffer3 = bytes.GetBytes(0x20);
            return buffer3.SequenceEqual(buffer2);
        }
    }
}

Veri Güvenliği İçin En İyi Uygulamalar

  • AES gibi güçlü simetrik şifreleme algoritmalarını kullanın.
  • RSA gibi asimetrik algoritmalar ile anahtar paylaşımını güvenli hale getirin.
  • Parolaları asla düz metin olarak saklamayın; PBKDF2, bcrypt veya scrypt gibi güçlü hash fonksiyonlarını kullanın.
  • Her şifreleme işlemi için farklı IV (Initialization Vector) kullanın.
  • Hash doğrulamalarında zaman-sabit karşılaştırma (timing-safe comparison) kullanarak saldırıları engelleyin.

Sonuç

C# dilinde şifreleme ve veri güvenliği işlemleri, doğru araçlar ve yöntemler kullanılarak oldukça güvenli hale getirilebilir. AES, RSA ve SHA256 gibi algoritmalar, verilerinizi korumak için güçlü birer seçenektir. Özellikle parola saklama, veri bütünlüğü ve güvenli veri aktarımı gibi işlemler için bu yöntemlerin bilinçli ve doğru bir şekilde kullanılması, uygulamaların siber tehditlere karşı direncini artırır.

Bir önceki yazımız olan Print Screen Engelleme başlıklı makalemizde Engelleme, İşletim Sistemi ve key logger hakkında bilgiler verilmektedir.