Gizli Dosyalarınızı Güvenceye Alın: .NET Core ile Şifreleme ve Şifre Çözme İşlemleri

Dijital dünyada güvenli veri saklama, özellikle hassas bilgilerin korunması açısından büyük önem taşır. Dosya şifreleme, verileri güvenli bir şekilde saklamanın ve yetkisiz erişimlerden korumanın en etkili yollarından biridir. Bu makalede, ASP.NET Core ile bir dosyayı yükleyip AES algoritması kullanarak şifreleyecek ve ardından şifresini çözeceğiz. Ayrıca, şifreleme işleminin güvenliği ve bu şifrelemenin ne kadar kırılabilir olduğu hakkında detaylı bilgi vereceğiz.

1. Proje Kurulumu

İlk olarak, yeni bir ASP.NET Core MVC projesi oluşturalım:

dotnet new mvc -n FileUploadEncryptionExample
cd FileUploadEncryptionExample

Bu proje, dosya yükleme, şifreleme ve şifre çözme işlemlerini gerçekleştirmek için kullanılacak.

2. Şifreleme ve Şifre Çözme Yardımcı Sınıfı

AES algoritması ile dosya şifreleme ve şifre çözme işlemlerini gerçekleştirmek için bir yardımcı sınıf oluşturacağız. Bu sınıf, dosya verilerini alarak AES algoritması ile şifreleyecek ve şifre çözme işlemi yapabilecek.

Helpers/FileEncryptionHelper.cs:

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

namespace FileUploadEncryptionExample.Helpers
{
    public class FileEncryptionHelper
    {
        public static byte[] GenerateEncryptionKey()
        {
            using (Aes aes = Aes.Create())
            {
                aes.GenerateKey();
                return aes.Key;
            }
        }

        public static byte[] GenerateEncryptionIV()
        {
            using (Aes aes = Aes.Create())
            {
                aes.GenerateIV();
                return aes.IV;
            }
        }

        public static void EncryptFile(Stream inputFile, string outputFilePath, byte[] key, byte[] iv)
        {
            using (FileStream fileStream = new FileStream(outputFilePath, FileMode.Create))
            using (Aes aes = Aes.Create())
            using (CryptoStream cryptoStream = new CryptoStream(fileStream, aes.CreateEncryptor(key, iv), CryptoStreamMode.Write))
            {
                aes.Key = key;
                aes.IV = iv;

                inputFile.CopyTo(cryptoStream);
            }
        }

        public static void DecryptFile(string inputFilePath, string outputFilePath, byte[] key, byte[] iv)
        {
            using (FileStream fileStream = new FileStream(outputFilePath, FileMode.Create))
            using (Aes aes = Aes.Create())
            using (CryptoStream cryptoStream = new CryptoStream(fileStream, aes.CreateDecryptor(key, iv), CryptoStreamMode.Write))
            {
                aes.Key = key;
                aes.IV = iv;

                using (FileStream inputFileStream = new FileStream(inputFilePath, FileMode.Open))
                {
                    inputFileStream.CopyTo(cryptoStream);
                }
            }
        }
    }
}

Bu sınıf ile:

  • EncryptFile: Dosyayı AES algoritması ile şifreler ve hedef dosya yoluna kaydeder.
  • DecryptFile: Şifrelenmiş dosyanın şifresini çözer ve orijinal verileri geri döndürür.

3. Controller Oluşturma

Controller, dosyayı yükleme, şifreleme ve şifre çözme işlemlerini gerçekleştirecek. Yüklenen dosya, sunucuda şifrelenip kaydedilecek ve şifre çözme işlemi için bir buton sunulacak.

Controllers/FileUploadController.cs:

using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using System.IO;
using System.Threading.Tasks;
using FileUploadEncryptionExample.Helpers;

namespace FileUploadEncryptionExample.Controllers
{
    public class FileUploadController : Controller
    {
        [HttpGet]
        public IActionResult Index()
        {
            return View();
        }

        [HttpPost]
        public async Task<IActionResult> UploadFile(IFormFile file)
        {
            if (file != null && file.Length > 0)
            {
                // Dosyanın şifreleneceği yol
                string uploadPath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "encrypted_files");
                if (!Directory.Exists(uploadPath))
                {
                    Directory.CreateDirectory(uploadPath);
                }

                string encryptedFilePath = Path.Combine(uploadPath, file.FileName + ".enc");

                // Anahtar ve IV oluştur
                byte[] key = FileEncryptionHelper.GenerateEncryptionKey();
                byte[] iv = FileEncryptionHelper.GenerateEncryptionIV();

                // Dosyayı şifrele
                using (var stream = file.OpenReadStream())
                {
                    FileEncryptionHelper.EncryptFile(stream, encryptedFilePath, key, iv);
                }

                ViewBag.Message = "Dosya başarıyla şifrelendi ve kaydedildi!";
                ViewBag.EncryptedFilePath = encryptedFilePath;
                ViewBag.Key = key;
                ViewBag.IV = iv;
                ViewBag.FileName = file.FileName;
            }
            else
            {
                ViewBag.Message = "Lütfen bir dosya seçin!";
            }

            return View("Index");
        }

        [HttpPost]
        public IActionResult DecryptFile(string fileName, byte[] key, byte[] iv)
        {
            string encryptedFilePath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "encrypted_files", fileName + ".enc");
            string decryptedFilePath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "decrypted_files", fileName);

            if (System.IO.File.Exists(encryptedFilePath))
            {
                if (!Directory.Exists(Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "decrypted_files")))
                {
                    Directory.CreateDirectory(Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "decrypted_files"));
                }

                FileEncryptionHelper.DecryptFile(encryptedFilePath, decryptedFilePath, key, iv);

                ViewBag.Message = "Dosya başarıyla çözüldü!";
                ViewBag.DecryptedFilePath = decryptedFilePath;
            }
            else
            {
                ViewBag.Message = "Şifrelenmiş dosya bulunamadı!";
            }

            return View("Index");
        }
    }
}

4. View (Arayüz) Oluşturma

Views/FileUpload/Index.cshtml dosyasına basit bir form ekleyerek dosya yükleme ve şifre çözme işlemlerini yapalım:

@{
    ViewData["Title"] = "Dosya Yükleme, Şifreleme ve Şifre Çözme";
}

<h2>Dosya Yükleme, Şifreleme ve Şifre Çözme</h2>

<form method="post" enctype="multipart/form-data" asp-action="UploadFile" asp-controller="FileUpload">
    <div class="form-group">
        <label for="file">Dosya seçin:</label>
        <input type="file" name="file" id="file" class="form-control" />
    </div>
    <button type="submit" class="btn btn-primary">Yükle ve Şifrele</button>
</form>

@if (ViewBag.Message != null)
{
    <p>@ViewBag.Message</p>
    @if (ViewBag.EncryptedFilePath != null)
    {
        <p>Şifrelenmiş dosya yolu: <strong>@ViewBag.EncryptedFilePath</strong></p>

        <form method="post" asp-action="DecryptFile" asp-controller="FileUpload">
            <input type="hidden" name="fileName" value="@ViewBag.FileName" />
            <input type="hidden" name="key" value="@Convert.ToBase64String(ViewBag.Key)" />
            <input type="hidden" name="iv" value="@Convert.ToBase64String(ViewBag.IV)" />
            <button type="submit" class="btn btn-success">Şifreyi Çöz</button>
        </form>
    }
}

5. Şifreleme Güvenliği: Dosyalar Gerçekten Çözülemez mi?

Dosya şifreleme, AES-256 gibi güçlü bir algoritma kullanıldığında oldukça güvenlidir, ancak bu güvenlik birkaç faktöre bağlıdır:

AES-256'nın Gücü:

AES-256, günümüzde en güvenli simetrik şifreleme algoritmalarından biridir. 256-bit anahtar uzunluğu, günümüz teknolojisi ile brute-force (kaba kuvvet) saldırıları ile kırılması neredeyse imkansızdır. Mevcut hesaplama gücü ile bu şifreyi çözmek milyarlarca yıl sürebilir.

Anahtar ve IV'nin Güvenliği:

Şifreleme sırasında kullanılan anahtar ve IV (Initialization Vector), şifrenin çözülmesini önlemek için kritik öneme sahiptir. Eğer bu değerler ele geçirilirse, şifrelenmiş dosyanın çözülmesi mümkündür. Bu nedenle, anahtar ve IV değerlerinin güvenli bir yerde saklanması gerekir.

Uygulama Güvenliği:

Şifreleme algoritmaları ne kadar güçlü olursa olsun, uygulamanın güvenliği de önemlidir. Anahtarları ve şifreleme parametrelerini güvenli bir şekilde saklamazsanız, sistem açıklarına maruz kalabilir. Anahtarların ve IV'nin uygulama kodunda açık bir şekilde saklanmaması önemlidir.

Sonuç

Bu makalede, .NET Core ile bir dosyanın yüklenip şifrelenmesini ve şifresinin çözülmesini öğrendik. Ayrıca, AES-256 gibi güçlü bir algoritmanın kullanıldığı dosya şifrelemenin güvenliğini de inceledik. AES algoritması doğru uygulandığında çok güvenli bir çözümdür, ancak şifreleme anahtarlarının güvenli bir şekilde saklanması şarttır. Şifreleme anahtarı doğru yönetilirse, dosyalar pratikte kırılması imkansız bir şekilde korunur.

Örnek kodlama: FileUploadEncryptionExample.rar