Takip et

Python ve GnuPG ile Kod Doğrulama ve Veri Şifreleme

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ıl

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.

Yorumlar
İçeriği beğendiniz mi? Bir tartışma başlatın veya görüşlerinizi paylaşın.
Yorum Yaz

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

E-posta Bülteni
Yazılım Topluluğuna Katılın
En son güncellemeleri, yaratıcı ipuçlarını ve özel kaynakları doğrudan e-posta kutunuza alın. Tasarım ve inovasyonun geleceğini birlikte keşfedelim.