Python ve GnuPG ile Kod Doğrulama ve Veri Şifreleme
Günümüz dijital dünyasında veri güvenliği ve bütünlüğü, hem bireysel kullanıcılar hem de kurumsal yapılar için vazgeçilmez bir öneme sahiptir. Hassas bilgilerin korunması, iletişim gizliliğinin sağlanması ve yazılımın güvenilirliğinin doğrulanması, siber güvenlik stratejilerinin temel taşlarını oluşturur. Bu bağlamda, açık kaynaklı bir şifreleme aracı olan GNU Privacy Guard (GnuPG veya GPG) ve onun Python arayüzü python-gnupg kütüphanesi, geliştiricilere güçlü ve esnek çözümler sunar.
Bu rehberde, Python 3 ve python-gnupg kütüphanesini kullanarak verileri nasıl şifreleyeceğimizi, şifresini nasıl çözeceğimizi ve kod veya dosyaların dijital imzalarını nasıl doğrulayacağımızı adım adım inceleyeceğiz. Amacımız, uygulamalarınızda güvenlik katmanını artırmak için pratik bilgiler ve kod örnekleri sunmaktır.
GnuPG ve Python-GnuPG ile Kurulum ve Temel Hazırlıklar
GnuPG, OpenPGP standardının bir uygulaması olup, e-posta, dosya ve disk bölümlerini şifrelemek, imzalamak ve doğrulamak için kullanılır. python-gnupg ise, Python uygulamalarınızın GnuPG komut satırı aracıyla etkileşim kurmasını sağlayan bir arayüz kütüphanesidir. Başlamadan önce, sistemimizde GnuPG’nin kurulu olduğundan ve Python kütüphanesine sahip olduğumuzdan emin olmalıyız.
GnuPG Kurulumu
GnuPG, çoğu işletim sisteminde kolayca kurulabilir.
* Linux (Debian/Ubuntu tabanlı):
sudo apt update
sudo apt install gnupg
* Linux (Fedora/CentOS tabanlı):
sudo dnf install gnupg
* macOS:
brew install gnupg
* Windows:
GnuPG’nin resmi web sitesinden (gnupg.org) Windows yükleyicisini indirip kurabilirsiniz.
Kurulumdan sonra, terminalinizde gpg --version komutunu çalıştırarak GnuPG’nin doğru şekilde kurulup kurulmadığını kontrol edebilirsiniz.
Python-GnuPG Kütüphanesi Kurulumu
Python ortamınızda python-gnupg kütüphanesini kurmak için pip kullanabilirsiniz:
pip install python-gnupg
GnuPG Anahtar Çifti Oluşturma
Şifreleme ve imzalama işlemleri için bir anahtar çiftine (genel ve özel anahtar) ihtiyacımız olacak. Eğer daha önce bir GPG anahtarınız yoksa, aşağıdaki komutla oluşturabilirsiniz:
gpg --full-generate-key
Bu komut, anahtar türü, anahtar boyutu, son kullanma tarihi, adınız, e-posta adresiniz gibi bilgileri girmenizi isteyecektir. Güvenli bir parola (passphrase) belirlemeyi unutmayın; bu parola, özel anahtarınızı kullanırken gerekli olacaktır.
Oluşturduğunuz anahtarları listelemek için:
gpg --list-keys
Çıktıda anahtarınızın parmak izini (fingerprint) ve anahtar kimliğini (key ID) göreceksiniz. Bu bilgiler, şifreleme ve imzalama işlemlerinde kullanılacaktır.
Örnek bir anahtar listesi çıktısı:
/home/kullanici/.gnupg/pubring.kbx
----------------------------------
pub rsa4096 2023-10-27 [SC]
ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEF
uid [ultimate] Kullanıcı Adı
sub rsa4096 2023-10-27 [E]
Buradaki ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEF sizin anahtar parmak izinizdir. Anahtar kimliği genellikle parmak izinin son 8 veya 16 karakteridir.
Veri Şifreleme ve Şifre Çözme
Asimetrik şifreleme, iki anahtarın kullanıldığı bir yöntemdir: genel anahtar (public key) ve özel anahtar (private key). Genel anahtar herkesle paylaşılabilir ve veriyi şifrelemek için kullanılır. Özel anahtar ise sadece sahibinde kalır ve şifrelenmiş veriyi çözmek için kullanılır. python-gnupg bu süreci Python üzerinden yönetmenizi sağlar.
Metin Şifreleme
Bir metni şifrelemek için, alıcının genel anahtarına ihtiyacımız vardır. Alıcının genel anahtarı yerel anahtar halkamızda (keyring) olmalıdır. Eğer alıcının genel anahtarı yoksa, onu anahtar sunucularından (gpg --recv-keys ) veya doğrudan alıcıdan alıp içe aktarmanız (gpg --import ) gerekir.
import gnupg
GnuPG anahtar halkasının yolunu belirtin (varsayılan genellikle yeterlidir)
gpg = gnupg.GPG(gnupghome='/home/kullanici/.gnupg')
Alıcının anahtar kimliği (örneğin, kendi anahtarınızın kimliği)
Anahtar kimliğini 'gpg --list-keys' komutuyla bulabilirsiniz.
recipient_key_id = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEF" # Kendi anahtar parmak izinizi buraya yazın
Şifrelenecek metin
plaintext = "Bu çok gizli bir mesajdır ve sadece yetkili kişiler tarafından okunmalıdır."
Metni şifrele
'recipients' listesine şifrelemek istediğiniz anahtarların kimliklerini ekleyin.
Bu anahtarların genel anahtarları yerel anahtar halkasında bulunmalıdır.
encrypted_data = gpg.encrypt(plaintext, recipients=[recipient_key_id])
if encrypted_data.ok:
print("Şifreleme başarılı.")
print("Şifrelenmiş Metin:")
print(str(encrypted_data))
else:
print("Şifreleme başarısız oldu:", encrypted_data.status)
print("Hata mesajı:", encrypted_data.stderr)
Örnek Çıktı:
Şifreleme başarılı.
Şifrelenmiş Metin:
-----BEGIN PGP MESSAGE-----
... (şifrelenmiş metin) ...
-----END PGP MESSAGE-----
Dosya Şifreleme
Büyük miktarda veriyi veya dosyaları şifrelemek için encrypt_file metodunu kullanırız.
import gnupg
gpg = gnupg.GPG(gnupghome='/home/kullanici/.gnupg')
recipient_key_id = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEF" # Kendi anahtar parmak izinizi buraya yazın
Şifrelenecek örnek bir dosya oluşturalım
with open('gizli_belge.txt', 'w') as f:
f.write("Bu belge çok önemli veriler içeriyor.")
Dosyayı şifrele
with open('gizli_belge.txt', 'rb') as f:
# output parametresi ile şifrelenmiş çıktının yazılacağı dosyayı belirtiyoruz.
status = gpg.encrypt_file(f, recipients=[recipient_key_id], output='gizli_belge.txt.gpg')
if status.ok:
print("Dosya şifreleme başarılı.")
print(f"Şifrelenmiş dosya: {status.file_name}")
else:
print("Dosya şifreleme başarısız oldu:", status.status)
print("Hata mesajı:", status.stderr)
Şifre Çözme
Şifrelenmiş bir metni veya dosyayı çözmek için, ilgili özel anahtarın yerel anahtar halkasında olması ve özel anahtarın parolasının bilinmesi gerekir. python-gnupg, parolanızı doğrudan koda gömmenize veya GnuPG ajanının parola istemesini beklemenize olanak tanır. Güvenlik nedeniyle, parolayı doğrudan koda gömmek yerine GnuPG ajanı tarafından yönetilmesini sağlamak daha iyidir.
import gnupg
gpg = gnupg.GPG(gnupghome='/home/kullanici/.gnupg')
Örnek şifrelenmiş metin (yukarıdaki örnekten alınmıştır)
Bu kısım, şifrelenmiş_data değişkeninden veya bir dosyadan okunabilir.
encrypted_text_example = """-----BEGIN PGP MESSAGE-----
... (buraya şifrelenmiş metni yapıştırın) ...
-----END PGP MESSAGE-----"""
Metin şifre çözme
GnuPG ajanı parola isteyebilir veya 'passphrase' parametresi ile doğrudan parola verilebilir.
Güvenlik nedeniyle, 'passphrase' parametresini kullanırken dikkatli olun.
decrypted_data = gpg.decrypt(encrypted_text_example) # veya passphrase='sizin_parolanız'
if decrypted_data.ok:
print("Şifre çözme başarılı.")
print("Çözülmüş Metin:")
print(str(decrypted_data))
else:
print("Şifre çözme başarısız oldu:", decrypted_data.status)
print("Hata mesajı:", decrypted_data.stderr)
Dosya şifre çözme
with open('gizli_belge.txt.gpg', 'rb') as f:
decrypted_file = gpg.decrypt_file(f, output='cozulmus_belge.txt') # veya passphrase='sizin_parolanız'
if decrypted_file.ok:
print("Dosya şifre çözme başarılı.")
print(f"Çözülmüş dosya: {decrypted_file.file_name}")
with open('cozulmus_belge.txt', 'r') as f:
print("İçerik:", f.read())
else:
print("Dosya şifre çözme başarısız oldu:", decrypted_file.status)
print("Hata mesajı:", decrypted_file.stderr)
Kod/Dosya Doğrulama ve İmzalama
Dijital imzalar, bir dosyanın veya kod parçasının belirli bir kişi veya varlık tarafından oluşturulduğunu ve içeriğinin değiştirilmediğini doğrulamak için kullanılır. Bu, yazılım güncellemelerinin veya önemli belgelerin güvenilirliğini sağlamak açısından kritik öneme sahiptir.
Dosya İmzalama
Bir dosyayı imzalamak için, imzalayanın özel anahtarına ihtiyacımız vardır.
import gnupg
gpg = gnupg.GPG(gnupghome='/home/kullanici/.gnupg')
signing_key_id = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEF" # Kendi anahtar parmak izinizi buraya yazın
İmzalanacak örnek bir dosya oluşturalım
with open('kaynak_kod.py', 'w') as f:
f.write("print('Merhaba, dünya!')\n")
f.write("def topla(a, b): return a + b\n")
Dosyayı ayrık (detached) bir imza ile imzala
Ayrık imza, orijinal dosyanın kendisini değiştirmeden ayrı bir .sig dosyası oluşturur.
with open('kaynak_kod.py', 'rb') as f:
status = gpg.sign_file(f, keyid=signing_key_id, detach=True, output='kaynak_kod.py.sig')
if status.ok:
print("Dosya imzalama başarılı.")
print(f"İmza dosyası: {status.file_name}")
else:
print("Dosya imzalama başarısız oldu:", status.status)
print("Hata mesajı:", status.stderr)
clearsign=True parametresi ile imzanın orijinal metinle birlikte, okunabilir bir formatta olduğu bir “clear-signed” dosya da oluşturulabilir. Ancak, genellikle kod ve ikili dosyalar için ayrık imzalar tercih edilir.
İmza Doğrulama
Bir dosyanın imzasını doğrulamak için, imzalayanın genel anahtarının yerel anahtar halkamızda bulunması gerekir.
import gnupg
gpg = gnupg.GPG(gnupghome='/home/kullanici/.gnupg')
Doğrulanacak dosya ve imza dosyası
original_file = 'kaynak_kod.py'
signature_file = 'kaynak_kod.py.sig'
İmza doğrulama
with open(original_file, 'rb') as f_original:
with open(signature_file, 'rb') as f_signature:
# verify_file metoduna hem orijinal dosyayı hem de imza dosyasını veriyoruz.
# GnuPG, imzalayanın genel anahtarını otomatik olarak arayacaktır.
verify_result = gpg.verify_file(f_original, f_signature)
if verify_result.valid:
print("İmza doğrulama başarılı!")
print(f"İmzalayan: {verify_result.username}")
print(f"Parmak İzi: {verify_result.fingerprint}")
print(f"Durum: {verify_result.status}")
# 'trust_level' ve 'sig_class' gibi diğer özellikleri de kontrol edilebilir.
else:
print("İmza doğrulama başarısız veya geçersiz.")
print(f"Durum: {verify_result.status}")
print(f"Hata mesajı: {verify_result.stderr}")
if verify_result.fingerprint:
print(f"İmzalayanın parmak izi: {verify_result.fingerprint}")
print("Bu anahtarın yerel anahtar halkasında güvenilir olarak işaretlenip işaretlenmediğini kontrol edin.")
else:
print("İmzalayanın genel anahtarı bulunamadı veya içe aktarılmadı.")
verify_result nesnesi, imzanın geçerliliği (valid özelliği), imzalayanın kullanıcı adı, parmak izi ve doğrulama durumu gibi önemli bilgiler içerir. status özelliği, imzanın geçerli olup olmadığını (örneğin, ‘signature valid’), veya neden geçersiz olduğunu (örneğin, ‘bad signature’) belirtir.
Güven Modeli (Web of Trust): GnuPG, anahtarların güvenilirliğini doğrulamak için bir “güven ağı” (Web of Trust) kullanır. Bir anahtarın sadece var olması değil, aynı zamanda sizin veya güvendiğiniz başka bir anahtar tarafından da onaylanmış olması önemlidir. Bu, sahte anahtarlara karşı koruma sağlar. Yeni bir genel anahtarı içe aktardığınızda, onu manuel olarak imzalamanız veya güven düzeyini ayarlamanız gerekebilir.
Sonuç ve Sıkça Sorulan Sorular (SSS)
Bu rehberde, Python’ın python-gnupg kütüphanesini kullanarak GnuPG’nin temel şifreleme, şifre çözme, imzalama ve doğrulama yeteneklerini nasıl kullanacağınızı öğrendiniz. Bu araçlar, yazılım geliştirme, güvenli iletişim ve veri depolama gibi birçok alanda uygulamalarınızın güvenlik seviyesini önemli ölçüde artırmanıza yardımcı olabilir. Veri bütünlüğünü sağlamak ve hassas bilgilerin gizliliğini korumak için GnuPG gibi güçlü şifreleme araçlarını kullanmak, modern yazılım geliştirmenin ayrılmaz bir parçasıdır.
Sıkça Sorulan Sorular (SSS)
1. GnuPG anahtarlarımı nasıl yedeklerim?
Özel anahtarlarınızı yedeklemek hayati öneme sahiptir. Özel anahtarınızı kaybetmeniz durumunda, onunla şifrelenmiş verilere veya imzalanmış dosyalara erişiminizi kaybedersiniz. Özel anahtarınızı dışa aktarmak için:
gpg --armor --export-secret-keys > ozel_anahtarim.asc
Bu dosyayı güvenli bir yerde saklayın (örneğin, şifreli bir USB sürücüde veya güvenli bulut depolama alanında). Genel anahtarınızı dışa aktarmak için ise:
gpg --armor --export > genel_anahtarim.asc
2. GnuPG özel anahtarımın parolasını unutursam ne olur?
Maalesef, özel anahtarınızın parolasını unutmanız durumunda, anahtarınızı kullanmanız mümkün olmaz. GnuPG’de parolayı kurtarmanın bir yolu yoktur. Bu nedenle, anahtarınızı oluştururken seçtiğiniz parolayı güvenli bir şekilde saklamanız ve unutmamanız çok önemlidir. Parolayı unuttuysanız, yeni bir anahtar çifti oluşturmanız gerekecektir.
3. Genel anahtarımı anahtar sunucusuna nasıl yüklerim?
Genel anahtarınızı bir anahtar sunucusuna yüklemek, diğer kişilerin anahtarınızı kolayca bulup sizinle şifreli iletişim kurmasını veya imzalarınızı doğrulamasını sağlar.
gpg --send-keys
Bu komut, anahtarınızı varsayılan OpenPGP anahtar sunucusuna yükler.
4. python-gnupg yerine başka Python GPG kütüphaneleri var mı?
Evet, python-gnupg en yaygın ve olgun kütüphanelerden biridir. Ancak, daha düşük seviyeli kriptografik işlemleri veya farklı OpenPGP kütüphanelerini kullanan başka alternatifler de olabilir. Ancak, GnuPG’nin güvenilirliği ve geniş kullanımı göz önüne alındığında, python-gnupg çoğu kullanım durumu için mükemmel bir seçimdir.
5. GnuPG ile simetrik şifreleme yapabilir miyim?
Evet, GnuPG asimetrik şifrelemenin yanı sıra simetrik şifrelemeyi de destekler. Simetrik şifrelemede, hem şifreleme hem de şifre çözme için tek bir anahtar (veya parola) kullanılır. python-gnupg ile doğrudan simetrik şifreleme yapmak için gpg.encrypt metodunu recipients parametresi olmadan ve passphrase parametresiyle kullanabilirsiniz. Ancak genellikle GnuPG, anahtar yönetimi ve güven modeli nedeniyle asimetrik şifreleme için tercih edilirken, simetrik şifreleme daha çok yerel dosya şifrelemesi gibi durumlar için kullanılır.