Gereksinimler ve Ön Hazırlık
Python ile bcrypt kütüphanesini kullanmaya başlamadan önce geliştirme ortamınızı hazırlamanız gerekir. Python 3.9 ve üzeri sürümlerle uyumlu olan bcrypt kütüphanesini sisteminize dahil etmek için paket yöneticisi olan pip aracını kullanacağız.
pip install bcrypt
Kurulum tamamlandıktan sonra, kütüphanenin doğru yüklendiğini doğrulamak için Python terminalinde import bcrypt komutunu çalıştırabilirsiniz. Herhangi bir hata almadığınız sürece kütüphane projenizde kullanıma hazırdır.
Adım Adım Parola Hashleme İşlemi
Parola hashleme, kullanıcının girdiği şifreyi geri döndürülemez bir karakter dizisine dönüştürme işlemidir. Bcrypt, bu süreci otomatik olarak yönetir. İlk adımda, bir metin parolasını nasıl güvenli bir hash değerine dönüştüreceğinizi inceleyelim.
import bcrypt
# Kullanıcıdan alınan parola
sifre = "GucluSifre123!".encode('utf-8')
# Salt (tuz) oluşturma ve hashleme
hashlenmis_sifre = bcrypt.hashpw(sifre, bcrypt.gensalt())
print(f"Hashlenmiş değer: {hashlenmis_sifre}")
Yukarıdaki kodda, encode('utf-8') metodu ile string veriyi byte dizisine dönüştürüyoruz. Bcrypt, veriyi işlemek için byte formatına ihtiyaç duyar. bcrypt.gensalt() fonksiyonu ise her seferinde benzersiz bir rastgele değer üreterek, aynı şifrelerin veritabanında farklı hash değerlerine sahip olmasını sağlar.
Hashlenmiş Parolayı Doğrulama
Kullanıcı giriş yapmaya çalıştığında, veritabanındaki hash değeri ile kullanıcının girdiği parolayı karşılaştırmanız gerekir. Bcrypt, bu işlemi checkpw fonksiyonu ile güvenli bir şekilde yapar.
import bcrypt
# Veritabanından gelen hash değeri
veritabanindaki_hash = b'$2b$12$...' # Örnek hash
# Kullanıcının giriş formuna girdiği parola
girilen_sifre = "GucluSifre123!".encode('utf-8')
if bcrypt.checkpw(girilen_sifre, veritabanindaki_hash):
print("Giriş başarılı!")
else:
print("Hatalı parola.")
Bu yöntem, zamanlama saldırılarına (timing attacks) karşı dirençlidir. checkpw fonksiyonu, hash değerinin içindeki tuz bilgisini otomatik olarak okur ve girilen parolayı aynı tuz ile hashleyerek karşılaştırma yapar.
Bcrypt Güvenlik Parametreleri ve Performans
Bcrypt'in en güçlü özelliklerinden biri "cost factor" (maliyet faktörü) parametresidir. Bu değer, algoritmanın ne kadar yavaş çalışacağını belirler. 2026 yılı standartlarına göre bu değeri 12 veya üzerinde tutmak, kaba kuvvet (brute-force) saldırılarına karşı ciddi bir koruma sağlar.
import bcrypt
# 14 maliyet faktörü ile daha güvenli hashleme
salt = bcrypt.gensalt(rounds=14)
hashlenmis_sifre = bcrypt.hashpw(b"GizliSifre", salt)
print(f"Yüksek maliyetli hash: {hashlenmis_sifre}")
Maliyet faktörü yükseldikçe, hashleme işlemi daha fazla CPU kaynağı tüketir. Bu, saldırganların saniyede denediği parola kombinasyonu sayısını dramatik şekilde düşürür.
Güvenlik Karşılaştırma Tablosu
| Yöntem | Güvenlik Seviyesi | Hız | Tavsiye Edilen Kullanım |
|---|---|---|---|
| MD5 / SHA1 | Çok Düşük | Çok Hızlı | Kullanılmamalı |
| SHA-256 | Orta | Hızlı | Dosya bütünlüğü |
| Bcrypt | Çok Yüksek | Ayarlanabilir | Parola depolama |
| Argon2 | En Yüksek | Ayarlanabilir | Modern uygulamalar |
Yaygın Hatalar ve Debug İpuçları
Bcrypt kullanırken yapılan en yaygın hata, byte ve string dönüşümlerini karıştırmaktır. Python 3'te tüm girişler bytes formatında olmalıdır. Ayrıca, veritabanı sütun boyutunu doğru ayarlamak da kritiktir.
# Hatalı kullanım: String gönderimi
# bcrypt.hashpw("sifre", bcrypt.gensalt()) -> Hata verir!
# Doğru kullanım: Bytes gönderimi
sifre = "sifre".encode('utf-8')
hash_degeri = bcrypt.hashpw(sifre, bcrypt.gensalt())
Eğer ValueError alıyorsanız, muhtemelen checkpw fonksiyonuna yanlış formatta bir veri gönderiyorsunuzdur. Her zaman veritabanından çektiğiniz verinin bytes tipinde olduğundan emin olun.
Kritik Güvenlik Uyarısı: Parolaları asla veritabanında düz metin olarak saklamayın. Ayrıca, bcrypt hashlerini asla veritabanı içerisinde başka bir hash algoritması ile (MD5 gibi) tekrar işlemeyin; bu, bcrypt'in sağladığı güvenlik katmanını zayıflatır.
Sıkça Sorulan Sorular
Bcrypt veritabanında ne kadar yer kaplar?
Bcrypt tarafından üretilen hash değerleri sabit uzunluktadır ve genellikle 60 karakterlik bir string olarak saklanır. Veritabanınızda VARCHAR(60) veya CHAR(60) veri tipi kullanmanız yeterlidir.
Aynı şifre için neden her seferinde farklı hash çıkıyor?
Bcrypt, her hashleme işleminde otomatik olarak rastgele bir "salt" değeri üretir. Bu, aynı şifreye sahip iki kullanıcının veritabanında farklı hash değerlerine sahip olmasını sağlar ve "Rainbow Table" saldırılarını imkansız kılar.
Bcrypt mi, Argon2 mi daha iyi?
Argon2, güncel modern standartlarda (2026 itibarıyla) en güvenli algoritma kabul edilir. Ancak Bcrypt, kurulum kolaylığı, yaygınlığı ve yüksek güvenliği ile hala birçok kurumsal Python projesinde standart tercihtir.
Maliyet faktörünü (rounds) kaç yapmalıyım?
Donanımınızın gücüne bağlı olarak 12 ile 14 arası idealdir. Kullanıcı giriş süresinin 0.5 saniyeyi geçmemesi, kullanıcı deneyimi açısından en uygun dengedir.
Hash değerini kaybedersem parolayı geri alabilir miyim?
Hayır, bcrypt tek yönlü (one-way) bir fonksiyondur. Parola hashlenip veritabanına yazıldıktan sonra orijinal metne geri dönüştürülemez. Kullanıcı parolasını unutursa, şifre sıfırlama mekanizması kurmanız gerekir.
Bcrypt ile Parola Güvenliğini Test Etme ve Birim Testleri
Uygulamanızda bcrypt entegrasyonunu tamamladıktan sonra, şifreleme süreçlerinizin beklendiği gibi çalıştığından emin olmak için birim testleri (unit tests) yazmak kritik bir öneme sahiptir. Özellikle rounds değerini değiştirdiğinizde veya farklı karakter setleri (özel karakterler, Unicode) kullandığınızda sistemin kararlılığını test etmelisiniz.
Aşağıdaki örnek, Python'un yerleşik unittest kütüphanesini kullanarak parola doğrulama mekanizmasını nasıl test edebileceğinizi göstermektedir:
import unittest
import bcrypt
class TestPasswordSecurity(unittest.TestCase):
def test_password_hashing_and_verification(self):
password = "GüvenliSifre123!"
password_bytes = password.encode('utf-8')
# Hash oluşturma
hashed = bcrypt.hashpw(password_bytes, bcrypt.gensalt(rounds=12))
# Doğrulama testi
self.assertTrue(bcrypt.checkpw(password_bytes, hashed))
# Yanlış parola testi
wrong_password = "YanlisSifre".encode('utf-8')
self.assertFalse(bcrypt.checkpw(wrong_password, hashed))
if __name__ == '__main__':
unittest.main()
Üretim Ortamında (Deployment) Performans Optimizasyonu
Bcrypt, hesaplama maliyeti yüksek (CPU-intensive) bir algoritma olduğu için, yüksek trafikli uygulamalarda sunucu kaynaklarını tüketebilir. Üretim ortamına geçerken dikkat etmeniz gereken bazı temel stratejiler şunlardır:
- Asenkron İşleme: Eğer uygulamanız FastAPI veya Sanic gibi asenkron bir framework kullanıyorsa, bcrypt işlemlerini ana event loop'u bloklamamak için
run_in_executorile ayrı bir thread içinde çalıştırmalısınız. - Maliyet Faktörü Dengesi:
roundsdeğerini 12'nin üzerine çıkarmak, güvenlik artışından ziyade sunucu tepki süresinde (latency) ciddi artışlara neden olur. 10 ile 12 arasındaki bir değer, çoğu modern sunucu için idealdir. - Rate Limiting: Bir saldırganın brute-force denemeleriyle sunucunuzu yormasını engellemek için, giriş denemelerine hız sınırlaması (rate limiting) getirin.
Aşağıda, asenkron bir yapıda bcrypt işlemini bloklamadan nasıl çalıştırabileceğinize dair bir örnek bulunmaktadır:
import asyncio
import bcrypt
from concurrent.futures import ThreadPoolExecutor
executor = ThreadPoolExecutor()
async def hash_password_async(password: str):
loop = asyncio.get_event_loop()
# İşlemi thread pool üzerinde çalıştırarak ana döngüyü koruruz
hashed = await loop.run_in_executor(
executor,
lambda: bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt(12))
)
return hashed
Parola Güvenliği İçin İleri İpuçları
Bcrypt kullanımı tek başına yeterli değildir; kullanıcıların parola seçimi konusunda eğitilmesi ve sistemin daha katı kurallar ile korunması gerekir:
- Parola Uzunluğu Sınırı: Bcrypt, 72 bayttan uzun parolaları kırpar. Bu nedenle, kullanıcılarınızın 72 karakterden uzun parolalar girmesini engellemek veya bu durumu bir ön işlemle yönetmek, tutarsızlıkları önler.
- Sızdırılmış Parola Kontrolü: Kullanıcı şifre belirlerken, "Have I Been Pwned" gibi veritabanlarını API aracılığıyla sorgulayarak, daha önce sızdırılmış parolaların kullanılmasını engelleyebilirsiniz.
- Pepper Kullanımı: Bcrypt'in kendi tuzuna (salt) ek olarak, veritabanı dışında bir ortam değişkeninde (environment variable) saklanan "pepper" adı verilen bir anahtar ile parolayı hashlemeden önce birleştirmeniz, veritabanı sızıntılarına karşı ekstra bir savunma katmanı oluşturur.
Sonuç
Python ile bcrypt kullanarak kullanıcı şifreleme, bir web uygulamasının güvenliğini sağlamak için atılabilecek en önemli adımdır. Bu rehberde öğrendiğiniz tuzlama, maliyet faktörü ve doğru byte dönüşümleri, uygulamanızı dış saldırılara karşı koruyacaktır. Bir sonraki adım olarak, uygulamalarınızda parola sıfırlama süreçlerini güvenli bir şekilde yönetmek için e-posta doğrulama ve geçici token sistemlerini inceleyebilirsiniz.
Sorumluluk Reddi: Bu makalede paylaşılan kodlar eğitim amaçlıdır. Yazılım güvenliği, sadece parola hashleme ile sınırlı değildir; SQL Injection, XSS ve CSRF gibi diğer saldırı vektörlerine karşı da ek önlemler almanız ve güncel güvenlik kütüphanelerini takip etmeniz önerilir.

Yorumlar (0)
Yorum Yaz