# Security (Xavfsizlik) — To'liq Darslik

## Mundarija
1. [Nega xavfsizlik muhim? (OWASP Top 10)](#motivatsiya)
2. [UserDefaults xavfsizligi — Nega unda parol saqlab bo'lmaydi?](#user-defaults)
3. [Keychain Services — Xavfsiz saqlash](#keychain)
4. [Biometric Authentication (Face ID / Touch ID)](#biometric)
5. [SSL/TLS Pinning — MiTM hujumidan himoya](#ssl-pinning)
6. [App Transport Security (ATS)](#ats)
7. [Data Protection API — Fayllarni himoyalash](#data-protection)
8. [Jailbreak Detection — Tekshirish usullari](#jailbreak)
9. [Obfuscation (Kodlarni yashirish)](#obfuscation)
10. [Apple "Sign in with Apple" xavfsizligi](#apple-auth)
11. [Xulosa va Xavfsizlik Checklist](#xulosa)

---

## 1. Nega xavfsizlik muhim? {#motivatsiya}

Ilovangiz foydalanuvchining bank malumotlari, parollari yoki shaxsiy xabarlarini saqlashi mumkin. Agar xavfsizlikka e'tibor bermasangiz:
- Ma'lumotlar o'g'irlanishi mumkin.
- Foydalanuvchi ishonchi yo'qoladi.
- Apple App Store review dan o'tkazmaydi.

---

## 2. UserDefaults xavfsizligi {#user-defaults}

`UserDefaults` — bu shunchaki oddiy `.plist` fayli. U shifrlanmagan (not encrypted). İstagan odam telefon ichidagi fayllarni ochib, undagi ma'lumotlarni o'qiy oladi.
- **✅ Ha:** Til sozlamasi, dark/light mode, "Yana ko'rsatilmasin" flagi.
- **❌ Yo'q:** Parollar, API Tokenlar, kredit karta ma'lumotlari.

---

## 3. Keychain Services {#keychain}

Parol va tokenlarni saqlashning eng xavfsiz joyi — **Keychain**. U tizim darajasida shifrlangan bo'ladi va faqat sizning ilovangiz unga kira oladi.

```swift
// Keychain'ga saqlash (oddiy wrapper orqali)
let secret = "my_api_token_123"
let data = secret.data(using: .utf8)!

let query: [String: Any] = [
    kSecClass as String: kSecClassGenericPassword,
    kSecAttrAccount as String: "user_session",
    kSecValueData as String: data
]

SecItemAdd(query as CFDictionary, nil)
```

> 💡 Amaliyotda **SwiftKeychainWrapper** yoki **Valet** kabi tayyor kutubxonalardan foydalanish tavsiya etiladi.

---

## 4. Biometric Authentication {#biometric}

Face ID yoki Touch ID orqali kirishni o'rnatish.

```swift
import LocalAuthentication

let context = LAContext()
var error: NSError?

if context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &error) {
    context.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, localizedReason: "Ilovaga kirish uchun tasdiqlang") { success, error in
        if success {
            print("Muvaffaqiyatli!")
        }
    }
}
```

---

## 5. SSL/TLS Pinning {#ssl-pinning}

Hackerlar "Man-in-the-Middle" (MiTM) hujumi orqali siz yuborgan API so'rovlarni o'rtada tutib, o'qishlari mumkin. SSL Pinning orqali ilova faqat sizning aniq serveringizga ishonishini kafolatlaymiz.

---

## 6. App Transport Security (ATS) {#ats}

Apple barcha tarmoq so'rovlari **HTTPS** bo'lishini talab qiladi. Shifrlanmagan HTTP so'rovlar bloklanadi (info.plist da exception qo'shilmagan bo'lsa).

---

## 7. Data Protection API {#data-protection}

Fayllarni diskka saqlaganda, telefon bloklangan (locked) paytda ularni o'qib bo'lmaydigan qilib qo'yish:
```swift
try data.write(to: fileURL, options: .completeFileProtection)
```

---

## 8. Jailbreak Detection {#jailbreak}

Jailbreak qilingan qurilmalarda xavfsizlik devorlari buzilgan bo'ladi. Bunda ilovangiz ishlamasligi yoki ogohlantirish berishi mumkin.
- `Cydia` ilovasi borligini tekshirish.
- Tizim fayllariga yozish huquqini tekshirish.

---

## 9. Obfuscation (Kodlarni yashirish) {#obfuscation}

Ilovani "reverse engineering" (kodni qayta tiklash) qilishdan qiyinlashtirish. Swift'da bu qiyin, lekin muhim stringlarni (masalan, API Key) shifrlab saqlash mumkin.

---

## 10. Apple "Sign in with Apple" xavfsizligi {#apple-auth}

Apple foydalanuvchining haqiqiy emailini yashirgan holda xavfsiz ro'yxatdan o'tish imkonini beradi. Ilova uchun bu eng xavfsiz va ishonchli Auth usullaridan biridir.

---

## 11. Xulosa va Xavfsizlik Checklist {#xulosa}

Checklist:
- [ ] Parollar va Tokenlar faqat Keychain'da.
- [ ] HTTPS ishlatilgan.
- [ ] `UserDefaults` da shaxsiy ma'lumot yo'q.
- [ ] API kalitlari kod ichida ochiq holda emas.
- [ ] Muhim ishlarda Biometrik tasdiqlash bor.

**Vazifa:** `LocalAuthentication` yordamida ilovaga kirishdan oldin Face ID so'raydigan kichik kod yozing! 🔐
