Python İle Metin Dosyası Şifreleme Aracı Nasıl Yapılır?

Python İle Metin Dosyası Şifreleme Aracı Nasıl Yapılır?
Python İle Metin Dosyası Şifreleme Aracı Nasıl Yapılır?

Ön Hazırlık ve Gereksinimler

Python ile şifreleme işlemleri gerçekleştirmek için standart kütüphanelerin ötesinde, endüstri standardı haline gelmiş cryptography paketine ihtiyacımız vardır. Bu kütüphane, yüksek seviyeli kriptografik tarifler sunarak hata yapma riskinizi minimize eder.

Çalışma ortamınızı hazırlamak için terminalinizde veya komut satırınızda aşağıdaki komutu kullanarak gerekli paketi yükleyin:

pip install cryptography

Bu paket yüklendikten sonra, Python 3.10 ve üzeri sürümlerde projenizi geliştirmeye başlayabilirsiniz. İşletim sistemi bağımsız olarak bu kodlar çalışacaktır; ancak dosya izinlerine dikkat etmeniz gerektiğini unutmayın.

Adım Adım Şifreleme Anahtarı Oluşturma

Şifrelemenin temel taşı, veriyi kilitlemek ve açmak için kullanılan "anahtar"dır. Fernet, simetrik bir şifreleme yöntemidir; yani veriyi şifreleyen anahtar ile verinin şifresini çözen anahtar aynıdır. Bu anahtarı güvenli bir şekilde oluşturup saklamalıyız.

from cryptography.fernet import Fernet

# Yeni bir anahtar üretme
anahtar = Fernet.generate_key()

# Anahtarı bir dosyaya kaydetme (Bunu asla kaybetmemelisiniz!)
with open("gizli.key", "wb") as anahtar_dosyasi:
    anahtar_dosyasi.write(anahtar)

Yukarıdaki kod, gizli.key adında bir dosya oluşturur ve içine rastgele, güvenli bir anahtar yazar. Bu dosya, şifreli dosyalarınızın "kapı anahtarı" olduğu için çok iyi korunmalıdır.

Metin Dosyasını Şifreleme İşlemi

Anahtarımız hazır olduğuna göre, artık bir metin dosyasını şifreleyebiliriz. Şifreleme işlemi, metin verisini okunamaz bir bayt (byte) dizisine dönüştürme sürecidir.

from cryptography.fernet import Fernet

# Anahtarı dosyadan okuma
with open("gizli.key", "rb") as dosya:
    anahtar = dosya.read()

f = Fernet(anahtar)

# Şifrelenecek metin dosyasını oku
with open("mesaj.txt", "rb") as dosya:
    orijinal_veri = dosya.read()

# Veriyi şifrele
sifreli_veri = f.encrypt(orijinal_veri)

# Şifreli veriyi yeni bir dosyaya yaz
with open("mesaj.encrypted", "wb") as dosya:
    dosya.write(sifreli_veri)

Burada encrypt metodu, veriyi Fernet formatına uygun olarak şifreler. .encrypted uzantılı dosya artık içeriği anlaşılamayan bir yapıya bürünmüştür.

Şifreli Dosyanın Şifresini Çözme

Veriye ihtiyaç duyduğunuzda, aynı anahtarı kullanarak şifreyi çözebilirsiniz. Şifre çözme işlemi, şifreli baytları orijinal metin formatına geri döndürür.

from cryptography.fernet import Fernet

with open("gizli.key", "rb") as dosya:
    anahtar = dosya.read()

f = Fernet(anahtar)

# Şifreli dosyayı oku
with open("mesaj.encrypted", "rb") as dosya:
    sifreli_veri = dosya.read()

# Şifreyi çöz
cozulmus_veri = f.decrypt(sifreli_veri)

# Orijinal dosyayı geri yaz
with open("mesaj_cozulmus.txt", "wb") as dosya:
    dosya.write(cozulmus_veri)

decrypt metodu, eğer anahtar doğruysa veriyi başarıyla çözer. Eğer anahtar yanlışsa veya dosya bozulmuşsa, cryptography.fernet.InvalidToken hatası alırsınız.

Şifreleme Yöntemlerinin Karşılaştırılması

Yöntem Avantajı Dezavantajı
Fernet (Simetrik) Hızlı, kullanımı kolay, güvenli Anahtar yönetimi zordur
RSA (Asimetrik) Anahtar paylaşımı kolaydır Çok yavaştır, büyük veri için uygun değil
AES (Ham) Çok yüksek performans Hata yapmaya çok açıktır (Padding hataları)

Güvenlik Uyarıları ve En İyi Pratikler

Kritik Uyarı: Şifreleme anahtarınızı (gizli.key) asla kaynak kodlarınızla (GitHub vb.) paylaşmayın. Anahtarın kaybolması, şifreli verilerin sonsuza kadar erişilemez olması anlamına gelir. Üretim ortamlarında anahtarları ortam değişkenlerinde (environment variables) veya güvenli kasa (HashiCorp Vault vb.) sistemlerinde saklayın.

Yazılım geliştirme sürecinde, kullanıcı girişlerini veya dosyalarını doğrudan şifrelemek yerine, her zaman güncel kütüphaneler kullanın. Kendi şifreleme algoritmanızı yazmaya çalışmak, güvenlik açıklarına davetiye çıkarmaktır.

Sıkça Sorulan Sorular

Şifreleme anahtarımı kaybedersem ne olur?

Şifreleme anahtarı, verinin kilididir. Eğer bu anahtarı kaybederseniz, şifreli veriyi hiçbir şekilde geri döndüremezsiniz. Bu yüzden anahtarın yedeğini güvenli bir yerde tutmanız hayati önem taşır.

Bu yöntemle büyük dosyaları şifreleyebilir miyim?

Fernet, dosyayı belleğe (RAM) yükleyerek şifreler. Çok büyük dosyalarda (örneğin birkaç GB) sistem belleği yetersiz kalabilir. Büyük dosyalar için "chunking" (parçalara bölerek şifreleme) yöntemini kullanmalısınız.

Şifreli dosyanın içeriğini değiştirebilir miyim?

Fernet, "authenticated encryption" (kimlik doğrulamalı şifreleme) kullanır. Eğer şifreli dosya üzerinde tek bir bayt bile değişiklik yaparsanız, şifre çözme işlemi hata verecektir. Bu, verinin bütünlüğünü korur.

Aynı anahtarı her dosya için kullanmalı mıyım?

Pratikte her dosya için farklı bir anahtar veya anahtar türetme fonksiyonu (KDF) kullanmak daha güvenlidir. Ancak basit projelerde tek bir anahtar yönetimi kabul edilebilir.

Bu kodlar web uygulamalarında kullanılabilir mi?

Evet, ancak web uygulamalarında anahtarın sunucu tarafında güvenli bir şekilde saklanması ve asla istemciye (tarayıcıya) gönderilmemesi gerekir.

Performans Optimizasyonu ve Bellek Yönetimi

Küçük metin dosyaları için standart cryptography kütüphanesi oldukça hızlı çalışır. Ancak, birkaç yüz megabaytlık veya gigabaytlık verilerle çalışırken tüm dosyanın belleğe (RAM) yüklenmesi sistemin kilitlenmesine neden olabilir. Bu durumu önlemek için dosyayı parçalar halinde (chunking) okuyup şifrelemek en sağlıklı yöntemdir.

Aşağıdaki örnekte, büyük dosyaları belleği yormadan şifrelemek için kullanılan akış tabanlı bir yaklaşım yer almaktadır:

import os

def encrypt_large_file(file_path, fernet, chunk_size=64*1024):
    output_path = file_path + ".encrypted"
    with open(file_path, 'rb') as infile, open(output_path, 'wb') as outfile:
        while True:
            chunk = infile.read(chunk_size)
            if not chunk:
                break
            # Her parçayı şifreleyip başına uzunluk bilgisini ekleyerek yazıyoruz
            encrypted_chunk = fernet.encrypt(chunk)
            outfile.write(len(encrypted_chunk).to_bytes(4, 'big'))
            outfile.write(encrypted_chunk)

def decrypt_large_file(file_path, fernet):
    output_path = file_path.replace(".encrypted", ".decrypted")
    with open(file_path, 'rb') as infile, open(output_path, 'wb') as outfile:
        while True:
            size_data = infile.read(4)
            if not size_data:
                break
            size = int.from_bytes(size_data, 'big')
            chunk = infile.read(size)
            outfile.write(fernet.decrypt(chunk))

Hata Ayıklama ve Dosya Bütünlüğü Kontrolü

Şifreleme süreçlerinde en sık karşılaşılan hatalar; yanlış anahtar kullanımı, dosyanın yarıda kesilmesi veya dosya izinleridir. Uygulamanızın daha kararlı çalışması için şu hata yakalama mekanizmalarını eklemeniz önerilir:

  • InvalidToken Hatası: Şifre çözme sırasında yanlış anahtar kullanıldığında cryptography.fernet.InvalidToken hatası fırlatılır. Bu hata, kullanıcının yanlış parolayı girdiğini anlamasını sağlar.
  • Dosya İzinleri: try-except blokları ile PermissionError hatalarını yakalayarak kullanıcıya "Dosyaya erişim izni yok" gibi anlamlı geri bildirimler verin.
  • Bütünlük Kontrolü: Şifreli dosyanın bozulup bozulmadığını anlamak için şifreleme öncesi ve sonrası dosya boyutlarını veya SHA-256 hash değerlerini karşılaştırabilirsiniz.
from cryptography.fernet import InvalidToken

try:
    decrypted_data = fernet.decrypt(encrypted_data)
except InvalidToken:
    print("Hata: Şifre çözülemedi. Anahtar yanlış veya dosya bozuk.")
except Exception as e:
    print(f"Beklenmedik bir hata oluştu: {e}")

Bu yöntemleri uygulayarak, basit bir betikten profesyonel bir dosya şifreleme yardımcı programına geçiş yapabilirsiniz. Özellikle büyük dosya yönetimi, uygulamanızın ölçeklenebilirliğini doğrudan etkileyen kritik bir faktördür.

Sonuç

Python ile metin dosyası şifreleme aracı geliştirmek, modern kriptografi kütüphaneleri sayesinde oldukça erişilebilir bir süreçtir. Bu makalede, Fernet protokolü ile güvenli anahtar üretimi, şifreleme ve şifre çözme adımlarını öğrendiniz. Bir sonraki adım olarak, çoklu dosya şifreleme, kullanıcı arayüzü (GUI) ekleme veya dosya parçalama (chunking) tekniklerini araştırarak projenizi profesyonel bir seviyeye taşıyabilirsiniz.

Not: Bu rehberdeki kodlar eğitim amaçlıdır. Ticari veya kritik verileri korumak için profesyonel güvenlik denetimlerinden geçmiş, güncel şifreleme standartlarını uygulayan sistemleri tercih etmelisiniz.

Bu yazıya tepkinizi paylaşın:
Selin Korkmaz

Kendin yap (DIY) projeleri ve evde pratik tamirat üzerine uzmanım. Detaylı rehberlerimle herkesin teknik becerilerini geliştirmesini amaçlıyorum.

Yorumlar (0)

Yorum Yaz