2FA (Two-Factor Authentication)
Güvenlik konularını detaylıca ele almak ve yazılım projelerinde uygulanabilir çözümler sunmak amacıyla hazırlanmıştır.
2FA Nedir ve Neden Gereklidir?
İki Faktörlü Kimlik Doğrulama (2FA), kullanıcıların hesap güvenliğini artırmak için iki farklı doğrulama katmanı kullanmasını gerektiren bir yöntemdir.
Bu iki faktör genellikle şunlardan seçilir:
1. Bildiğiniz bir şey: Parola, PIN.
2. Sahip olduğunuz bir şey: Mobil cihaz, donanım anahtarı.
3. Size ait bir şey: Parmak izi, yüz tanıma.
Örnek Senaryo:
- Bir kullanıcı, bankacılık uygulamasına giriş yaparken önce parolasını girer. Daha sonra telefonuna gönderilen bir doğrulama kodunu girerek girişini tamamlar.
2FA Çözümleri
1. SMS Tabanlı Doğrulama
Avantaj: Kullanıcıların büyük çoğunluğunun bir mobil numarası olduğundan erişimi kolaydır.
Dezavantaj: SIM swap saldırıları, mesajların ele geçirilmesi gibi güvenlik açıkları vardır.
2. E-posta Tabanlı Doğrulama
Avantaj: Teknik olarak uygulanması kolay ve geniş bir kullanıcı kitlesine uygundur.
Dezavantaj: Kullanıcıların e-posta hesaplarının güvenliği zayıfsa, sistem tehlikeye girebilir.
3. Mobil Uygulama Tabanlı Doğrulama
Avantaj: Çevrimdışı çalışabilir, daha güvenlidir. Google Authenticator veya Authy gibi uygulamalar örnek verilebilir.
Dezavantaj: Kurulum ve kullanım, teknik bilgi gerektirebilir.
4. Donanım Anahtarları
Avantaj: Yüksek güvenlik seviyesi sunar. YubiKey gibi cihazlar örnek verilebilir.
Dezavantaj: Ek donanım gerektirir, kaybolduğunda zorluk yaratabilir.
Uygulamalara 2FA Entegrasyonu
Protokoller:
OpenID Connect: Kimlik doğrulama protokolüdür. Üçüncü taraf kimlik sağlayıcılarla çalışabilir.
OAuth 2.0: Yetkilendirme protokolüdür. API erişimlerini güvenli hale getirmek için kullanılır.


API Güvenliği ve Veri Şifreleme - Documentation
JWT Kullanımı ve Best Practices
JSON Web Token (JWT), API oturumlarını güvenli bir şekilde yönetmek için kullanılan yaygın bir standarttır. JWT, kullanıcı kimlik bilgilerini şifrelenmiş bir formatta taşır ve yetkilendirme için güvenilir bir çözüm sunar.
Best Practices:
1. Güçlü bir gizli anahtar (secret key) kullanın ve güvenli bir şekilde saklayın.
2. JWT sürelerini (expiration) kısa tutun, örneğin 15 dakika.
3. Hassas bilgileri JWT içinde taşımaktan kaçının.
4. HTTPS kullanarak JWT'nin aktarımını güvence altına alın.
Örnek:
- Kullanıcı giriş yaptığında, backend tarafından bir JWT üretilir ve frontend'e gönderilir.
- Frontend, bu JWT'yi API çağrıları sırasında Authorization başlığına ekler:
```javascript
fetch("/api/protected", {
headers: {
"Authorization": "Bearer YOUR_JWT_TOKEN"
}
});
```
Rate Limiting ve IP Whitelisting
Rate limiting, API çağrılarını sınırlandırarak kötüye kullanımı önlemek için kullanılan bir yöntemdir. Örneğin, bir kullanıcı bir dakika içinde en fazla 100 API çağrısı yapabilir.
IP Whitelisting, yalnızca belirli güvenilir IP adreslerinden gelen erişime izin verir. Bu, özellikle dahili uygulamalar veya şirket ağları için faydalıdır.
Örnek:
- Rate Limiting: Nginx kullanarak IP başına 10 saniyede en fazla 5 istek izni vermek:
```nginx
limit_req_zone $binary_remote_addr zone=one:10m rate=5r/s;
server {
location /api/ {
limit_req zone=one burst=10;
}
}
```
- IP Whitelisting: Bir firewall veya API Gateway üzerinden izinli IP adreslerini ayarlamak.
Account Lockout Mekanizması
Hatalı kimlik doğrulama girişimlerini sınırlandırmak için bir account lockout mekanizması kullanılabilir. Örneğin:
1. Kullanıcı 3 kez yanlış parola girerse, hesabı 5 dakika boyunca kilitlemek.
2. Sürekli başarısız giriş denemeleri için bir CAPTCHA doğrulaması göstermek.

Veritabanında Hassas Veri Şifreleme
AES-256 gibi güçlü algoritmalar kullanılarak kullanıcı verilerinin korunması sağlanabilir. Hassas veriler (örneğin kredi kartı bilgileri) şifrelenerek saklanmalıdır.

HTTPS Zorunluluğu
Veri aktarımı sırasında üçüncü tarafların dinlemesini önlemek için SSL sertifikaları ve HTTPS kullanılması gereklidir.
Örnek:
1. Let's Encrypt kullanarak ücretsiz bir SSL sertifikası alabilirsiniz.
2. Nginx veya Apache ile HTTPS ayarlarını yapılandırabilirsiniz.
Parola Hashleme Yöntemleri
Parolaların düz metin olarak saklanmasını önlemek için bcrypt, Argon2 gibi algoritmalar kullanılmalıdır.
Örnek:
- ASP.NET Core'da PasswordHasher kullanarak parola hashleme:
```csharp
var passwordHasher = new PasswordHasher<User>();
string hashedPassword = passwordHasher.HashPassword(user, "userPassword");
```
- React Native'de bir hash kütüphanesi kullanarak parolaları hashlemek:
```javascript
import bcrypt from 'bcryptjs';
const hashedPassword = bcrypt.hashSync("password123", 10);
console.log(hashedPassword);
Pratik Örnekler
1. Postman kullanarak JWT doğrulama ve saldırı simülasyonları yapabilirsiniz.
2. ASP.NET Core'da Data Protection API kullanarak veri şifreleme uygulamaları geliştirebilirsiniz.
3. React Native'de güvenli local storage için SecureStore veya Keychain gibi çözümler tercih edebilirsiniz.