Preluăm controlul asupra criptografiei în stocarea în cloud MEGA. Stocare în cloud MEGA

Serviciul de stocare a datelor Mega co nz a fost lansat în 2013. În prima zi, 1 milion de utilizatori au vizitat site-ul, iar în prima oră s-au înregistrat peste 100.000 de utilizatori. Începând cu 2015, Mega stochează informații pe Internet pentru mai mult de 15 milioane de utilizatori.

Mega Cloud Service înseamnă „MEGA Encrypted Global Access”. La încărcarea datelor în stocare, toate fișierele sunt criptate în browser folosind algoritmul AES și stocate pe server în formă criptată. În plus, Mega nu stochează parole sau . Ele aparțin numai utilizatorului și nu pot fi restaurate de către companie. Dacă v-ați uitat parola, singura modalitate de a o recupera este să aveți o cheie principală Mega nz.

Stocarea datelor Mega conz - oferă atât spațiu gratuit, cât și cu plată pentru stocarea fișierelor pe Internet. Vă oferă posibilitatea de a stoca și accesa fișierele oriunde în lume. Are mai multe moduri de a încărca fișiere în spațiul de stocare Mega.nz folosind un browser web sau aplicații speciale pentru client.

Crearea unui cont cu Mega este ușoară. Trebuie să furnizați o adresă de e-mail și o parolă pentru a începe. Diferența dintre stocarea și stocarea Mega.co este că vei primi apoi 50 GB de spațiu liber pe disc pentru a stoca fișiere pe Internet și nu este nevoie să introduci informații despre cardul de credit în timpul înregistrării.

Cloudul Mega co este foarte ușor de navigat. Butoanele pentru descărcarea fișierelor și folderelor se află în bara de meniu de sus, iar sub aceasta sunt descărcate datele. În stânga este coloana de control și afișare în serviciul Mega cloud. Făcând clic pe butonul de meniu din dreapta sus, puteți schimba limba, puteți instala aplicații Add-On pe browserele Google Chrome, Mozilla Firefox, puteți sincroniza orice foldere de pe un computer care rulează Windows, Mac, Linux cu foldere din Mega cloud, sincronizați și descărcați-vă datele din cloud instalând aplicația mobilă Android iOS Blackberry Windows pe smartphone sau tabletă.


Stocarea fișierelor și partajarea lor în serviciul cloud Mega.co.nz este foarte simplă, creați un folder nou, încărcați fotografii, videoclipuri, documente sau alte informații în el făcând clic pe butonul „Încărcați fișierul” din meniul de sus. Magazinul de date Mega.nz nu limitează dimensiunea fișierului descărcat și viteza de descărcare decât dacă o limitați în setări.

Când faceți clic dreapta pe un folder din meniul derulant, îl puteți deschide, puteți obține un link pentru a descărca fișierul dintr-un serviciu cloud, puteți copia, redenumi, muta, șterge datele de pe disc.

Stocarea datelor Mega.nz oferă trei planuri plătite pentru stocarea fișierelor pe cloud:

PRO Ⅰ 500 GB 9,99 EUR/lună SAU 99,99 EUR/an
PRO Ⅱ 2TB GB 19,99 EUR/lună SAU 199,99 EUR/an
PROⅢ 4TB GB 29,99 EUR/lună SAU 299,99 EUR/an
Când achiziționați un plan PRO anual, primiți 2 luni gratuit.
Oricine poate folosi cloud-ul MEGA gratuit.

Înregistrați-vă pe Mega.co.nz

Mega | stocare în cloud Mega | Cloud Mega | Mega Stocare

După lansarea serviciului MEGA oarecum scandalos, conversațiile despre securitatea acestuia au început să fiarbă puțin și s-au stins. Astăzi serviciul își trăiește propria viață și nimeni nici măcar nu l-a rupt. Din anumite motive, termenul „User Controlled Encryption” (UCE, sau User Controlled Cryptography), cu care se laudă MEGA, a fost omis din toate conversațiile. Ceea ce vreau să spun prin „ratat” este faptul că nu am acoperit toate posibilitățile pe care ni le oferă un motor de criptare care rulează în JavaScript pe partea clientului.

Desigur, serviciul MEGA în sine înseamnă pur și simplu că cheile de criptare nu sunt stocate pe server, ci toate al lor criptografia se realizează în contextul browserului. Mai mult, după lansarea serviciului, s-a vorbit mult despre faptul că folosește algoritmi criptografici slabi și că în general totul este rău și vom muri cu toții, iar fișierele noastre vor fi citite de FSB. Acest lucru mi-a dat ideea de a extinde conceptul de „UCE” și de a prelua cu adevărat controlul asupra criptografiei, și anume, să înlocuiesc sau să completez unele dintre mecanismele de securitate ale serviciului.

În acest articol, voi descompune o parte din magia care se întâmplă în doi megaocteți de cod JavaScript MEGA și voi arăta cum puteți trece peste unele metode pentru a nu mai face griji și pentru a iubi criptografia. Ca urmare, vom primi un serviciu de stocare a fișierelor în cloud cu autentificare cu doi factori și criptare hardware a informațiilor critice.

MEGA, UCE și toate, toate, toate

Deci, să începem prin a ne uita la tehnologiile pe care este construită partea client a serviciului, cum sunt înregistrați noi utilizatori, cum sunt autentificați utilizatorii înregistrați, parolele sunt modificate și fișierele sunt încărcate/descărcate.

JavaScript

După cum probabil știți deja, întreaga parte client a serviciului se bazează pe JavaScript, codul paginii principale conține sume de control SHA-256 pentru toate scripturile și paginile care sunt încărcate de browser. Descărcarea în sine are loc după cum urmează: sumele de control sunt verificate pentru toate fișierele, după care sunt combinate într-un singur BLOB, care este dat browserului. Codul sursă al fișierelor js arată că au fost scrise de diferiți oameni și uneori există bijuterii amuzante, cum ar fi consecințele copy-paste, condiții fără sens și variabile pur și simplu ciudate.

În procesul de studiu a codului sursă al site-ului, am observat și că acesta este actualizat destul de activ, dezvoltatorii corectează erori minore și optimizează codul deja scris, ceea ce este o veste bună. Codul în sine este scris foarte simplu și fără prototipuri inutile: site-ul folosește trei sute de variabile globale și peste 8.000 de funcții. A fost foarte ușor să înțelegi arhitectura site-ului și să-i schimbi codul.

Printre cadrele terțe, MEGA folosește jQuery (nu poți trăi fără el acum), Ext JS și SJCL. Acesta din urmă implementează un nucleu criptografic cu criptare AES. SJCL oferă, de asemenea, un format interesant pentru stocarea cheilor și a altor matrice de octeți: în loc să stocheze pur și simplu octeți într-o matrice obișnuită, aceștia sunt „comprimați” într-un format numit a32. Esența sa este că conținutul oricărei matrice de octeți este împachetat în numere de 32 de biți și scris într-o matrice de lungime mai mică. Adică, fiecare 4 octeți ai matricei sunt convertiți într-un int banal. Codul site-ului conține funcții care efectuează tot felul de transformări pe un set improvizat (a32 array, string, string base64).

Informatie cheie

Înainte de a trece la descrierea proceselor de înregistrare și autentificare, merită să luați în considerare informațiile care fac obiectul criptării, și anume:
  • Cheia principală a contului, care este creat aleatoriu în momentul înregistrării utilizatorului și are o lungime de 128 de biți. Și, în principiu, lungimea tuturor cheilor utilizate pentru criptarea simetrică este de 128 de biți.
  • cheie privată RSA: Creat în momentul înregistrării pe baza mișcărilor mouse-ului și a introducerii tastaturii. În acest articol, nu mă voi concentra pe criptografia asimetrică, deoarece este folosită pentru partajarea fișierelor descărcate, iar sarcina mea a fost să schimb procesul de autentificare și criptare a datelor utilizatorului.
  • Cheile de fișiere individuale și fișierele în sine, încărcat în serviciu. Cheile sunt generate aleatoriu atunci când un fișier este încărcat, cheia în sine este folosită pentru a cripta datele fișierului și o cheie creată pe baza cheii individuale a fișierului și suma de control este utilizată pentru a cripta atributele.

Mai aproape de cod

Acum îmi propun să analizăm procesele de înregistrare și autentificare, să vedem cum este creată cheia principală și cum este criptată.
Am încercat să descriu aceste procese pe hârtie și pentru a vă oferi o înțelegere a esenței nebuniei, am făcut chiar această fotografie:

Înregistrarea unui nou utilizator

Procesul de înregistrare în sine este destul de confuz după ce utilizatorul completează chestionarul, sunt apelate o mulțime de funcții, dar ne interesează funcția api_createuser:

// crearea unui utilizator nou și a funcției cheie master api_createuser(ctx, invitcode, invitename, uh) ( var i; var ssc = Array(4); // sesiune self challenge, va fi folosită pentru a verifica parola var req, res; if (!ctx.passwordkey) ( ctx.passwordkey = Array(4); for (i = 4; i--;) ctx.passwordkey[i] = rand(0x100000000); ) if (!u_k) api_create_u_k(); // generarea unei chei master aleatoare u_k pentru (i = 4; i--;) ssc[i] = rand(0x100000000 // generarea unei secvențe de autentificare aleatorie if (d) console.log("api_createuser - masterkey: "); + u_k + " passwordkey: " + ctx.passwordkey // criptați cheia principală pe parola curentă și trimiteți-o la server (câmpul k) // câmpul ts este concatenarea lui ssc cu valoarea sa criptată req = (); a: „sus” , k: a32_to_base64(encrypt_key(new sjcl.cipher.aes(ctx.passwordkey), u_k)), ts: base64urlencode(a32_to_str(ssc) + a32_to_str(encrypt_key(new sjcl.cipherk.a) , ssc))) ); if (invitecode) (req.uh = uh; req.ic = invitcode; req.name = nume invitație; ) if (d) console.log ("Stocare cheie: " + req.k); api_req(, ctx); )
În această funcție ne interesează următoarele lucruri:

  • u_k este cheia principală în sine, o variabilă globală. O matrice de 4 numere pe 32 de biți, care este creată de funcția api_create_uk
  • ssc este pur și simplu o matrice aleatorie care este criptată cu cheia principală, concatenată cu valoarea sa publică și trimisă la server. Mai târziu, va fi folosit pentru a verifica corectitudinea cheii principale în timpul autentificării
  • sjcl - bibliotecă criptografică care implementează AES
  • rand() - implementare locală a unui generator de numere pseudoaleatoare bazat pe RC4
  • encrypt_key() este piatra de temelie a criptografiei simetrice a serviciului. Acceptă un obiect sjcl inițializat cu o cheie și o matrice care trebuie criptată. Codul funcției este mai jos și sperăm că se explică de la sine.
// criptează/decriptează funcția matrice întregi pe 32 de biți cu 4 sau 8 elemente encrypt_key(cipher, a) ( dacă (a.length == 4) return cipher.encrypt(a); var x = ; for (var i = 0;< a.length; i += 4) x = x.concat(cipher.encrypt(, a, a, a])); return x; }
Ca urmare, după înregistrare, următoarele sunt trimise către server:
  • Cheie principală criptată cu cheia derivată din parola contului
  • Șir ca ssc||encrypt_AES-128(u_k, ssc)

Logare utilizator

Acum puteți trece fără probleme la procesul de autentificare. Pe scurt, se procedează astfel:
  1. Utilizatorul introduce login/parola
  2. Dacă prima etapă de autentificare este trecută, atunci o cheie principală criptată și o secvență de autentificare (ssc) creată în timpul înregistrării sunt primite de la server
  3. Cheia principală este decriptată folosind parola introdusă de utilizator
  4. Secvența de autentificare este decriptată pe cheia principală și comparată cu valoarea deschisă a acesteia - verificându-se astfel corectitudinea cheii principale și a parolei.
Funcția de apel invers api_getsid2 este responsabilă pentru toate cele de mai sus:

// decriptează cheia principală după ce utilizatorul se conectează la funcția api_getsid2(res, ctx) ( var t, k; var r = false; if (typeof res == "obiect") ( // inițializează sjcl-aes cu contul curent parola var aes = new sjcl.cipher.aes(ctx.passwordkey); // dacă am primit o cheie principală în răspunsul serverului... if (typeof res.k == "șir") ( k = base64_to_a32(res. k); if (k.length == 4) ( // ... atunci decriptați-l k = decrypt_key(aes, k); // și reinițializați sjcl-aes folosind cheia principală aes = new sjcl.cipher. aes(k); // dacă am primit ssc din procesul de înregistrare if (typeof res.tsid == "șir") ( t = base64urldecode(res.tsid); // criptăm prima jumătate a șirului și comparăm-o cu valoarea de pe server // dacă s-au potrivit - înseamnă că toate login-urile și parolele se potrivesc și puteți lăsa utilizatorul să intre dacă (a32_to_str(encrypt_key(aes, str_to_a32(t.substr(0, 16)))) == t .substr(-16)) r = ) // Cheia privată a perechii RSA este analizată mai jos, încă nu ne interesează acest lucru altfel dacă (typeof res.csid == "șir") ( var t = mpi2b(base64urldecode (res.csid)); var privk = a32_to_str(decrypt_key(aes, base64_to_a32(res.privk))); var rsa_privk = Array(4); // descompune cheia privată pentru (var i = 0; i< 4; i++) { var l = ((privk.charCodeAt(0) * 256 + privk.charCodeAt(1) + 7) >> 3) + 2; rsa_privk[i] = mpi2b(privk.substr(0, l)); if (tip de rsa_privk[i] == „număr”) break; privk = privk.substr(l); ) // verificați formatul dacă (i == 4 && privk.length< 16) { // TODO: check remaining padding for added early wrong password detection likelihood r = ; } } } } } ctx.result(ctx, r); }
Ca bonus la înregistrare/autentificare, puteți arunca o privire asupra procesului de schimbare a parolei.

// schimbarea funcției parolei utilizator changepw(currentpw, newpw, ctx) ( var pw_aes = new sjcl.cipher.aes(prepare_key_pw(newpw)); api_req([( a: "up", currk: a32_to_base64(encrypt_key(new sjcl) . cipher.aes(prepare_key_pw(currentpw)), u_k)), k: a32_to_base64(encrypt_key(pw_aes, u_k)), uh: stringhash(u_attr["email"].toLowerCase(), pw_aes) )], ctx);
Codul pentru această funcție se explică de la sine: criptăm cheia principală cu două chei obținute din parolele vechi și noi, apoi trimitem aceste valori către server. Dacă parola curentă este corectă, aceasta este înlocuită cu una nouă. Aici am vrut să atrag mai multă atenție asupra funcției prepare_key_pw, care era implicit prezentă în toate operațiunile anterioare. Sarcina sa este de a converti parola șir într-o matrice a32 și apoi de a efectua operația de derivare a cheilor după cum urmează:

// convertiți funcția de matrice de parole furnizată de utilizator prepare_key(a) ( var i, j, r; var aes = ; var pkey = ; for (j = 0; j)< a.length; j += 4) { key = ; for (i = 0; i < 4; i++) if (i + j < a.length) key[i] = a; aes.push(new sjcl.cipher.aes(key)); } for (r = 65536; r--;) for (j = 0; j < aes.length; j++) pkey = aes[j].encrypt(pkey); return pkey; }
Această caracteristică a provocat multe critici, deoarece se bazează pe un algoritm de acasă. În timpul scrierii acestui articol, creatorii serviciului au reușit să-și schimbe puțin codul, dar nu am observat modificări semnificative. Esența sa este că parola transmisă este criptată de 65536 de ori folosind o cheie constantă pentru a obține o cheie care nu se poate distinge de una aleatorie. De ce creatorii serviciului nu au folosit algoritmi existenți (de exemplu, PBKDF2) rămâne un mister.

Încărcarea și criptarea fișierelor

Pe scurt, întreg acest proces poate fi reprezentat astfel:

Vă avertizez că adâncirea în această imagine pentru o lungă perioadă de timp este periculoasă pentru creier, așa că mai jos vă voi spune cum se întâmplă totul.

După cum am spus deja, la descărcare, fiecare fișier își creează propria cheie aleatorie de matrice de 6 numere pe 32 de biți. Primele patru elemente ale acestei matrice sunt folosite pentru a cripta conținutul fișierului, iar ultimele două sunt utilizate ca valori inițiale ale contorului care este utilizat pentru a calcula suma de control a fișierului. Această matrice este stocată în variabila globală ul_key. Conținutul său este introdus în șirul serializat JSON ul_KeyNonce .

Decriptarea în sine are loc folosind un Web Worker (dacă browserul acceptă această tehnologie) sau pur și simplu în interiorul codului paginii principale. Când un fișier este gata pentru a fi trimis, o nouă cheie, filekey , este creată pentru a-i cripta atributele (în prezent doar numele fișierului) pe baza ul_key și a sumei de control a fișierului. Această cheie este apoi criptată cu cheia principală și trimisă la server împreună cu atributele fișierului. Funcțiile initupload3 și api_completeupload2 sunt responsabile pentru toate aceste acțiuni. Filekey este creat în funcția ul_chunkcomplete, mai jos voi da o parte din ea.

// începe încărcarea fișierului: crearea cheii sale individuale și inițializarea funcției mecanismului de criptare initupload3() ( // ... cut =) // crearea unei chei individuale aleatorii pentru fișier // ul_key este folosit în codul paginii, / / ul_keyNonce este transmis la Web Worker și folosit acolo // pentru a cripta un fișier și a calcula suma de control al acestuia ul_key = Array(6); pentru (i = 6; i--;) ul_key[i] = rand(0x100000000); ul_keyNonce = JSON.stringify(ul_key); ul_macs = ; // ... următorul procesează coada de descărcare, nu prezintă interes... // inițializează sjcl-aes pentru un fișier bazat pe ul_key ul_aes = new sjcl.cipher.aes(); // ... // începe procesul de încărcare a fișierului: // citirea acestuia de pe disc, criptarea și trimiterea onUploadStart(ul_queue_num); ul_dispatch_chain(); ) // crearea unei chei pentru a cripta atributele fișierului funcția ul_chunkcomplete(slot,pos,response) ( // ... var t = ; // ul_macs - o matrice cu suma de verificare a fișierului obținută în interiorul lucrătorului pentru (p în ul_macs) t .push(p) // umplerea și sortarea unui tablou temporar, dacă cineva știe de ce, vă rugăm să explicați t.sort(function(a,b) ( return parseInt(a)-parseInt(b) ));< t.length; i++) t[i] = ul_macs]; // внутри condenseMacs производится зашифрование // и "уплотнение" контрольной суммы файла в массив из 4х элементов var mac = condenseMacs(t,ul_key); ul_settimeout(-1); // на основе контрольной суммы и ключа файла создается ключ для шифрования атрибутов // он же в зашифрованном виде позже будет отправлен на сервер var filekey = ; // ... } // завершение загрузки файла: зашифрование атрибутов и ключа файла и отправка их на сервер function api_completeupload2(ctx, ut) { var p; if (ctx.path && ctx.path != ctx.n && (p = ctx.path.indexOf("/")) >0) ( var pc = ctx.path.substr(0, p); ctx.path = ctx.path.substr(p + 1); fm_requestfolderid(ut, pc, ctx); ) else ( // criptează numele fișierului to key derivată din ul_key și checksum // ctx.k == filekey a = ( n: ctx.n ) if (d) console.log(ctx.k) = enc_attr(a, ctx.k); if (d) console.log(ea) // transfer de atribute și cheie de fișier criptată pe cheia principală var req = ( a: "p", t: ut, n: [( h: ctx.t, t:); 0, a: ab_to_base64(ea), // atribute k: a32_to_base64(encrypt_key(u_k_aes, ctx.k)), // == AES_encrypt(u_k, filekey) fa: ctx.fa )] ); fost furnizat: criptați toate acțiunile relevante var sn = fm_getsharenodes(ut) if (sn.length) ( req.cr = crypto_makecr(, sn, false); req.cr = ctx.t; ) ) api_req(, ctx. ctx);

Descărcarea și decriptarea fișierelor

Evident, aceste procese ar trebui să fie pur și simplu inversul criptării fișierului. Singurul lucru care poate fi de interes este obținerea valorii cheii ul_key din valoarea cheie de fișier criptată care a venit de la server.

În momentul în care fișierul este descărcat, contextul browserului conține deja un obiect care stochează cheile fișierului decriptat. Prin urmare, mai întâi are sens să luăm în considerare procesul care are loc imediat după autentificarea utilizatorului, și anume, descărcarea managerului de fișiere. După ce utilizatorul a fost permis să intre în serviciu, el dorește în mod natural să obțină acces la fișierele sale (presupunând că le avea deja acolo). Pentru a face acest lucru, trebuie să decriptăm mai întâi cheile fișierelor și apoi atributele acestora. Această problemă este tratată de un alt pachet de funcții, dintre care ne interesează loadfm_callback și process_f_f .

Pe scurt, procesul de obținere a atributelor fișierului poate fi descris de următorul algoritm:

  1. Așteptați ca managerul de fișiere să se încarce (loadfm_callback), unde puteți obține JSON cu o descriere a tuturor fișierelor descărcate
  2. Creați un array farray în care să puneți o matrice cu informații despre fișiere
  3. Rulați (recursiv) funcția process_f_f pentru fiecare fișier
  4. Pentru fiecare fișier care are o cheie, decriptați acea cheie și atributele (funcția crypto_processkey) și salvați-le înapoi într-o matrice cu informații despre fișier
  5. După aceea, salvați valorile decriptate în variabila FileStore (sfârșitul recursiunii în process_f_f)
Mai jos voi furniza fragmente de cod care ilustrează acest algoritm

// apel invers pentru încărcarea funcției manager de fișiere loadfm_callback(json, res) ( // ... // procesează JSON cu informații despre fișierele json = json; if (d) console.log(json); if (d) console. log (json); if (json.u) process_u(json.u, false); ( u_sharekeys.h]) ( sharingData.push(( id: json.s[i].h + „_" + json.s[i].u, userid: json.s[i].u, folderid: json s[i].h, drepturi: json.s[i].r, data: json.s[i].ts )); sharednodes.h] = true ) ) ) .. // introducerea informațiilor despre fișiere într-o altă matrice globală farray = new Object farray.f = json.f // începerea procesării acestuia, callback-ul a fost declarat mai sus // ​​în această funcție și pur și simplu modifică aspectul process_f(. fi, false , callback fi++ ) // funcție recursivă în care cheile și atributele de fișiere sunt decriptate // apelate din funcția process_f process_f_f(fid) ( // condiția finală a recursiunii - am procesat toate fișierele din matricea farray if ( !farray.f.i ]) ( dacă (farray.ap) FileStore.suspendEvents(); // scrierea datelor în FileStore FileStore.loadData(farray.mdata, true); if (farray.ap) FileStore.resumeEvents(); if (d) console.log("call reqmissingkeys:"); crypto_reqmissingkeys(); if (farray.callback) farray.callback.fn(farray.callback); returnează fals; ) var f = farray.f.i]; f.attrs = f.a; if (f.sk) u_sharekeys = crypto_process_sharekey(f.h, f.sk); // dacă fișierul se potrivește cu tipul și are o cheie, atunci procesează-l dacă ((f.t !== 2) && (f.t !== 3) && (f.t !== 4) && (f.k)) ( crypto_processkey(u_handle) , u_k_aes , f); // descrierea acestei funcții de mai jos u_nodekeys = f.key if ((typeof f.name !== "undefined") && (f.p == InboxID)) else ( if (f.a) ( if ( !missingkeys) ( missingkeys = true; new missingkeys = true; ) ) f.k = "" f.name = "" ) if (f.t == 2) RootID = f.h; else if (f.t == 3) InboxID = f.h; else if (f.t == 4) TrashbinID = f.h; altfel dacă ((f.t< 2) || (f.t == 5)) { // тут идет обработка расшаренных файлов } else { // подготовка массива для записи в FileStore farray.mdata.push({ id: f.h.replace(/[^a-z^A-Z^0-9^_^-]/g, ""), name: f.name, size: f.s, type: filetype(f.name, f.t), icon: fileicon(f.name, icontype), parentid: f.p, folder: f.t, owner: f.u, date: f.ts, attrs: f.attrs, key: f.key, r: f.r, su: f.su, fa: f.fa, }); if (f.p == TrashbinID) trashbinfull = true; if (((f.t) && (farray.ap)) || (f.p == InboxID)) refreshtree = true; } farray.i++; // проверка таймаута (видимо, чтобы загрузка файл-менеджера не выглядела слишком долгой) timeoutcount++; if (!(timeoutcount & 63)) { // если у нас больше 63 файлов - дальше грузим их асинхронно setTimeout("process_f_f(" + fid + ")", 1); timeoutcount2++; } // иначе - запускаем обработку следующего файла else process_f_f(fid); } // обработка ключа файла и его атрибутов function crypto_processkey(me, master_aes, file) { var id, key, k, n; if (!file.k) { if (!keycache) return; file.k = keycache; } id = me; // do I own the file? (user key is guaranteed to be first in .k) // ключ записан в виде ":/" var p = file.k.indexOf(id + ":"); // verificați mai întâi dacă fișierul este partajat dacă (p) ( // eu nu - am o cheie de partajare potrivită? pentru (id în u_sharekeys) ) ( p = fișier.k.indexOf(id + ":"); dacă (p >= 0 && (!p || fișier.k.charAt(p - 1) == "/")) pauză; p = -1; ) ) // și apoi putem trece la decriptare dacă (p >= 0) ( ștergeți keycache; // slash este probabil un semn de partajare var pp = file.k.indexOf("/", p) ; dacă (pag< 0) pp = file.k.length; p += id.length + 1; key = file.k.substr(p, pp - p); // we have found a suitable key: decrypt! if (key.length < 46) { // short keys: AES k = base64_to_a32(key); // check for permitted key lengths (4 == folder, 8 == file) if (k.length == 4 || k.length == 8) { // ключ расшифровывается либо на мастер-ключе, либо на общем ключе шары k = decrypt_key(id == me ? master_aes: new sjcl.cipher.aes(u_sharekeys), k); } else { if (d) console.log("Received invalid key length (" + k.length + "): " + file.h); return; } } else { // long keys: RSA if (u_privk) { var t = mpi2b(base64urldecode(key)); if (t) k = str_to_a32(crypto_rsadecrypt(t, u_privk).substr(0, file.t ? 16: 32)); else { if (d) console.log("Corrupt key for node " + file.h); return; } } else { if (d) console.log("Received RSA key, but have no public key published: " + file.h); return; } } // декодируем атрибуты файла var ab = base64_to_ab(file.a); // и расшифровываем их с помощью только что полученного ключа var o = dec_attr(ab, k); if (typeof o == "object") { if (typeof o.n == "string") { if (file.h) { u_nodekeys = k; if (key.length >= 46) rsa2aes = a32_to_str(encrypt_key(u_k_aes, k)); ) // dacă am decriptat corect cheia și atributele, le salvăm într-un obiect fișier file.key = k; file.name = o.n; ) ) ) else ( if (d) console.log ("Nu s-a primit nicio cheie adecvată: " + fișier.h); if (!missingkeys) ( chei lipsă noi = adevărat; chei lipsă = adevărat; ) keycache = fișier.k; ) )
După aceasta, putem obține valoarea cheii originale ul_key din contextul browserului astfel: dl_keyNonce = JSON.stringify();
Această conversie are loc în funcția startdownload. Dacă luăm în considerare că valoarea dl_key == filekey din funcția ul_chunkcomplete și efectuăm operații simple de adăugare modulo, vom observa că variabila dl_keyNonce va stoca valoarea ul_key generată la încărcarea fișierului. O ilustrare a acestui lucru poate fi văzută în colțul din stânga jos al panoului în fotografia de la începutul secțiunii despre încărcarea fișierelor.

„Supraîncărcarea” operațiunilor criptografice

În ciuda faptului că principiile de mai sus pentru protejarea fișierelor și cheilor sunt foarte sigure, unora s-ar putea să nu le placă faptul că depindem în continuare de implementarea algoritmilor pe care serviciul îi oferă. În acest caz, putem dezvolta propria noastră extensie de browser, care va suprascrie unele dintre funcțiile serviciului, implementând criptare suplimentară în ele. Și anume, am decis să implementez protecția informațiilor cheie (cheia principală și cheile fișierelor) folosind criptarea hardware pe o cheie neamovibilă conform algoritmului GOST 28147-89. Un bonus la acest lucru va fi și includerea autentificării cu doi factori în serviciu.
Deci, să luăm în considerare acest caz de utilizare:
  • Utilizatorul se înregistrează pe serviciu
  • Apoi instalează extensia
  • Cu ajutorul acestuia, criptarea hardware a cheii principale se realizează folosind o cheie care nu poate fi extrasă din token.
  • Cheia principală criptată în acest mod este încărcată pe server
După aceasta, va fi imposibil să obțineți valoarea cheii principale fără a deține simbolul și codul PIN al acestuia. Aceasta va da:
  1. Autentificare cu doi factori pe serviciu (fără o cheie principală decriptată corect, funcția api_getsid2 va eșua)
  2. Fără un token, nu veți putea modifica parola curentă a contului.
Următorul pas este criptarea utilizând simbolul cheii de criptare a fișierelor (cunoscut și ca ul_key) și cheia atributului fișierului (filekey), care este stocată pe server. Astfel, vom obține că fiecare fișier va fi criptat cu o cheie care nu va ajunge niciodată la server, unde va merge cheia de fișier pe care am criptat-o ​​din funcția api_completeupload2. Atributele fișierelor vor fi criptate pe valoarea publică a filekey . Pentru o mai mare claritate, am schițat următoarea diagramă care ilustrează procesul de descărcare a unui fișier:

Vreau să remarc că aici am folosit o metodă foarte vicleană. În acest caz, este important pentru noi ca un atacator să nu poată decripta fișierul, chiar dacă interceptează cheia fișierului primită de la server și cunoaște cheia principală a utilizatorului. Prin urmare, aici puteți juca pe particularitățile arhitecturii serviciului și puteți utiliza valoarea cheii ul_keyNonce (alias dl_keyNonce) obținută prin criptarea valorii cheii ul_key (sau dl_key) pentru a cripta fișierele.

De când au fost scrise aceste articole, produsul nostru a adăugat capacitatea de a utiliza criptarea hardware folosind algoritmul GOST 28147-89. Versiunea beta a pluginului cu funcționalitate de criptare hardware în conformitate cu algoritmul GOST 28147-89 poate fi descărcată. Această versiune a pluginului nu a fost încă testată complet, așa că vă avertizez că poate conține erori, vă rugăm să le raportați într-un mesaj personal.
În interfața pluginului, criptarea simetrică este implementată de funcția de criptare, care are următoarea sintaxă:
criptare (deviceId, keyLabel, data, resultCallback, errorCallback) → (șir)
Funcția are ca intrare:

  • ID dispozitiv, număr
  • Eticheta cheii de criptare, număr (dacă nu există o astfel de cheie, va fi generată)
  • Date criptate, șir (șir care conține o matrice de octeți de forma „aa:bb:cc:dd”)
  • Funcții de apel invers pentru finalizarea cu succes și fără succes a unei operațiuni de criptare
Decriptarea se face în același mod folosind funcția de decriptare
O atenție deosebită trebuie acordată etichetei cheii, deoarece aceasta determină pe ce cheie vor fi decriptate datele. Eticheta este un șir arbitrar și servește în principal la identificarea convenabilă a cheii. În acest caz, folosesc două perechi de chei: una pentru a cripta cheia principală, a doua pentru a cripta cheile de fișiere individuale. Cheia pe care este criptată cheia principală are o etichetă egală cu parola utilizatorului (acum mi-a venit ideea de a folosi un hash din e-mail||șirul de parole, voi remedia asta în curând viitor). Pentru a cripta cheile fișierelor descărcate, se folosește o cheie cu o etichetă egală cu reprezentarea șirului cheii principale (aici merită să utilizați și hash-ul cheii principale).

Dezvoltare directă

Aș dori să fac imediat o notă despre codul meu sursă: este, de fapt, într-o versiune alfa, deși implementează funcționalitatea descrisă mai sus. Nu am verificat cât de compatibilă s-a dovedit modificarea mea cu celelalte funcții ale serviciului, așa că am postat toate sursele pe github și voi fi bucuros pentru orice ajutor în finalizarea acestui sistem. Prin urmare, nu voi aglomera articolul în continuare cu liste uriașe, ci voi descrie doar schema generală a modului în care funcționează extensia.

Extensia finalizată poate fi descărcată. A fost dezvoltat folosind serviciul Crossrider, care oferă extensii pentru trei browsere (Chrome, Firefox și IE), dar este mai bine să-i verificați funcționarea în Chrome sau Firefox, iar în primul funcționează mult mai stabil.

Codul extensiei este destul de simplu: verifică dacă ne aflăm pe pagina de serviciu și dacă da, pur și simplu încarcă scripturi suplimentare. Aceste scripturi modifică codul paginii, adăugând câteva casete de dialog și înlocuiesc următoarele funcții de serviciu:

  • changepw: responsabil pentru schimbarea parolei
  • api_getsid2: unul dintre apelurile de conectare
  • api_completeupload2: apel invers pentru a finaliza încărcarea fișierului
  • loadfm_callback: managerul de fișiere încărcă apel invers
  • processpacket: un alt apel invers, în care atributele fișierului tocmai descărcat sunt decriptate
  • parsepage: responsabil pentru desenarea dialogurilor suplimentare
  • dologin: extinde capacitățile de autentificare
  • initupload3: responsabil pentru crearea cheii de criptare a fișierului
  • startdownload: analizați invers cheia fișierului și inițializați descărcarea
Încă o dată vreau să vă avertizez că nu ar trebui să trageți extensia în contul dvs. de serviciu (dacă cineva de aici folosește acest serviciu), dar este mai bine să creați unul de testare. Pentru a utiliza extensia după instalare, veți avea nevoie de:
  1. Pentru a începe, este o idee bună să obțineți Rutoken EDS (sau Rutoken Web) și să instalați un plugin de browser
  2. Instalați extensia
  3. Conectați-vă la serviciu cu extensia dezactivată
  4. Activați extensia în browser
  5. Accesați pagina contului
  6. Faceți clic pe butonul „Bind token”.
  7. Introduceți parola curentă și efectuați această operație
În loc de extensie, puteți folosi următorul bookmarklet (testat în Chrome, Safari, Firefox): javascript:(function())(if(document.getElementById("cryptorutokenjs")))(alert("Plugin-ul este deja instalat" );return)funcție loadRemoteScript(url )(var script=document.createElement("script");script.type="text/javascript";script.src=url;document.head.appendChild(script))funcție loadRemoteStyle( url)(var style=document. createElement("link");style.rel="stylesheet";style.type="text/css";style.href=url;document.head.appendChild(style))loadRemoteStyle( "https://mega-crypto .googlecode.com/git/mega.css");loadRemoteScript("https://mega-crypto.googlecode.com/git/util.js");loadRemoteScript("https:/ /mega-crypto.googlecode.com /git/rutoken-extra.js");loadRemoteScript("https://mega-crypto.googlecode.com/git/rutoken-crypto.js");loadRemoteScript("https:/ /mega-crypto.googlecode.com /git/mega.js")))();

Demonstrație de muncă

Mai întâi, să conectăm creația noastră la site. Pentru aceasta:

Apoi, puteți să vă deconectați de la serviciu și să încercați să vă conectați din nou utilizând autentificarea cu doi factori:

Autentificarea are loc conform următoarei scheme:

  1. Verificarea perechii de conectare-parolă pe server
  2. Dacă autentificarea și parola sunt corecte, atunci o cheie principală criptată vine de la server
  3. Pluginul solicită un cod PIN pentru token
  4. Dacă PIN-ul este introdus corect, atunci cheia principală este decriptată pe cheia din token

În loc de o concluzie

Aici îmi vine să scriu „a fi continuat...”, din moment ce nu am acoperit detaliile creării extensiei și interesul înșurubării funcțiilor de criptare asincronă într-un serviciu care în majoritatea cazurilor folosește apeluri sincrone. În încheierea acestui articol, aș dori să mă întorc din nou la ideea implementării criptografiei la nivelul clientului.
Abordarea implementării unor funcții criptografice suplimentare pe partea clientului poate fi aplicată oricărui serviciu web căruia nu îi pasă de ce este stocat pe serverul său: fie că este vorba de stocare de fișiere, e-mail sau un simplu chat. De exemplu, puteți implementa e-mail securizat pe baza oricărui serviciu de e-mail folosind criptarea mesajelor în format CMS și mecanisme de schimb de chei folosind algoritmul VKO GOST R 34.10-2001.
Vă mulțumim pentru atenție, aștept cu nerăbdare întrebările și comentariile dumneavoastră.javascript Adaugă etichete

Sunt sigur că toți utilizatorii activi de internet au auzit despre povestea închiderii popularului serviciu de găzduire a fișierelor Megaupload și despre nenorocirile creatorului său. Și cu siguranță știu despre noul proiect numit Kim Dotcom Mega. Permiteți-ne să vă reamintim că acest serviciu este reîncarnarea creației anterioare a lui Kim, dar pe o platformă complet diferită.

La crearea acestuia s-au luat în considerare toate deficiențele și erorile Megaupload și s-a pus accentul în primul rând pe stabilitatea serviciului de găzduire a fișierelor. Și nu numai la încărcările de rețea, ci și la atacurile deținătorilor de drepturi de autor. Pentru a realiza acest lucru, se acordă o mare atenție confidențialității și securității datelor dumneavoastră. Toate fișierele pe care le încărcați sunt criptate cu un algoritm special, astfel încât administrația serviciului habar nu are despre conținutul conturilor dvs. și, în consecință, nu poate fi făcută responsabilă pentru acesta. În același scop, serverele Mega sunt situate în țări diferite, așa că dacă există probleme cu legile dintr-o țară, acest lucru nu va duce la prăbușirea întregului serviciu și datele dumneavoastră vor rămâne intacte.

Astăzi vrem să vă prezentăm mai aproape de lucrul acestui serviciu și să vă oferim un mic tur de captură de ecran al funcțiilor acestuia.

Pentru a începe trebuie să vă înregistrați. Pentru a face acest lucru, trebuie să furnizați numele, adresa de e-mail și parola. Serviciul este perfect rusificat și perfect proiectat.

După finalizarea înregistrării, vi se va trimite un link de conectare la adresa de e-mail pe care ați furnizat-o. Făcând clic pe link, va trebui să așteptați câteva minute până când sunt generate chei secrete speciale pentru dvs., cu care datele vor fi criptate.

Intrăm în stocarea noastră în cloud. Totul aici este clar și simplu: arborele folderelor este în stânga, zona de afișare a fișierelor este în centru, iar bara de instrumente este în partea de sus. Fișierele pot fi descărcate făcând clic pe butonul Încărcare nouă sau pur și simplu trageți-l în fereastra de service. Descărcările sunt excepțional de rapide.

Fișierele pot fi organizate în foldere. Mutarea fișierelor între foldere se face prin glisare și plasare sau folosind meniul contextual (vezi mai jos). Nivelul de imbricare a directoarelor nu este limitat.

Un link pentru descărcarea fișierului este generat în fereastra pop-up care apare.
Observați opțiunile din partea de sus a acestei ferestre. Doar dacă este activat Link la fișier, atunci destinatarul dvs. nu va putea descărca fișierul fără a introduce o parolă specială, pe care o puteți trimite separat prin e-mail. În acest fel, puteți posta link-uri de descărcare în locuri publice, cum ar fi un blog sau un forum, dar permiteți doar anumitor persoane să descarce.
Dacă este marcat suplimentar Cheia fișierului, atunci oricine poate descărca fișierul folosind linkul creat. Casete de selectare NumeȘi mărime fișier adăugați caracteristicile corespunzătoare ale fișierului.

Meniul contextual al folderului este ușor diferit. Există un punct aici Partajarea. Cu acesta, vă puteți invita angajații, prietenii sau familia să împărtășească. Invitațiile sunt trimise prin e-mail și accesul poate varia. Numai citire - doar vizionare, Citeste, scrie— vizualizarea și încărcarea fișierelor într-un folder, Acces complet— vizualizarea, descărcarea și ștergerea fișierelor.

În capitolul Cont puteți vedea volumul spațiului de stocare, puteți cumpăra spațiu suplimentar, puteți modifica setările de transfer de date și alte opțiuni.

Câteva impresii personale

Serviciu de partajare a fișierelor Mega face o impresie grozavă. Viteză de operare excelentă, interfață clară și plăcută, 50 de gigaocteți de spațiu pe disc, fără restricții privind traficul și dimensiunea fișierelor descărcate, plus libertatea completă și confidențialitatea datelor dvs. Este doar un fel de vacanță!

Capacitățile serviciului Mega pot fi utilizate pentru o varietate de scopuri. În primul rând, aceasta este diseminarea diferitelor tipuri de informații, care vor mulțumi foarte mult pirații de pe toate continentele. Cu toate acestea, posibilitatea de acces limitat folosind parole poate fi utilă și pentru vânzarea legală a creațiilor acestora, de exemplu de către muzicieni. Partajarea folderelor face din Mega un instrument interesant pentru organizarea lucrului de la distanță. Și, desigur, o copie de rezervă banală a informațiilor care sunt importante pentru tine.

Singurul lucru care îi lipsește Mega în această etapă este un client desktop și mobil pentru diferite sisteme de operare. Având în vedere vârsta fragedă a serviciului, se poate spera că dezvoltatorii pur și simplu nu au avut încă timp și un astfel de client va apărea în curând. După aceasta, nu văd niciun obstacol pentru ca Mega să devină noul standard pentru stocarea fișierelor în cloud.

Mega este o stocare în cloud care oferă utilizatorilor 50 GB spațiu liber pe disc pentru stocarea datelor. O astfel de creștere a memoriei pe hard disk nu va fi de prisos pentru nimeni.

Extensia permite accesul la stocarea în cloud printr-un browser. Acest lucru reduce timpii de pornire, îmbunătățește performanța și îmbunătățește securitatea. Când vorbim despre stocarea pe disc MEGA, vorbim despre acces global securizat. Folosind o extensie de browser, fișierele necesare vor fi disponibile zi și noapte. MEGA oferă criptare end-to-end. Aceasta înseamnă că mesajele, fotografiile, videoclipurile sunt protejate împotriva căderii în mâini greșite. Numai acele stocări în cloud care au acces la date personale sunt sub controlul dumneavoastră. Nici MEGA nu are acces la ele! Spre deosebire de majoritatea celorlalte servicii cloud, dezvoltatorii MEGA susțin colaborarea sigură. Acest lucru vă permite să faceți schimb de informații, să vă conectați cu persoanele de contact și să vizualizați actualizări în timp real.

Spatiu mare de depozitare

MEGA nu este doar mai sigur decât concurenții săi. Cantitatea de stocare gratuită oferită este de multe ori mai mare decât cea a altora. Datorită funcției de sincronizare a fișierelor în timp real, toate fișierele sunt în siguranță și pot fi restaurate dacă este necesar. Pentru a asigura verificarea independentă a corectitudinii și integrității modelului criptografic, precum și a implementării acestuia, MEGA publică codul sursă complet al aplicațiilor client. Și face plăcere!

Astăzi, internetul oferă un număr mare de stocări de fișiere care sunt similare între ele. Primul lucru care îmi vine în minte: Yandex.Disk, Google Drive, Dropbox, OneDrive. Ceea ce face ca MEGA să fie diferit de concurenții săi este că oferă 50 GB de stocare gratuit pe disc pentru utilizatorii înregistrați. MEGA nu limitează dimensiunea fișierelor încărcate în cloud.

Mega cloud este un spațiu de stocare destul de popular pentru diferite fișiere, fotografii, videoclipuri și documente. Fiecare utilizator care își creează un cont pe site primește 50 GB de spațiu de stocare gratuit absolut gratuit. În viitor, acest volum poate fi mărit pentru o taxă suplimentară, de exemplu, puteți cumpăra 4 TB pentru 30 USD pe lună.

Acum vreau să fac o recenzie despre Mega cloud și să vorbesc despre principalele sale avantaje. Mulți utilizatori numesc această stocare în cloud cea mai favorabilă în ceea ce privește prețul și spațiul liber disponibil. De asemenea, dețin adesea diverse promoții, de exemplu, puteți cumpăra un pachet pentru un an și obțineți două luni absolut gratuit, ceea ce vă va economisi o sumă destul de importantă.

Principalele avantaje

Acum voi spune cititorilor mei despre principalele avantaje ale stocării Mega:

  • Serviciul este multilingv, astfel încât utilizatorii nu vor avea probleme asociate cu necunoașterea unei limbi străine. Înainte de a începe să lucrați cu stocarea în cloud, puteți selecta limba dorită;
  • spațiu pe disc suficient de mare, care este oferit absolut gratuit imediat după înregistrare;
  • Puteți încărca fișiere de orice dimensiune și extensie, deoarece nu există restricții pentru aceasta;
  • transferați fișiere prietenilor dvs. folosind acces criptat. Criptarea are loc în browser folosind un algoritm special, astfel încât utilizatorii sunt protejați în mod fiabil de accesul neautorizat la fișierele personale.

Înregistrare

Pentru a începe să utilizați Mega cloud storage, trebuie să vă înregistrați pe site-ul oficial. Este nevoie de:

Important! La completarea formularului, puteți furniza orice informație. Cu toate acestea, adresa de e-mail trebuie să fie reală, altfel nu veți putea începe să utilizați stocarea în cloud.

Începutul lucrării

După ce înregistrarea a fost finalizată, stocarea fișierelor Mega este gata de utilizare. Pentru a începe aveți nevoie de:

  1. Selectați cantitatea de spațiu liber, de exemplu, 50 GB, care este oferit gratuit și faceți clic pe butonul „Terminare”.
  2. Faceți clic pe butonul „Încărcați fișierul” și selectați fișierul necesar de pe computer pentru a-l încărca în cloud.

Toate folderele, fotografiile și documentele care vor fi încărcate în stocare pot fi vizualizate de pe orice computer sau alt dispozitiv.

Intrare

Pentru a intra în spațiul de stocare a fișierelor Mega de pe computer, veți avea nevoie de:


Cu aceasta aș dori să închei articolul meu despre Mega, recenzii despre care le puteți găsi pe Internet. Separat, aș dori să adaug că cei care folosesc browserul pot instala o extensie specială MEGA, care poate crește semnificativ viteza de descărcare a fișierelor în cloud. De asemenea, după instalarea suplimentului, puteți descărca fișiere în loturi într-o cantitate nelimitată. Fără a instala vreo aplicație, cel mai bine este să utilizați un browser.

  • Serghei Savenkov

    un fel de recenzie „scurtă”... de parcă ne-am grăbi pe undeva