Siber Güvenlik

İki Faktörlü Kimlik Doğrulama (2FA) Implementasyonu

Fatih Algül
25.03.2026 271 görüntülenme

İki Faktörlü Kimlik Doğrulama Nedir?

İki faktörlü kimlik doğrulama (2FA), kullanıcıların sisteme erişim sağlarken iki farklı doğrulama katmanı kullanmasını gerektiren bir güvenlik mekanizmasıdır. Geleneksel kullanıcı adı ve parola kombinasyonuna ek olarak, kullanıcının kimliğini ikinci bir yöntemle kanıtlaması istenir. Bu yaklaşım, parola çalınsa bile hesabın güvende kalmasını sağlar.

2FA sistemleri genellikle şu üç faktör kategorisinden ikisini birleştirir:

  • Bildiğiniz bir şey: Parola, PIN kodu
  • Sahip olduğunuz bir şey: Telefon, donanım anahtarı, akıllı kart
  • Olduğunuz bir şey: Parmak izi, yüz tanıma, retina taraması

TOTP (Time-Based One-Time Password) Algoritması

En yaygın kullanılan 2FA yöntemi, TOTP (Zamana Dayalı Tek Kullanımlık Parola) algoritmasıdır. RFC 6238 standardında tanımlanan bu yöntem, paylaşılan bir gizli anahtar ve mevcut zaman damgası kullanarak 6 haneli bir kod üretir. Google Authenticator, Authy ve Microsoft Authenticator gibi uygulamalar bu algoritmayı kullanır.

TOTP'nin çalışma prensibi şu şekildedir:

  1. Sunucu, kullanıcı için benzersiz bir gizli anahtar (secret key) üretir
  2. Bu anahtar, QR kodu aracılığıyla kullanıcının authenticator uygulamasına aktarılır
  3. Hem sunucu hem de uygulama, aynı anahtarı ve mevcut zamanı kullanarak aynı kodu üretir
  4. Kodlar varsayılan olarak 30 saniyede bir yenilenir

Python ile TOTP Tabanlı 2FA Implementasyonu

Gerekli Kütüphanelerin Kurulumu

Öncelikle gerekli Python kütüphanelerini yükleyelim:

pip install pyotp qrcode pillow

Gizli Anahtar Üretimi ve QR Kodu Oluşturma

Aşağıdaki kod, kullanıcı için bir gizli anahtar üretir ve bunu QR koduna dönüştürür:

import pyotp import qrcode def generate_2fa_secret(): """Kullanıcı için benzersiz bir TOTP gizli anahtarı üretir.""" secret = pyotp.random_base32() return secret def generate_qr_code(secret, username, issuer="MyApp"): """Authenticator uygulaması için QR kodu oluşturur.""" totp = pyotp.TOTP(secret) provisioning_uri = totp.provisioning_uri( name=username, issuer_name=issuer ) qr = qrcode.make(provisioning_uri) qr.save(f"2fa_qr_{username}.png") return provisioning_uri # Kullanım secret = generate_2fa_secret() uri = generate_qr_code(secret, "kullanici@ornek.com") print(f"Gizli Anahtar: {secret}") print(f"URI: {uri}")

Kod Doğrulama Mekanizması

Kullanıcının girdiği 2FA kodunu doğrulamak için aşağıdaki fonksiyonu kullanabilirsiniz:

def verify_totp(secret, user_code): """Kullanıcının girdiği TOTP kodunu doğrular.""" totp = pyotp.TOTP(secret) return totp.verify(user_code, valid_window=1) # valid_window=1 parametresi, bir önceki ve bir sonraki # zaman dilimindeki kodları da kabul eder. # Bu, saat senkronizasyon farklılıklarını tolere eder.

Flask ile 2FA Entegrasyonu

Aşağıda, Flask web framework'ü kullanarak tam bir 2FA akışı örneği bulunmaktadır:

from flask import Flask, request, session, jsonify import pyotp app = Flask(__name__) app.secret_key = "guclu-bir-secret-key-kullanin" # Üretim ortamında bu bilgiyi veritabanında saklayın user_secrets = {} @app.route("/2fa/setup", methods=["POST"]) def setup_2fa(): username = session.get("username") if not username: return jsonify({"error": "Giriş yapmalısınız"}), 401 secret = pyotp.random_base32() user_secrets[username] = { "secret": secret, "verified": False } totp = pyotp.TOTP(secret) uri = totp.provisioning_uri( name=username, issuer_name="MyApp" ) return jsonify({ "secret": secret, "qr_uri": uri, "message": "QR kodunu tarayın ve doğrulama kodunu girin" }) @app.route("/2fa/verify", methods=["POST"]) def verify_2fa(): username = session.get("username") code = request.json.get("code") if username not in user_secrets: return jsonify({"error": "2FA kurulmamış"}), 400 secret = user_secrets[username]["secret"] totp = pyotp.TOTP(secret) if totp.verify(code, valid_window=1): user_secrets[username]["verified"] = True return jsonify({"message": "2FA başarıyla doğrulandı"}) return jsonify({"error": "Geçersiz kod"}), 401

Veritabanında Gizli Anahtarların Güvenli Saklanması

2FA gizli anahtarlarını veritabanında saklarken mutlaka şifreleme kullanmalısınız. Anahtarlar düz metin olarak saklanmamalıdır; aksi halde veritabanı sızıntısında tüm 2FA koruması anlamsız hale gelir.

from cryptography.fernet import Fernet # Şifreleme anahtarını ortam değişkeninden alın ENCRYPTION_KEY = os.environ["ENCRYPTION_KEY"] cipher = Fernet(ENCRYPTION_KEY) def encrypt_secret(secret): """2FA gizli anahtarını şifreler.""" return cipher.encrypt(secret.encode()).decode() def decrypt_secret(encrypted_secret): """Şifrelenmiş 2FA anahtarını çözer.""" return cipher.decrypt(encrypted_secret.encode()).decode()

Yedek Kurtarma Kodları

Kullanıcıların authenticator uygulamasına erişimini kaybetmesi durumunda, tek kullanımlık kurtarma kodları sağlamak kritik öneme sahiptir:

import secrets def generate_recovery_codes(count=10): """Tek kullanımlık kurtarma kodları üretir.""" codes = [] for _ in range(count): code = secrets.token_hex(4).upper() formatted = f"{code[:4]}-{code[4:]}" codes.append(formatted) return codes # Örnek çıktı: ['A3F1-B2C4', '7E9D-1F0A', ...]

Kurtarma kodlarını veritabanında hash'lenmiş olarak saklayın. Kullanıcı bir kurtarma kodu kullandığında, o kodu geçersiz olarak işaretleyin ve tekrar kullanılmasını engelleyin.

Güvenlik En İyi Uygulamaları

  • Rate Limiting: Brute-force saldırılarını önlemek için doğrulama denemelerini sınırlandırın. Örneğin, 5 başarısız denemeden sonra hesabı geçici olarak kilitleyin.
  • Zaman Penceresi: valid_window parametresini çok geniş tutmayın. 1 veya en fazla 2 değeri yeterlidir.
  • HTTPS Zorunluluğu: 2FA kodları dahil tüm kimlik doğrulama trafiği mutlaka TLS/SSL üzerinden iletilmelidir.
  • Gizli Anahtar Güvenliği: Sunucu tarafında saklanan gizli anahtarları şifrelenmiş biçimde tutun ve erişimi minimum yetkiyle sınırlandırın.
  • Kullanılan Kodları Reddetme: Replay saldırılarını engellemek için daha önce başarıyla kullanılmış bir TOTP kodunu tekrar kabul etmeyin.
  • Oturum Yönetimi: 2FA doğrulaması yapıldıktan sonra oturum kimliğini yenileyin (session fixation saldırılarına karşı koruma).
  • Loglama: Başarılı ve başarısız tüm 2FA denemelerini kayıt altına alın; bu bilgiler güvenlik denetimlerinde kritik önem taşır.

WebAuthn ve FIDO2: Gelecek Nesil 2FA

TOTP tabanlı 2FA güçlü bir çözüm olsa da, WebAuthn/FIDO2 standardı daha modern ve phishing'e karşı dayanıklı bir alternatif sunar. YubiKey gibi donanım güvenlik anahtarları veya cihaz üzerindeki biyometrik sensörler aracılığıyla çalışan bu yöntem, gizli anahtarın hiçbir zaman sunucuya iletilmemesi prensibiyle çalışır. Yeni projelerde TOTP desteğinin yanı sıra WebAuthn desteği de sunmanız önerilir.

Sonuç

İki faktörlü kimlik doğrulama, modern web uygulamalarında artık bir lüks değil, bir zorunluluktur. TOTP tabanlı bir çözümü birkaç saat içinde uygulamanıza entegre edebilirsiniz. Kritik olan, gizli anahtarların güvenli saklanması, kurtarma mekanizmalarının sunulması ve rate limiting gibi ek güvenlik önlemlerinin alınmasıdır. Kullanıcılarınızın hesap güvenliğini sağlamak için bugün 2FA implementasyonuna başlayın.

Yazar Hakkında
Fatih Algül
TechSoft Solutions
Proje mi var?

Yazılım, IoT veya otomasyon konularında destek almak ister misiniz?

İletişime Geç