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.

ASP.NET Core ile Basit Örnek:
var code = await _userManager.GenerateTwoFactorTokenAsync(user, TokenOptions.DefaultProvider);
await _emailSender.SendEmailAsync(user.Email, "2FA Kodunuz", $"Kodunuz: {code}");

var isValid = await _userManager.VerifyTwoFactorTokenAsync(user, TokenOptions.DefaultProvider, inputCode);
if (isValid) {
    await _signInManager.SignInAsync(user, isPersistent: false);
} else {
    ModelState.AddModelError("", "Kod geçersiz.");
}

Pratik Örnekler

1. Web Uygulamasına SMS Doğrulama Entegrasyonu
   React Örneği:
   const sendSMSCode = async () => {
       const response = await fetch("/api/send-sms-code", {
           method: "POST",
           headers: { "Content-Type": "application/json" },
           body: JSON.stringify({ phoneNumber }),
       });
       if (response.ok) alert("Kod gönderildi!");
   };















2. Mobil Uygulamada 2FA Entegrasyonu
   React Native:
   import OTPInputView from '@twotalltotems/react-native-otp-input';

   const TwoFactorAuth = () => {
       return (
           <OTPInputView
               pinCount={6}
               autoFocusOnLoad
               codeInputFieldStyle={{ borderWidth: 1, borderColor: "#000" }}
               onCodeFilled={(code) => { console.log(`Girilen kod: ${code}`); }}
           />
       );
   };
   export default TwoFactorAuth;

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.

Örnek:
- ASP.NET Core'da Identity kullanarak bir hesap kilitleme özelliği:
```csharp
services.Configure<IdentityOptions>(options =>
{
    options.Lockout.MaxFailedAccessAttempts = 3;
    options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(5);
    options.Lockout.AllowedForNewUsers = true;
});
```

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.

Örnek:
- C# ile AES kullanarak veri şifreleme ve çözme:
```csharp
using (Aes aes = Aes.Create())
{
    aes.Key = Convert.FromBase64String("YOUR_BASE64_KEY");
    aes.IV = Convert.FromBase64String("YOUR_BASE64_IV");

    ICryptoTransform encryptor = aes.CreateEncryptor(aes.Key, aes.IV);
    byte[] encrypted = encryptor.TransformFinalBlock(data, 0, data.Length);
}
```

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.