Asosiy kontentga o‘tish
Innovialabs

Ilovada maxfiy ma’lumotlarni saqlash: Keychain va Android Keystore

Chuqur3 daq

Qisqacha

Token va kalitlarni SharedPreferences, UserDefaults yoki AsyncStorage’da emas, iOS Keychain’da va Android Keystore himoyasi ostida saqlang. Biometriyani «ha/yo‘q» tekshiruviga emas, kriptografik kalitga bog‘lang va yodda tuting: ilova ichiga joylangan sir — sir emas.

Maxfiy ma’lumotlarni qayerga qo‘yish kerak

Qisqa javob:

  • iOS — Keychain’ga. Bu kirish sozlamalariga ega tizimli shifrlangan ombor.
  • Android — ma’lumotlar Android Keystore’dagi kalit bilan shifrlanadi. Kalitning o‘zi himoyalangan muhitdan (TEE yoki qurilmada bo‘lsa, alohida StrongBox chipi) chiqmaydi, shifrlangan ma’lumot esa fayl yoki bazada turadi.
  • Kross-platforma — o‘ramlar orqali: flutter_secure_storage, react-native-keychain, expo-secure-store. Ular ichkarida o‘sha Keychain va Keystore’dan foydalanadi.
const storage = FlutterSecureStorage();
await storage.write(key: "refresh_token", value: token);
final saved = await storage.read(key: "refresh_token");

Nega SharedPreferences va AsyncStorage yaramaydi

SharedPreferences, UserDefaults va AsyncStorage — ilova papkasidagi oddiy fayllar, shifrlashsiz. Ularni boshqa ilovalardan OT qum qutisi (sandbox) himoya qiladi, ammo bu kam:

  • root yoki jailbreak qilingan qurilmada fayllar to‘g‘ridan-to‘g‘ri o‘qiladi;
  • aniq istisno qilinmasa, ma’lumotlar qurilmaning zaxira nusxalariga tushishi mumkin;
  • debug va yomon himoyalangan yig‘ilmalarda tarkibni olish oson;
  • jarayoningiz ichidagi zararli kod (masalan, buzilgan kutubxona) hammasini ko‘radi.

Bu omborlar sozlamalar uchun mos: mavzu, til, «onboarding o‘tildi» belgisi. Token va kalitlar uchun emas.

Aynan nimani va qanday saqlash kerak

Ma’lumotTavsiya
Access tokenQisqa muddatli; xotirada yoki himoyalangan omborda
Refresh tokenKeychain / Keystore, akkauntdan chiqishda o‘chiriladi
Lokal bazani shifrlash kalitiQurilmada generatsiya qilinadi, Keychain / Keystore’da saqlanadi
Foydalanuvchi paroliUmuman saqlanmaydi, tokenga almashtiriladi
Server API siriIlovaga qo‘yilmaydi — backend’da turadi

Oxirgi qator muhim: binar faylga joylangan hamma narsani dekompilyatsiya orqali chiqarib olish mumkin. Pullik yoki maxfiy amallarga ruxsat beradigan uchinchi tomon kalitlari serverda turishi, ilova esa backend’ingiz orqali ishlashi kerak.

Keychain’dagi kirish sozlamalari

Keychain elementida kirish atributi bor:

  • WhenUnlocked — faqat qurilma qulfdan chiqarilganda ochiq;
  • AfterFirstUnlock — yoqilgandan keyingi birinchi qulfdan chiqarishdan so‘ng ochiq, fon vazifalari uchun kerak;
  • ThisDeviceOnly variantlari zaxira nusxa orqali boshqa qurilmaga o‘tmaydi.

Tokenlar uchun odatda fon ishini buzmaydigan eng qat’iy variant tanlanadi. Hisobga oling: iOS’da Keychain elementlari ilova o‘chirilgandan keyin ham saqlanib qolishi mumkin, shuning uchun birinchi ishga tushishda buni tekshirib, eski ma’lumotlarni tozalang.

Biometriya: noto‘g‘ri va to‘g‘ri

Noto‘g‘ri: Face ID yoki barmoq izini chaqirish, true olish va shundan keyin tokenni oddiy ombordan o‘qish. Buzilgan qurilmada bu natijani soxtalashtirish mumkin.

To‘g‘ri: biometriyaga kalitning o‘zini bog‘lash.

  • iOS — access control (biometryCurrentSet) bilan Keychain elementi: tizim ma’lumotni faqat muvaffaqiyatli biometriyadan keyin beradi.
  • Android — setUserAuthenticationRequired(true) bilan Keystore kaliti va CryptoObject bilan BiometricPrompt: shifrni ochish faqat tasdiqlangandan keyin mumkin.

biometryCurrentSet yangi barmoq izi yoki yuz qo‘shilganda kalitni yaroqsiz qiladi — bu kimdir o‘z biometriyasini qo‘shib olgan holatdan himoya qiladi.

Certificate pinning asoslari

Pinning — server qurilma ishonadigan istalgan sertifikatni emas, balki aniq kalit yoki sertifikatni ko‘rsatganini tekshirish. U soxta ildiz sertifikati orqali trafikni tutib olishdan himoya qiladi.

Pinning xavfli bo‘lib qolmasligi uchun qoidalar:

  • butun sertifikatni emas, ochiq kalit xeshini biriktiring;
  • doim zaxira pin saqlang — rotatsiyadan keyin ishlatiladigan kalit;
  • yangilashni rejalashtiring: sertifikat almashsa-yu, ilova faqat eski pinni bilsa, u barcha foydalanuvchilarda ishlamay qoladi.

Android’da pinning Network Security Config’da belgilanadi:

<network-security-config>
  <domain-config>
    <domain includeSubdomains="true">api.example.com</domain>
    <pin-set expiration="2027-01-01">
      <pin digest="SHA-256">PRIMARY_KEY_HASH_BASE64=</pin>
      <pin digest="SHA-256">BACKUP_KEY_HASH_BASE64=</pin>
    </pin-set>
  </domain-config>
</network-security-config>

iOS’da — Info.plist’dagi NSPinnedDomains kaliti yoki URLSession delegatidagi tekshiruv orqali.

Ko‘p uchraydigan xatolar

  • Tokenlar AsyncStorage’da — «vaqtincha, keyin ko‘chiramiz».
  • Sirlar yig‘ilmaga tushib qoladigan .env faylida.
  • Tokenlar konsol loglarida yoki analitika tizimlarida.
  • Akkauntdan chiqishda ombor tozalanmaydi.
  • Zaxira kalitsiz pinning.

Ko‘p beriladigan savollar

Yo‘q, bu faqat bitta qatlam. Qisqa muddatli tokenlar, serverda sessiyalarni bekor qilish, hamma joyda HTTPS va backend’da huquqlarni tekshirish ham kerak. Himoyalangan ombor qurilmadan ma’lumot o‘g‘irlanishi xavfini kamaytiradi, lekin server xavfsizligini almashtirmaydi.

Bunda yordam beramiz

O‘zingiz shug‘ullanmasdan natija olishni istasangiz — biz har kuni shu bilan shug‘ullanamiz.

Loyihani muhokama qilish

Yana o‘qing

G‘oya yoki vazifangiz bormi? Bizga aytib bering

Ish kuni davomida javob beramiz va yechim taklif qilamiz. Konsultatsiya bepul.