DocuChan aslida qanday ishlaydi — va buni qanday tekshirish mumkin
«Bizga ishoning» degan gap xavfsizlik modeli emas. Bu sahifa — DocuChanʼning tahdidlar modeli. Uni boshqa bir muhandis biz uchun qanday yozib berishini istasak, xuddi shunday yozdik: nima va qayerda shifrlanadi, serverlarimiz saqlaydigan barcha maʼlumotlar, sizni aynan nimalardan himoya qila olmasligimiz va bu daʼvolarni brauzerning dasturchi vositalari yordamida oʻzingiz qanday tekshirishingiz mumkinligi.
«Xavfsiz» fayl almashishdagi muammo
Deyarli har bir fayl almashish xizmati oʻzini xavfsiz deb ataydi va deyarli hammasi bu bilan ikki narsani nazarda tutadi: uzatish paytida TLS va oʻz disklarida saqlanayotgan maʼlumotni shifrlash. Ikkalasi ham yaxshi. Biroq ularning hech biri provayderning oʻzi faylingizni oʻqishiga toʻsqinlik qilmaydi — kalitlar provayderning qoʻlida. Shartnomangiz, pasportingiz nusxasi yoki hali chiqarilmagan dasturingiz begona serverda, oʻsha server ocha oladigan koʻrinishda turadi, yuklab olish sahifasi esa koʻpincha yoniga reklama qoʻyib, oʻz xarajatini qoplaydi.
Uchma-uch shifrlash bundan kuchliroq daʼvo: fayl qurilmangizdan chiqishidan oldin, xizmatga hech qachon berilmaydigan kalit bilan shifrlanadi. Shunda server tomonida nima boʻlishi — qiziquvchan administrator, sud soʻrovi yoki saqlash omboridan maʼlumot sizib chiqishi — unchalik ahamiyatli boʻlmay qoladi: u yerda faqat shifrlangan matn bor. DocuChan shunday qurilganki, buni maxfiylik siyosatidagi vaʼda emas, tizim tuzilishining oʻzi kafolatlaydi.
Bu hikoyada ikki narsa yoʻlga chiqadi va ular hech qachon bir yoʻldan yurmaydi. Ranglarga eʼtibor bering: kalit — koʻk, shifrlangan matn — yashil.
Kalit bizga hech qachon yetib kelmaydi — eski brauzer qoidasi tufayli
Fayl yuklaganingizda brauzeringiz Web Crypto API yordamida tasodifiy 256 bitli AES-GCM kalit yaratadi. Bu kalit ulashish havolasiga joylanadi — lekin juda alohida joyga: URL fragmentiga, yaʼni # belgisidan keyingi qismga.
Fragmentlar JavaScript paydo boʻlishidan ham oldin mavjud edi — ular sahifa ichidagi muayyan sarlavhaga sakrash uchun oʻylab topilgan, shuning uchun standartda brauzerlar ularni HTTP soʻrovlariga hech qachon qoʻshmasligi belgilab qoʻyilgan. Bu qoidaga barcha brauzerlar amal qiladi. Qabul qiluvchi havolani ochganda serverimiz faqat /d/x7Kq0aH2 soʻrovini koʻradi, boshqa hech narsani emas; uning qurilmasida ishlayotgan JavaScript fragmentni oʻsha yerning oʻzida oʻqiydi va shifrni ham oʻsha yerda ochadi. Firefox Send ham aynan shu usuldan foydalangan. Demak, «yashirin eshik yoʻq» degan daʼvo bizning ezgu niyatlarimizga emas, kalit qaysi yoʻldan yurishiga asoslanadi.
Fayl qanday shifrlanadi
Fayllar 8 MiB hajmli boʻlaklarga boʻlinib, oqim tarzida shifrlanadi: boʻlak oʻqiladi, shifrlanadi, yuklanadi va navbatdagisiga oʻtiladi. Brauzeringiz hech qachon butun faylni xotirada saqlab turmaydi, shuning uchun bir necha gigabaytli fayl ham operativ xotirasi kam noutbuk yoki telefondan bemalol yuklanadi. Har bir boʻlak oʻzining tasodifiy 12 baytli IV qiymatini oladi va AES-256-GCM bilan muhrlanadi; tarmoq orqali uzatish formati shunchaki takrorlanuvchi [IV | ciphertext + auth tag] ketma-ketligidan iborat.
GCM — autentifikatsiyalangan rejim: har bir boʻlak shifr ochilayotganda tekshiriladigan autentifikatsiya tegini olib yuradi. Agar kimdir saqlangan shifrlangan matnning birgina bitini oʻzgartirsa — u yomon niyatli saqlash xizmati boʻladimi, oʻrtadagi hujumchimi yoki disk nosozligimi — shifrni ochish ochiq-oydin xato bilan toʻxtaydi va yuklab olish faylni bermaydi. Oʻzgartirilgan hujjatni bilmagan holda qabul qilib olishingiz mumkin emas.
Fayl nomi ham xuddi shunday himoyalanadi. Bu serverimiz oʻqishi shart boʻlmagan metamaʼlumot, shuning uchun u saqlanishidan oldin brauzerning oʻzida, aynan shu faylning kaliti bilan shifrlanadi (e2e: prefiksi bilan boshlanuvchi satr koʻrinishida). Biz tomonda yuklamangiz tasodifiy identifikator, biz oʻqiy olmaydigan yorliq va baytlar sonidan iborat. Biz saqlaydigan MIME turi — application/octet-stream: bu PDFmi yoki suratmi, biz bilmaymiz.
Baytlar aslida qayerga boradi
Alohida taʼkidlashga arziydigan bir jihat: shifrlangan boʻlaklar oldindan imzolangan URL manzillar orqali toʻgʻridan-toʻgʻri obyekt omboriga yuklanadi. Ilova serverimiz yuklashga ruxsat beradi va manzillarni tarqatadi, lekin fayl baytlari undan oʻtmaydi — ochiq matn hatto tasodifan paydo boʻlishi mumkin boʻlgan oraliq nuqtaning oʻzi yoʻq. Saqlash xizmati esa, oʻz navbatida, kaliti oʻzida boʻlmagan shifrlangan matnni saqlaydi. Yuklab olish xuddi shu yoʻlning teskarisi: boʻlaklar kelib tushgan sari oqim tarzida shifrdan ochiladi (File System Access API boʻlmagan brauzerlarda Service Worker orqali — shu tufayli katta fayllar ham xotirani toʻldirib yubormaydi).
Serverimiz saqlaydigan hamma narsa — toʻliq roʻyxat
Metamaʼlumotlar borasidagi halollik shifrlash haqidagi shiorlardan muhimroq. Shuning uchun har bir uzatma boʻyicha saqlanadigan yozuvni toʻliq, maʼlumotlar bazasi sxemasidan soʻzma-soʻz keltiramiz:
- tasodifiy, taxmin qilib boʻlmaydigan havola identifikatori (ombordagi obyekt nomi ham shu)
- shifrlangan fayl nomi yorligʻi (biz uni oʻqiy olmaymiz)
- shifrlangan matnning baytlardagi hajmi
- amal qilish muddati, «yuklab olingach yoʻq qilish» belgisi, yuklab olishlar hisoblagichi
- parol qoʻygan boʻlsangiz: PBKDF2 tekshiruv xeshi — parolning oʻzi hech qachon emas (keyingi boʻlim)
- yaratilgan vaqt va, agar tizimga kirgan boʻlsangiz, hisobingiz identifikatori
Xizmatni yuritish jarayonida soʻrovlar sonini cheklash va suiisteʼmolga qarshi kurashish uchun IP manzillarning tuz qoʻshilgan xeshlarini qisqa muddat saqlaymiz (manzillarning oʻzini emas), shuningdek, odatiy veb-server jurnallarini yuritamiz. Analitikamiz oʻz serverimizda ishlaydi va cookie fayllardan foydalanmaydi. U yuklab olish, fayl soʻrovi, sovgʻa, hisob va Rooms sahifalarida umuman ishga tushmaydi. PDF vositasi sahifasi esa oʻz kodimiz orqali bitta sahifa koʻrishini (faqat yoʻlni) yuboradi — hujjatingiz yonida hech qanday kuzatuv skripti ishlamaydi, uning Content-Security-Policy siyosati esa boshqa manzilga ruxsat bermaydi. Qolgan barcha sahifalarda esa URL manzildagi soʻrov parametrlari va # fragmentini olib tashlaydi — shu sababli u hech qachon kalitni qayd eta olmaydi. Uning hodisalarida faqat taxminiy sonlar va hajm oraliqlari boʻladi, fayl nomi esa hech qachon boʻlmaydi. Ertaga sud soʻrovi kelsa ham, faylingiz haqida bizda bor maʼlumotlarning jami — yuqoridagi roʻyxat va shifrlangan matn, xolos. Biz nimadir ulashilganini tasdiqlay olamiz, lekin nima ulashilganini koʻrsatib bera olmaymiz.
Parol — kalit emas, darvoza
Havolaga parol qoʻyishingiz mumkin. Uning aynan nima qilishini aniq aytib oʻtish kerak: parol shifrlash kalitining manbai emas — kalit har qanday holatda fragment ichida boʻladi. Parol — bu kirish darvozasi: usiz serverimiz shifrlangan matnni bermaydi. Havola paroldan alohida sizib chiqqan joylarda (boshqa birovga uzatilgan xat, chat yozishmasi, ekran surati) bu sizni himoya qiladi.
Parolning oʻzini ham hech qachon bilmaymiz. Brauzeringiz undan PBKDF2 yordamida tekshiruv qiymatini hosil qiladi (SHA-256, 210 000 iteratsiya, tasodifiy «tuz» — tuz fragment ichida, kalit yonida yuradi). Serverda faqat shu tekshiruv qiymati saqlanadi va yuklab olishda doimiy vaqtli usulda solishtiriladi. Maʼlumotlar bazasi sizib chiqqan taqdirda ham undan parolingiz emas, barcha variantlarni terib chiqish orqali buzish juda sekin kechadigan xesh olinadi, xolos.
Oʻz-oʻzini yoʻq qilish: aniq qanday ishlaydi
«Yuklab olingach yoʻq qilish» funksiyasi faylni birinchi yakunlangan yuklab olishdan keyin oʻchiradi: yoʻq qilish ishga tushishidan oldin qabul qiluvchining brauzeri fayl toʻliq saqlanganini tasdiqlaydi, shuning uchun aloqa 90 foizda uzilib qolsa, fayl hali ochilmay turib yoʻq boʻlib ketmaydi. Bekor qilingan yuklab olish ham uni yoʻq qilmaydi. Muddatli havolalar esa muddati tugashi bilan fon rejimida ishlaydigan tozalash jarayoni tomonidan oʻchiriladi. Oʻchirish shifrlangan obyekt ombordan olib tashlanishini va havola endi ochilmasligini anglatadi; biz tomonda hech qachon shifrlangan matndan boshqa narsa boʻlmagan, shuning uchun izlab topiladigan ochiq nusxa hech qayerda yoʻq.
Beam: fayllar serverga umuman tegmasligi kerak boʻlganda
Qurilmadan qurilmaga yuborishda (Beam) fayl WebRTC maʼlumotlar kanali orqali ikki brauzer oʻrtasida toʻgʻridan-toʻgʻri uzatiladi. Serverimiz faqat ulanishni oʻrnatish xabarlarini yetkazib beradi (SDP/ICE — tarmoq koordinatalari, bir necha KB). Biroq WebRTC tarkibidagi DTLS shifrlashning maʼlum zaif joyi bor: bu xabarlarni yetkazayotgan tomon nazariy jihatdan oʻrtaga suqilib kirishi mumkin. Shuning uchun Beam DTLS ustiga oʻzining uchma-uch shifrlash qatlamini qoʻshadi va bu qatlam bizni ham tahdidlar modeliga kiritgan holda loyihalangan:
- Har bir qurilma vaqtinchalik ECDH P-256 kalitlar juftligini yaratadi va avval majburiyat yuboradi — vaqtinchalik ochiq kalitini qurilmaning doimiy identifikatsiya kalitiga bogʻlaydigan SHA-256 xeshi.
- Har bir tomon bu kalitlarni faqat qarshi tomonning majburiyatini olgandan keyingina oshkor qiladi, soʻng ular majburiyat bilan solishtirib tekshiriladi. Shundan keyin ikkala kalit ham AES-256-GCM seans kalitiga va qisqa kodga bogʻlanadi.
- Ikkala ekranda 6 belgili kod (qisqa autentifikatsiya satri, SAS) chiqadi; foydalanuvchilar uning mosligini bir marta tasdiqlaydi va qurilmani eslab qolishi mumkin — keyingi safar hammasi avtomatik boʻladi.
Qisqa kodni xavfsiz qiladigan narsa — aynan «avval majburiyat, keyin oshkor qilish» qadami: yomon niyatli vositachi oʻzining soxta kalitlarini siznikini koʻrishdan oldin tanlashi shart, shuning uchun u ikkala ekranda bir xil kod chiqaradigan kalitlar juftligini tanlab topa olmaydi. Unda koʻr-koʻrona urinish uchun bor-yoʻgʻi bitta imkoniyat qoladi — taxminan milliarddan bir. ZRTP ovozli qoʻngʻiroqlarni himoyalash uchun aynan shu usuldan foydalangan. Toʻgʻridan-toʻgʻri ulanishning iloji boʻlmay, trafik rele (TURN) serveri orqali oʻtganda, u faqat allaqachon shifrlangan shu oqimni koʻradi.
Rooms: server hujjatlarni emas, qatnashchilarni tanishtiradi
DocuChan Rooms — hujjatlarni birgalikda tahrirlash vositasi, lekin u hujjatlarni serverda saqlaydigan xizmat emas. Har bir xonaning ikkita alohida ruxsat kaliti bor: qatnashchilar bir-birini topishi uchun xizmat qiladigan tasodifiy ochiq xona identifikatori va taklif havolasida #key= qismidan keyin keladigan 256 bitli maxfiy kalit. Sahifa bu fragmentni ilova ishga tushishidan oldin oʻqib oladi, uni manzil satridan olib tashlaydi va Rooms APIʼga hech qachon yubormaydi. Roomsʼning barcha sahifalarida analitika butunlay oʻchirib qoʻyilgan.
Brauzerlar bir-birini topishi uchun serverimiz qisqa muddatli mavjudlik yozuvlari va hajmi cheklangan WebRTC signalizatsiya yozuvlarini saqlaydi. Hujjat mazmuni, Markdown matni, izohlar, belgilangan qismlar, joylashtirilgan rasmlar va Mermaid manba kodi qatnashchilarning brauzerlari oʻrtasida shifrlangan WebRTC maʼlumotlar kanallari orqali uzatiladi. Ilova protokoli xona sirini autentifikatsiya qiladi va oʻz xabarlarini HKDF orqali hosil qilingan AES-256-GCM kalitlari bilan shifrlaydi; signalizatsiya xizmati hujjatdagi oʻzgarishlarni oʻqiy olmaydi, ularni sezdirmasdan oʻzgartira ham olmaydi.
Xona yaratuvchisi faqat xonani qulflash va qatnashchilarni kiritish haqida qaror qabul qilish uchun ishlatiladigan ikkinchi tasodifiy ruxsat kalitini oladi. U yaratuvchining brauzeridagi sayt xotirasida qoladi va hech qachon taklif yoki davom ettirish havolasida koʻrinmaydi; server uning faqat SHA-256 xeshini saqlaydi. Qulflanmagan xona toʻgʻri kirish soʻrovini darhol qabul qiladi. Qulflangan xonada esa soʻrov onlayn turgan mezbon uni tasdiqlamaguncha yoki rad etmaguncha kutib turadi. Qulf holati, qatnashchilarning xeshlangan ruxsat kalitlari, kirish holati, qatnashchilar oʻzlari kiritgan ismlar va vaqt belgilari — serverdagi qisqa muddatli metamaʼlumotlar; ularda baribir hech qachon hujjat kaliti ham, hujjat mazmuni ham boʻlmaydi.
Tiklash imkoniyati foydalanuvchining oʻz qurilmasida bu saqlash chegarasini oʻzgartiradi. Rooms hujjatning ochiq (shifrlanmagan) Yjs nusxasini oʻsha brauzerning IndexedDB xotirasida saqlaydi va varaq tasodifan yopilib qolsa, uni tiklash uchun xona sirini mahalliy xotirada saqlab qoʻyishi mumkin. Rooms bosh sahifasida alohida mahalliy nusxalarni oʻchirish yoki barcha maʼlum Rooms maʼlumotlar bazalari va tiklash kalitlarini tozalash mumkin. Serverda zaxira nusxa yoʻq va foydalanuvchi yoʻqotgan kalitni DocuChan tiklay olmaydi.
Clipboard: yo bevosita, yo umuman yoʻq
Clipboard oʻz qurilmalaringiz orasida matn parchasi yoki PNG rasmni koʻchiradi. U Beamʼdan ham qatʼiyroq: brauzerlar ommaviy STUN serverlaridan faqat bevosita WebRTC yoʻlini topish uchun foydalanadi, Clipboard esa hech qachon TURN rele serveri orqali uzatishga oʻtmaydi — bevosita ulanish oʻrnatilmasa, uzatish boshqa birov orqali yoʻnaltirilmaydi, shunchaki amalga oshmaydi. Serverimiz faqat qisqa muddatli mavjudlik va signalizatsiya yozuvlarini koʻradi, ularning muddati esa oʻz-oʻzidan tugaydi. Har bir element ikki brauzer oʻzaro kelishib olgan kalitlar bilan ilova darajasida yana bir bor shifrlanadi va xuddi Beamʼdagidek, ikkala ekrandagi qisqa kodni solishtirasiz. Qabul qilingan elementlar faqat oʻsha varaqning xotirasida — koʻpi bilan oxirgi 20 tasi — saqlanadi va varaqni yopishingiz bilan yoʻqoladi.
Biz sizni nimalardan himoya qila olmaymiz
Hech qanday cheklovni tan olmaydigan xavfsizlik sahifasi — bu reklama sahifasi. Bizning cheklovlarimiz:
- Siz biz yuboradigan JavaScript kodiga ishonasiz. Shifrlash har safar sahifa yuklanganda serverimizdan keladigan kodda bajariladi. Agar biz yomon niyatga oʻtsak, bunga majburlansak yoki tizimimiz buzilsa, bu kod oʻzgartirilishi mumkin. Bu brauzerda ishlaydigan har qanday uchma-uch shifrlash vositasiga, jumladan shifrlangan messenjerlarning veb-versiyalariga ham taalluqli. Buni siz biror muhokamada oʻqib qolishingizdan koʻra, oʻzimiz ochiq aytganimiz maʼqul. Brauzer ilovasining manba kodini tekshirish uchun ochish jiddiy koʻrib chiqilmoqda — bu xavfni kamaytirishning halol yoʻli.
- Mustaqil audit hali oʻtkazilmagan. Tizim tuzilishi yaxshi oʻrganilgan yechimlarga tayanadi (Firefox Sendʼdagi fragment sxemasi, ZRTP uslubidagi SAS), ammo aynan bizning kodimizni hali hech bir mustaqil tomon tekshirmagan. Bu oʻzgarganda hisobotga havola shu yerda joylanadi.
- Havolaning oʻzi — sir. Toʻliq havolaga (va parol qoʻyilgan boʻlsa, parolga) ega boʻlgan har kim faylni shifrdan ochishi mumkin. Uni oʻzingiz ishonadigan kanal orqali yuboring va havola sizib chiqqan taqdirda ham birinchi foydalanishdan keyin yaroqsiz boʻlishi uchun «yuklab olingach yoʻq qilish»ni yoqing.
- Qurilmangiz bizning himoya doiramizdan tashqarida. Zararli dastur yoki yelkangiz ortidan qarab turgan kamera har qanday shifrlashni, jumladan biznikini ham, befoyda qiladi.
- Yoʻqolgan kalit — yoʻqolgan fayl. Havola kalitini tiklay olmaymiz, qayta oʻrnata olmaymiz va qaytadan yarata olmaymiz — u hech qachon bizda boʻlmagan. Tizim aynan shunday ishlashi kerak, lekin «Parolni unutdingizmi?» tugmasiga oʻrganganlarni bu ajablantiradi.
Zaiflik topdingizmi? Bizga xabar bering.
Agar zaiflik topsangiz, bu haqda chindan ham eshitishni istaymiz — bu shunchaki odatiy gap emas: bu sahifa aynan sinchkov tekshiruv uchun yozilgan. Mavzu qatoriga «Security» soʻzini yozib, abuse@docuchan.com manziliga xat yuboring (bu manzil security.txt faylida ham koʻrsatilgan). Har bir xabarni oʻqiymiz, javob beramiz va xohlagan topuvchilarning nomini minnatdorlik bilan qayd etamiz. Iltimos, boshqa odamlarning fayllarida sinov oʻtkazmang.
— Beki, DocuChan yaratuvchisi · soddaroq tushuntirish · haqiqiy fayl bilan sinab koʻring