Cách sử dụng đám mây lớn. MEGA, UCE và tất cả, tất cả, tất cả. Làm việc với đĩa trực tuyến Cloud@Mail thông qua ứng dụng Windows

Dịch vụ lưu trữ Dữ liệu lớn conz được cho ra mắt vào năm 2013. Vào ngày đầu tiên, 1 triệu người dùng đã truy cập trang web và trong vòng một giờ đầu tiên, hơn 100.000 người dùng đã đăng ký. Tính đến năm 2015, Mega lưu trữ thông tin trên Internet cho hơn 15 triệu người dùng.

Dịch vụ đám mây Mega là viết tắt của “Truy cập toàn cầu được mã hóa MEGA”. Khi tải dữ liệu lên bộ lưu trữ, tất cả các tệp đều được mã hóa trong trình duyệt bằng cách sử dụng thuật toán AES và được lưu trữ trên máy chủ ở dạng mã hóa. Ngoài ra, Mega không lưu trữ mật khẩu hoặc . Chúng chỉ thuộc về người dùng và công ty không thể khôi phục. Nếu bạn quên mật khẩu, cách duy nhất để khôi phục mật khẩu là có khóa chính Mega nz.

Lưu trữ dữ liệu Mega co nz - cung cấp cả không gian miễn phí và trả phí để lưu trữ tệp trên Internet. Mang đến cho bạn cơ hội lưu trữ và truy cập các tệp của mình ở mọi nơi trên thế giới. Nó có một số cách để tải tệp lên bộ lưu trữ Mega.nz bằng trình duyệt web hoặc ứng dụng khách đặc biệt.

Tạo một tài khoản với Mega thật dễ dàng. Bạn phải cung cấp một địa chỉ E-mail và mật khẩu để bắt đầu. Sự khác biệt giữa lưu trữ Mega.co và lưu trữ là khi đó bạn sẽ nhận được 50GB dung lượng đĩa trống để lưu trữ tệp trên Internet và bạn không cần nhập thông tin thẻ tín dụng trong quá trình đăng ký.

Đám mây Mega co rất dễ điều hướng. Các nút tải lên tập tin và thư mục được đặt ở bảng trên cùng menu và bên dưới nó là dữ liệu đã tải xuống. Bên trái là cột điều khiển và hiển thị trong dịch vụ Mega cloud. Bằng cách nhấn vào nút menu phía trên bên phải, bạn có thể thay đổi ngôn ngữ, cài đặt ứng dụng Add-On trên trình duyệt Google Chrome, Mozilla Firefox, đồng bộ mọi thư mục trên máy tính chạy hệ điều hành Hệ thống Windows, Mac, Linux với các thư mục trên đám mây Mega, đồng bộ hóa và tải lên dữ liệu của bạn với đám mây ứng dụng di động Android iOS Blackberry Windows trên điện thoại thông minh hoặc máy tính bảng.


Việc lưu trữ tệp và chia sẻ chúng trong dịch vụ đám mây Mega.co.nz rất đơn giản, hãy tạo một thư mục mới, tải ảnh, video, tài liệu hoặc thông tin khác vào đó bằng cách nhấp vào nút “Tải tệp lên” ở menu trên cùng. Kho dữ liệu Mega.nz không giới hạn kích thước file tải xuống cũng như tốc độ tải xuống trừ khi bạn giới hạn trong cài đặt.

Khi nhấp chuột phải vào một thư mục trong menu thả xuống, bạn có thể mở nó, lấy liên kết để tải tệp xuống từ dịch vụ đám mây, sao chép, đổi tên, di chuyển, xóa dữ liệu khỏi đĩa.

Lưu trữ dữ liệu Mega.nz cung cấp ba gói trả phí để lưu trữ tệp trên đám mây:

CHUYÊN NGHIỆP Ⅰ 500 GB € 9,99/tháng HOẶC € 99,99/năm
CHUYÊN NGHIỆP Ⅱ 2TB GB € 19,99/tháng HOẶC € 199,99/năm
PROⅢ 4TB GB € 29,99/tháng HOẶC € 299,99/năm
Khi mua gói PRO hàng năm, bạn sẽ được miễn phí 2 tháng.
Mọi người đều có thể sử dụng đám mây MEGA miễn phí.

Đăng ký với Mega.co.nz

Mega | lưu trữ đám mây Mega | Đám mây Mega | Bộ nhớ lớn

Sau khi ra mắt dịch vụ MEGA có phần tai tiếng, các cuộc thảo luận về tính bảo mật của nó bắt đầu sôi sục lên một chút rồi lắng xuống. Ngày nay, dịch vụ này có cuộc sống riêng của nó và thậm chí không ai phá vỡ nó. Vì lý do nào đó, thuật ngữ “Mã hóa do người dùng kiểm soát” (UCE hoặc Mật mã do người dùng kiểm soát), mà MEGA tự hào, đã bị bỏ qua trong tất cả các cuộc trò chuyện. Ý tôi khi nói "bỏ lỡ" là thực tế là chúng tôi chưa đề cập đến tất cả các khả năng mà một công cụ mã hóa chạy bằng JavaScript ở phía máy khách mang lại cho chúng tôi.

Tất nhiên, bản thân tôi Dịch vụ MEGAđiều này đơn giản có nghĩa là các khóa mã hóa không được lưu trữ trên máy chủ mà tất cả của họ mật mã được thực hiện trong ngữ cảnh của trình duyệt. Hơn nữa, sau khi ra mắt dịch vụ, đã có rất nhiều thảo luận về việc nó sử dụng không ổn định thuật toán mật mã và nói chung mọi thứ đều tồi tệ và tất cả chúng ta sẽ chết, và FSB sẽ đọc hồ sơ của chúng ta. Điều này đã cho tôi ý tưởng mở rộng khái niệm “UCE” và thực sự nắm quyền kiểm soát mật mã, cụ thể là thay thế hoặc bổ sung một số cơ chế bảo mật của dịch vụ.

Trong bài viết này, tôi sẽ chia nhỏ một số điều kỳ diệu xảy ra trong hai megabyte mã JavaScript MEGA và chỉ ra cách bạn có thể ghi đè một số phương pháp để ngừng lo lắng và yêu thích mật mã. Kết quả chúng ta sẽ nhận được dịch vụ lưu trữ file đám mây với xác thực hai yếu tố và mã hóa phần cứng của thông tin quan trọng.

MEGA, UCE và tất cả, tất cả, tất cả

Vì vậy, hãy bắt đầu bằng cách xem xét các công nghệ xây dựng phần máy khách của dịch vụ, cách người dùng mới được đăng ký, người dùng đã đăng ký được xác thực, mật khẩu được thay đổi và các tệp được tải lên/tải xuống.

JavaScript

Như bạn có thể đã biết, toàn bộ phía máy khách của dịch vụ đều dựa trên JavaScript, trong mã trang chủ Tổng kiểm tra SHA-256 được chỉ định cho tất cả các tập lệnh và trang được trình duyệt tải. Quá trình tải xuống diễn ra như sau: tổng kiểm tra được kiểm tra cho tất cả các tệp, sau đó chúng được kết hợp thành một BLOB, được cung cấp cho trình duyệt. Mã nguồn của tệp js cho thấy chúng được viết người khác và đôi khi có những viên ngọc quý buồn cười, chẳng hạn như hậu quả của việc sao chép-dán, những điều kiện vô nghĩa và đơn giản là những biến số kỳ lạ.

Trong quá trình nghiên cứu mã nguồn của trang, tôi cũng nhận thấy nó đang được cập nhật khá tích cực, các nhà phát triển đang sửa những lỗi nhỏ và tối ưu hóa mã đã viết sẵn, đó là một tin tốt. Bản thân mã được viết rất đơn giản và không cần tạo nguyên mẫu không cần thiết: trang web sử dụng ba trăm biến toàn cục và hơn 8.000 hàm. Rất dễ hiểu cấu trúc trang web và thay đổi mã của nó.

Trong số các framework của bên thứ ba, MEGA sử dụng jQuery (bạn không thể sống thiếu nó bây giờ), Ext JS và SJCL. Cái sau thực hiện lõi mật mã với mã hóa AES. SJCL cũng cung cấp một định dạng thú vị để lưu trữ khóa và các mảng byte khác: thay vì chỉ lưu trữ byte trong một mảng thông thường, chúng được “nén” thành định dạng gọi là a32. Bản chất của nó là nội dung của bất kỳ mảng byte nào được đóng gói thành các số 32 bit và được ghi thành một mảng có độ dài ngắn hơn. Nghĩa là, cứ 4 byte của mảng được chuyển đổi thành một int tầm thường. Mã trang web chứa các hàm thực hiện tất cả các loại biến đổi trên một tập hợp ngẫu hứng (mảng a32, chuỗi, chuỗi base64).

Thông tin mấu chốt

Trước khi chuyển sang mô tả quy trình đăng ký và xác thực, cần xem xét thông tin được mã hóa, cụ thể là:
  • Khóa chính của tài khoản, được tạo ngẫu nhiên tại thời điểm đăng ký người dùng và có độ dài 128 bit. Và về nguyên tắc, độ dài của tất cả các khóa được sử dụng để mã hóa đối xứng là 128 bit.
  • Khóa riêng RSA: Được tạo tại thời điểm đăng ký dựa trên chuyển động của chuột và đầu vào bàn phím. Trong bài viết này tôi sẽ không tập trung vào mật mã bất đối xứng vì nó được sử dụng cho truy cập công cộng vào các tệp đã tải xuống và tôi có nhiệm vụ thay đổi quy trình xác thực và mã hóa dữ liệu người dùng.
  • Các khóa tệp riêng lẻ và chính các tệp đó, đã tải lên dịch vụ. Các khóa được tạo ngẫu nhiên khi một tệp được tải xuống; chính khóa đó được sử dụng để mã hóa dữ liệu tệp và một khóa được tạo dựa trên khóa riêng của tệp và của nó. tổng kiểm tra.

Gần mã hơn

Bây giờ tôi đề xuất phân tích quá trình đăng ký và xác thực, xem cách tạo khóa chính và cách mã hóa.
Tôi đã cố gắng mô tả những quá trình này trên giấy và để giúp bạn hiểu về bản chất của sự điên rồ, tôi thậm chí còn chụp bức ảnh này:

Đăng Ký Người Dùng Mới

Bản thân quá trình đăng ký khá khó hiểu; sau khi người dùng điền vào bảng câu hỏi, rất nhiều hàm sẽ được gọi, nhưng chúng tôi quan tâm đến hàm api_createuser:

// tạo một người dùng mới và khóa chính của anh ta function api_createuser(ctx, Invitationcode, Invitationname, uh) ( var i; var ssc = Array(4); // phiên tự thử thách, sẽ được sử dụng để xác minh mật khẩu 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(); // tạo khóa chính ngẫu nhiên u_k for (i = 4; i--;) ssc[i] = rand(0x100000000); // tạo chuỗi xác thực ngẫu nhiên if (d) console.log("api_createuser - masterkey: " + u_k + " passkeykey: " + ctx.passwordkey); // mã hóa khóa chính trên mật khẩu hiện tại và gửi nó đến máy chủ (trường k) // trường ts là nối của ssc với giá trị được mã hóa req = ( a: "lên", 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(sjcl.cipher.aes(u_k) mới , ssc))) ); if (mã mời) ( req.uh = uh; req.ic = mã mời; req.name = tên người mời; ) if (d) console.log("Lưu khóa: " + req.k); api_req(, ctx); )
Trong chức năng này, chúng tôi quan tâm đến những điều sau đây:

  • u_k chính là khóa chính, một biến toàn cục. Một mảng gồm 4 số 32 bit, được tạo bởi hàm api_create_uk
  • ssc - đơn giản mảng ngẫu nhiên, được mã hóa bằng khóa chính, được nối với giá trị công khai của nó và gửi đến máy chủ. Sau này nó sẽ được sử dụng để kiểm tra tính chính xác của khóa chính trong quá trình xác thực
  • sjcl - thư viện mật mã triển khai AES
  • rand() - triển khai cục bộ trình tạo số giả ngẫu nhiên dựa trên RC4
  • Encrypt_key() - hàm nền tảng mật mã đối xứng dịch vụ. Chấp nhận một đối tượng sjcl được khởi tạo bằng một khóa và một mảng cần được mã hóa. Mã chức năng được đưa ra dưới đây và hy vọng không cần giải thích.
// mã hóa/giải mã 4 hoặc 8 phần tử mảng số nguyên 32-bit hàm Encrypt_key(cipher, a) ( if (a.length == 4) return cipher.encrypt(a); var x = ; for (var i = 0; tôi< a.length; i += 4) x = x.concat(cipher.encrypt(, a, a, a])); return x; }
Kết quả là, sau khi đăng ký, thông tin sau sẽ được gửi đến máy chủ:
  • Khóa chính được mã hóa bằng khóa lấy từ mật khẩu tài khoản
  • Chuỗi như ssc||encrypt_AES-128(u_k, ssc)

Đăng nhập người dùng

Bây giờ bạn có thể chuyển sang quá trình xác thực một cách suôn sẻ. Tóm lại, nó được thực hiện như thế này:
  1. Người dùng nhập thông tin đăng nhập/mật khẩu
  2. Nếu giai đoạn xác thực đầu tiên được thông qua, thì khóa chính được mã hóa và chuỗi xác thực (ssc) được tạo trong quá trình đăng ký sẽ được nhận từ máy chủ
  3. Khóa chính được giải mã bằng mật khẩu do người dùng nhập
  4. Trình tự xác thực được giải mã trên khóa chính và được so sánh với giá trị mở của nó - từ đó kiểm tra tính chính xác của khóa chính và mật khẩu.
Hàm gọi lại api_getsid2 chịu trách nhiệm cho tất cả những điều trên:

// giải mã master key sau khi người dùng đăng nhập function api_getsid2(res, ctx) ( var t, k; var r = false; if (typeof res == "object") ( // khởi tạo sjcl-aes bằng tài khoản hiện tại mật khẩu var aes = new sjcl.cipher.aes(ctx.passwordkey); // nếu chúng tôi nhận được khóa chính trong phản hồi của máy chủ... if (typeof res.k == "string") ( k = base64_to_a32(res. k); if (k.length == 4) ( // ... sau đó giải mã nó k = decrypt_key(aes, k); // và khởi tạo lại sjcl-aes bằng khóa chính aes = new sjcl.cipher. aes( k); // nếu chúng tôi nhận được ssc từ quá trình đăng ký if (typeof res.tsid == "string") ( t = base64urldecode(res.tsid); // mã hóa nửa đầu của chuỗi và so sánh với giá trị từ máy chủ // nếu chúng khớp - điều đó có nghĩa là tất cả thông tin đăng nhập và mật khẩu đã đồng ý và bạn có thể cho phép người dùng vào if (a32_to_str(encrypt_key(aes, str_to_a32(t.substr(0, 16)))) == t .substr(-16)) r = ; ) // được thảo luận bên dưới khóa riêng Các cặp RSA, chúng tôi chưa quan tâm đến vấn đề này nếu (typeof res.csid == "string") ( var t = mpi2b(base64urldecode(res.csid)); var privk = a32_to_str(decrypt_key(aes, base64_to_a32(res. privk ))); var rsa_privk = Array(4); // phân tách khóa riêng cho (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 (typeof rsa_privk[i] == "number") bị hỏng; riêng tư = riêng tư.substr(l); ) // kiểm tra định dạng if (i == 4 && privk.length< 16) { // TODO: check remaining padding for added early wrong password detection likelihood r = ; } } } } } ctx.result(ctx, r); }
Là một phần thưởng cho việc đăng ký/xác thực, bạn có thể xem quy trình thay đổi mật khẩu.

// thay đổi mật khẩu người dùng function 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); )
Mã cho chức năng này rất dễ hiểu: chúng tôi mã hóa khóa chính bằng hai khóa lấy được từ mật khẩu cũ và mật khẩu mới, sau đó gửi các giá trị này đến máy chủ. Nếu như Mật khẩu hiện tại xuất hiện, sau đó nó được thay thế bằng một cái mới. Ở đây tôi muốn thu hút sự chú ý nhiều hơn đến hàm prepare_key_pw, hàm này đã ngầm hiện diện trong tất cả các hoạt động trước đó. Nhiệm vụ của nó là chuyển đổi mật khẩu chuỗi thành mảng a32, sau đó thực hiện thao tác dẫn xuất khóa như sau:

// chuyển đổi mảng mật khẩu do người dùng cung cấp hàm 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; }
Tính năng này đã gây ra rất nhiều chỉ trích vì nó dựa trên thuật toán cây nhà lá vườn. Trong khi viết bài viết này, những người tạo ra dịch vụ đã cố gắng thay đổi mã của nó một chút, nhưng tôi không nhận thấy bất kỳ thay đổi đáng kể nào. Bản chất của nó là mật khẩu được truyền đi được mã hóa 65536 lần bằng cách sử dụng khóa cố định để có được khóa không thể phân biệt được với khóa ngẫu nhiên. Tại sao những người tạo ra dịch vụ không sử dụng các thuật toán hiện có(ví dụ PBKDF2) vẫn còn là một bí ẩn.

Tải lên và mã hóa tập tin

Tóm lại, toàn bộ quá trình này có thể được biểu diễn như thế này:

Tôi cảnh báo bạn, đi sâu vào bức tranh này lâu sẽ nguy hiểm cho não nên dưới đây tôi sẽ kể cho bạn nghe mọi chuyện diễn ra như thế nào.

Như tôi đã nói, khi tải, mỗi tệp sẽ tạo khóa mảng ngẫu nhiên gồm 6 số 32 bit. Bốn phần tử đầu tiên của mảng này được sử dụng để mã hóa nội dung của tệp và hai phần tử cuối cùng được sử dụng làm giá trị ban đầu của bộ đếm được sử dụng để tính tổng kiểm tra của tệp. Mảng này được lưu trữ trong biến toàn cục ul_key. Nội dung của nó được nhập vào chuỗi được tuần tự hóa JSON ul_KeyNonce.

Quá trình giải mã diễn ra bằng cách sử dụng Web Worker (nếu trình duyệt hỗ trợ công nghệ này) hoặc đơn giản là bên trong mã trang chính. Khi một tập tin đã sẵn sàng để được gửi đi, một chìa khoá mới filekey dựa trên ul_key và tổng kiểm tra tệp. Khóa này sau đó được mã hóa bằng khóa chính và gửi đến máy chủ cùng với các thuộc tính của tệp. Các hàm initupload3 và api_completeupload2 chịu trách nhiệm cho tất cả những hành động này. Filekey được tạo trong hàm ul_chunkcomplete, bên dưới mình sẽ đưa ra một phần.

// bắt đầu tải file: tạo key riêng và khởi tạo cơ chế mã hóa function initupload3() ( // ... cut =) // tạo key riêng ngẫu nhiên cho file // ul_key được sử dụng trong mã trang, / / ul_keyNonce được chuyển tới Web Worker và được sử dụng ở đó // để mã hóa một tệp và tính tổng kiểm tra của nó ul_key = Array(6); for (i = 6; i--;) ul_key[i] = rand(0x100000000); ul_keyNonce = JSON.stringify(ul_key); ul_macs = ; // ... tiếp theo là xử lý hàng đợi tải xuống, không đáng quan tâm... // khởi tạo sjcl-aes cho một file dựa trên ul_key ul_aes = new sjcl.cipher.aes(); // ... // bắt đầu quá trình tải tập tin lên: // đọc nó từ đĩa, mã hóa và gửi onUploadStart(ul_queue_num); ul_dispatch_chain(); ) // tạo khóa để mã hóa thuộc tính tệp function ul_chunkcomplete(slot,pos,response) ( // ... var t = ; // ul_macs - một mảng có tổng kiểm tra tệp thu được bên trong worker for (p in ul_macs) t .push(p); // điền và sắp xếp một mảng tạm thời, nếu có ai biết tại sao lại như vậy - vui lòng giải thích t.sort(function(a,b) ( return parseInt(a)-parseInt(b) )); for ( var i = 0;i< 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 ( // mã hóa tên tệp tới khóa bắt nguồn từ ul_key và tổng kiểm tra // ctx.k == filekey a = ( n: ctx.n ); if (d) console.log(ctx.k); var ea = enc_attr(a, ctx.k) ; if (d) console.log(ea); // truyền các thuộc tính và khóa tập tin được mã hóa trên khóa chính var req = ( a: "p", t: ut, n: [( h: ctx.t, t: 0, a: ab_to_base64(ea), // thuộc tính k: a32_to_base64(encrypt_key(u_k_aes, ctx.k)), // == AES_encrypt(u_k, filekey) fa: ctx.fa )] ); if (ut) ( // mục tiêu đã được cung cấp: mã hóa tất cả các chia sẻ có liên quan var sn = fm_getsharenodes(ut); if (sn.length) ( req.cr = crypto_makecr(, sn, false); req.cr = ctx.t; ) ) api_req(, ctx.ctx); ) )

Tải xuống và giải mã tập tin

Rõ ràng, các quy trình này chỉ đơn giản là đảo ngược quá trình mã hóa tệp. Điều duy nhất có thể quan tâm là lấy giá trị của khóa ul_key từ giá trị filekey được mã hóa đến từ máy chủ.

Tại thời điểm tệp được tải xuống, ngữ cảnh trình duyệt đã chứa một đối tượng lưu trữ khóa tệp được giải mã. Do đó, trước tiên nên xem xét quá trình xảy ra ngay sau khi xác thực người dùng, cụ thể là tải xuống trình quản lý tệp. Sau khi người dùng đã được phép sử dụng dịch vụ, đương nhiên anh ta muốn có quyền truy cập vào các tệp của mình (giả sử rằng anh ta đã có chúng ở đó). Để làm điều này, trước tiên chúng ta cần giải mã các khóa của tệp và sau đó là thuộc tính của chúng. Vấn đề này được giải quyết bằng một gói hàm khác mà chúng tôi quan tâm đến loadfm_callback và process_f_f .

Tóm lại, quá trình lấy thuộc tính tệp có thể được mô tả bằng thuật toán sau:

  1. Đợi trình quản lý tệp tải (loadfm_callback), nơi bạn có thể nhận JSON kèm theo mô tả về tất cả các tệp đã tải xuống
  2. Tạo một mảng farray để đặt một mảng chứa thông tin về các tập tin
  3. Chạy (đệ quy) hàm process_f_f cho mỗi tệp
  4. Đối với mỗi tệp có khóa, hãy giải mã khóa và thuộc tính đó (hàm crypto_processkey) và lưu chúng lại vào một mảng có thông tin tệp
  5. Sau đó, lưu các giá trị đã giải mã vào biến FileStore (kết thúc đệ quy trong process_f_f)
Dưới đây tôi sẽ cung cấp đoạn mã minh họa thuật toán này

// gọi lại để tải hàm quản lý tệp Loadfm_callback(json, res) ( // ... // xử lý JSON với thông tin về tệp json = json; if (d) console.log(json); if (d) console. log (json); if (json.u) process_u(json.u, false); if (json.ok) process_ok(json.ok); if (json.s) ( for (i in json.s) ( if ( u_sharekeys.h]) ( SharingData.push(( id: json.s[i].h + "_" + json.s[i].u, userid: json.s[i].u, folderid: json .s[i].h, quyền: json.s[i].r, date: json.s[i].ts ));sharednodes.h] = true; ) ) ) // ... thì chẳng có gì đặc biệt .. // nhập thông tin về các tập tin vào một mảng toàn cục khác farray = new Object; farray.f = json.f; // bắt đầu quá trình xử lý của nó, lệnh gọi lại đã được khai báo ở trên // ​​trong hàm này và chỉ cần sửa đổi bố cục process_f (fi, false , gọi lại); fi++; ) // Hàm đệ quy, trong đó các khóa và thuộc tính tệp được giải mã // được gọi từ hàm process_f process_f_f(fid) ( // điều kiện để kết thúc đệ quy - chúng tôi đã xử lý tất cả các tệp trong mảng farray if (!farray.f.i]) ( if (farray .ap) FileStore.susupEvents(); // ghi dữ liệu vào 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); return false; ) var f = farray.f.i]; f.attrs = f.a; if (f.sk) u_sharekeys = crypto_process_sharekey(f.h, f .sk); // nếu tệp khớp với loại và có khóa thì xử lý nó if ((f.t !== 2) && (f.t !== 3) && (f.t !== 4) && (f.k)) ( crypto_processkey (u_handle, u_k_aes, f); // mô tả hàm này bên dưới u_nodekeys = f.key; if ((typeof f.name !== "không xác định") && (f.p == InboxID)) InboxCount++; ) else ( if (f.a ) ( if (!missingkeys) (missingkeys = true; newmissingkeys = true; ) ) f.k = ""; f.name = ""; ) if (f.t == 2) RootID = f.h; ngược lại nếu (f.t == 3) InboxID = f.h; khác nếu (f.t == 4) Thùng rácID = f.h; khác nếu ((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 + ://); // trước tiên hãy kiểm tra xem tệp có được chia sẻ hay không nếu (p) ( // Tôi không"t - tôi có khóa chia sẻ phù hợp không? for (id in u_sharekeys ) ( p = file.k.indexOf(id + Cảo); if (p >= 0 && (!p || file.k.charAt(p - 1) == "/")) break; p = -1; ) ) // và sau đó chúng ta có thể chuyển sang giải mã if (p >= 0) ( delete keycache; // gạch chéo - rõ ràng là dấu hiệu của sự chia sẻ var pp = file.k.indexOf("/", p) ; nếu (trang< 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)); ) // nếu chúng ta đã giải mã chính xác khóa và thuộc tính, chúng ta sẽ lưu chúng vào một tệp đối tượng file.key = k; file.name = o.n; ) ) ) else ( if (d) console.log("Không nhận được khóa phù hợp: " + file.h); if (!missingkeys) ( newmissingkeys = true;misskeys = true; ) keycache = file.k; ) )
Sau này, chúng ta có thể lấy giá trị của khóa gốc ul_key từ ngữ cảnh trình duyệt như sau: dl_keyNonce = JSON.stringify();
Chuyển đổi này xảy ra trong chức năng bắt đầu tải xuống. Nếu chúng ta tính đến giá trị dl_key == filekey từ hàm ul_chunkcomplete và thực hiện các phép cộng modulo đơn giản, chúng ta sẽ nhận thấy rằng biến dl_keyNonce sẽ lưu trữ giá trị ul_key được tạo khi tải tệp. Bạn có thể thấy minh họa về điều này ở góc dưới bên trái của bảng trong ảnh ở đầu phần tải tệp lên.

“Quá tải” các hoạt động mật mã

Mặc dù thực tế là các nguyên tắc được mô tả ở trên để bảo vệ tệp và khóa rất an toàn, một số người có thể không thích việc chúng ta vẫn phụ thuộc vào việc triển khai các thuật toán mà dịch vụ cung cấp. Trong trường hợp này, chúng tôi có thể phát triển tiện ích mở rộng trình duyệt của riêng mình, tiện ích mở rộng này sẽ ghi đè một số chức năng của dịch vụ, triển khai mã hóa bổ sung trong đó. Cụ thể là tôi quyết định thực hiện việc bảo vệ Thông tin mấu chốt(khóa chính và khóa tệp) bằng cách sử dụng mã hóa phần cứng trên chìa khóa không thể tháo rời theo thuật toán GOST 28147-89. Phần thưởng cho điều này cũng sẽ là việc bao gồm xác thực hai yếu tố trên dịch vụ.
Vì vậy, hãy xem xét trường hợp sử dụng này:
  • Người dùng đăng ký dịch vụ
  • Sau đó, nó cài đặt phần mở rộng
  • Với sự trợ giúp của nó, việc mã hóa phần cứng của khóa chính được thực hiện bằng cách sử dụng khóa không thể trích xuất được từ mã thông báo.
  • Khóa chính được mã hóa theo cách này được tải lên máy chủ
Sau đó, sẽ không thể lấy được giá trị khóa chính nếu không sở hữu mã thông báo và mã PIN của nó. Điều này sẽ cung cấp cho:
  1. Xác thực hai yếu tố trên dịch vụ (không có khóa chính được giải mã chính xác, chức năng api_getsid2 sẽ không thành công)
  2. Nếu không có token, bạn cũng sẽ không thể thay đổi mật khẩu tài khoản hiện tại của mình.
Bước tiếp theo là mã hóa bằng mã thông báo khóa mã hóa tệp (còn được gọi là ul_key) và khóa thuộc tính tệp (filekey), được lưu trữ trên máy chủ. Do đó, chúng ta sẽ nhận được rằng mỗi tệp sẽ được mã hóa bằng một khóa sẽ không bao giờ đến được máy chủ, nơi chứa khóa tệp mà chúng tôi đã mã hóa từ hàm api_completeupload2. Thuộc tính tệp sẽ được mã hóa theo giá trị công khai của filekey. Để rõ ràng hơn, tôi đã phác thảo sơ đồ sau minh họa quá trình tải xuống một tệp:

Tôi muốn lưu ý rằng ở đây tôi đã sử dụng một phương pháp rất xảo quyệt. Trong trường hợp này, điều quan trọng đối với chúng tôi là kẻ tấn công không thể giải mã tệp, ngay cả khi hắn chặn khóa tệp nhận được từ máy chủ và biết khóa chính của người dùng. Do đó, tại đây bạn có thể phát huy các tính năng của kiến ​​trúc dịch vụ và sử dụng giá trị khóa ul_keyNonce (còn gọi là dl_keyNonce) có được bằng cách mã hóa giá trị của khóa ul_key (hoặc dl_key) để mã hóa tệp.

Vì những bài viết này được viết nên sản phẩm của chúng tôi đã bổ sung khả năng sử dụng mã hóa phần cứng bằng thuật toán GOST 28147-89. Có thể tải xuống phiên bản beta của plugin có chức năng mã hóa phần cứng theo thuật toán GOST 28147-89. Phiên bản plugin này chưa được phát hành thử nghiệm đầy đủ, do đó tôi cảnh báo bạn rằng có thể có sai sót trong đó, sự hiện diện của lỗi này tôi yêu cầu bạn báo cáo trong tin nhắn cá nhân.
Trong giao diện plugin, mã hóa đối xứng được thực hiện bằng hàm mã hóa, có cú pháp sau:
mã hóa (deviceId, keyLabel, dữ liệu, resultCallback, errorCallback) → (chuỗi)
Hàm lấy làm đầu vào:

  • ID thiết bị, số
  • Nhãn của khóa mã hóa, số (nếu không có khóa đó sẽ được tạo)
  • Dữ liệu, chuỗi được mã hóa (chuỗi chứa mảng byte có dạng "aa:bb:cc:dd")
  • Chức năng gọi lạiđể hoàn thành thành công và không thành công hoạt động mã hóa
Việc giải mã được thực hiện theo cách tương tự bằng cách sử dụng chức năng giải mã
Cần đặc biệt chú ý đến nhãn khóa vì nó xác định khóa nào dữ liệu sẽ được giải mã. Nhãn là một chuỗi tùy ý và chủ yếu dùng để xác định khóa một cách thuận tiện. Trong trường hợp này, tôi sử dụng hai cặp khóa: một để mã hóa khóa chính, cặp thứ hai để mã hóa các khóa tệp riêng lẻ. Khóa mà khóa chính được mã hóa có nhãn bằng mật khẩu của người dùng (hiện tại tôi nảy ra ý tưởng sử dụng hàm băm từ chuỗi e-mail||password, tôi sẽ sửa lỗi này ở phần gần tương lai). Để mã hóa khóa của các tệp đã tải xuống, một khóa có nhãn bằng chuỗi biểu diễn của khóa chính sẽ được sử dụng (ở đây cũng nên sử dụng hàm băm của khóa chính).

Phát triển trực tiếp

Tôi muốn ghi chú ngay về mã nguồn của mình: trên thực tế, nó là phiên bản alpha, mặc dù nó triển khai chức năng được mô tả ở trên. Tôi đã không kiểm tra mức độ tương thích của bản sửa đổi của mình với các chức năng khác của dịch vụ, vì vậy tôi đã đăng tất cả các nguồn trên github và sẽ rất vui nếu nhận được bất kỳ trợ giúp nào trong việc hoàn thiện hệ thống này. Vì vậy, tôi sẽ không làm bài viết thêm lộn xộn với những danh sách khổng lồ mà chỉ mô tả sơ đồ chung công việc mở rộng.

Phần mở rộng đã hoàn thành có thể được tải xuống. Nó được phát triển bằng dịch vụ Crossrider, cung cấp các tiện ích mở rộng cho ba trình duyệt (Chrome, Firefox và IE), nhưng tốt hơn hết bạn nên kiểm tra hoạt động của nó trong Chrome hoặc Firefox và trong thời gian đầu, nó hoạt động ổn định hơn nhiều.

Mã mở rộng khá đơn giản: nó kiểm tra xem chúng ta có đang ở trên trang dịch vụ hay không và nếu có, nó chỉ cần tải các tập lệnh bổ sung. Các tập lệnh này sửa đổi mã trang, thêm một vài hộp thoại và ghi đè các chức năng dịch vụ sau:

  • Changepw: chịu trách nhiệm thay đổi mật khẩu
  • api_getsid2: một trong những lệnh gọi lại đăng nhập
  • api_completeupload2: gọi lại để hoàn tất tải tệp lên
  • Loadfm_callback: gọi lại trình quản lý tệp
  • gói xử lý: một cuộc gọi lại khác, trong đó các thuộc tính của tệp vừa tải xuống được giải mã
  • trang phân tích cú pháp: chịu trách nhiệm vẽ các hộp thoại bổ sung
  • dologin: mở rộng khả năng xác thực
  • initupload3: chịu trách nhiệm tạo key mã hóa file
  • startdownload: phân tích ngược key file và khởi tạo quá trình tải xuống
Một lần nữa, tôi muốn cảnh báo bạn rằng bạn không nên kéo tiện ích mở rộng vào tài khoản công việc của mình (nếu có ai ở đây sử dụng dịch vụ này), nhưng tốt hơn hết là bạn nên tạo một tiện ích mở rộng thử nghiệm. Để sử dụng tiện ích mở rộng sau khi cài đặt, bạn sẽ cần:
  1. Để bắt đầu, bạn nên tải Rutoken EDS (hoặc Rutoken Web) và cài đặt plugin trình duyệt
  2. Cài đặt tiện ích mở rộng
  3. Đăng nhập vào dịch vụ với tiện ích mở rộng bị tắt
  4. Kích hoạt tiện ích mở rộng trong trình duyệt
  5. Tới trang tài khoản
  6. Nhấp vào nút “Ràng buộc mã thông báo”
  7. Nhập mật khẩu hiện tại và thực hiện thao tác này
Thay vì tiện ích mở rộng, bạn có thể sử dụng bookmarklet sau (đã được thử nghiệm trong Chrome, Safari, Firefox): javascript:(function())(if(document.getElementById("cryptorutokenjs"))(alert("Plugin đã được cài đặt" );return)function LoadRemoteScript(url )(var script=document.createElement("script");script.type="text/javascript";script.src=url;document.head.appendChild(script))function 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")))();

Trình diễn công việc

Đầu tiên, hãy kết nối sáng tạo của chúng tôi với trang web. Đối với điều này:

Sau đó, bạn có thể đăng xuất khỏi dịch vụ và thử đăng nhập lại bằng xác thực hai yếu tố:

Việc xác thực xảy ra theo sơ đồ sau:

  1. Kiểm tra cặp mật khẩu đăng nhập trên máy chủ
  2. Nếu thông tin đăng nhập và mật khẩu chính xác thì khóa chính được mã hóa sẽ đến từ máy chủ
  3. Plugin yêu cầu mã PIN cho mã thông báo
  4. Nếu mã PIN được nhập chính xác thì khóa chính sẽ được giải mã trên khóa từ mã thông báo

Thay vì một kết luận

Ở đây tôi muốn viết “sẽ được tiếp tục…”, vì tôi đã không trình bày chi tiết về việc tạo tiện ích mở rộng và sự thú vị của việc đưa các chức năng mã hóa không đồng bộ vào một dịch vụ mà trong hầu hết các trường hợp đều sử dụng lệnh gọi đồng bộ. Để kết thúc bài viết này, tôi muốn một lần nữa chuyển sang ý tưởng triển khai mật mã phía máy khách.
Cách tiếp cận để triển khai các chức năng mật mã bổ sung ở phía máy khách có thể được áp dụng cho bất kỳ dịch vụ web nào không quan tâm đến những gì được lưu trữ trên máy chủ của nó: có thể là lưu trữ tệp, thư hoặc trò chuyện đơn giản. Ví dụ: bạn có thể triển khai thư bảo mật dựa trên bất kỳ dịch vụ bưu chính sử dụng mã hóa tin nhắn ở định dạng CMS và cơ chế trao đổi khóa bằng thuật toán VKO GOST R 34.10-2001.
Cảm ơn bạn đã quan tâm, tôi rất mong nhận được câu hỏi và nhận xét của bạn.javascript Thêm thẻ

Hãy để tôi bắt đầu bằng cách nói rằng Internet của tôi không đặc biệt nhanh. Vì hiện tại tôi đang sống ở một ngôi làng nên tôi phải sử dụng Modem Megafon. Mạng 3G. Tốc độ Internet thông thường của tôi là 100-200 Kilobyte mỗi giây và nhanh nhất là 500-600 Kilobyte mỗi giây. Và nó liên tục thay đổi tùy theo thời gian trong ngày và ngày điều kiện thời tiết. Tuy nhiên, ngay cả trong những trường hợp như vậy, tôi vẫn tải xuống thành công một tệp lớn 12 GB từ dịch vụ lưu trữ tệp Mega. Tôi sẽ cho bạn biết thêm về điều này và bạn sẽ tìm hiểu thông tin hữu ích cho chính mình về cách tải xuống các tệp lớn từ mega.nz.

Ban đầu, tôi tải xuống các tệp nhỏ từ Mega chỉ bằng trình duyệt thông thường. Nhân tiện, do quyền truy cập vào dịch vụ lưu trữ tệp này bị đóng thông qua một số mạng, đặc biệt là qua một số mạng, nên bạn cần tìm các cách bổ sung để truy cập nó. Thông thường, địa chỉ tệp bắt đầu bằng dòng https://mega.co.nz. Và nếu bạn không thể đăng nhập thông qua chúng, thì bạn chỉ cần thay đổi ký hiệu “mega.co.nz” thành “eu.static.mega.co.nz”.

Cách đầu tiên tải xuống tệp từ Mega.nz có nghĩa là sử dụng trình duyệt thông thường. Bạn nên sử dụng Google Chrome để tải xuống thành công hơn. Nếu tệp có kích thước lớn, thì trước tiên bạn nên dọn sạch trình duyệt khỏi bất kỳ rác nào tích tụ trong đó và cản trở công việc tiếp theo– đây là lịch sử tải xuống, cookie, nhật ký các trang web đã truy cập. Với những mục đích này tôi sử dụng tiện ích miễn phíđược gọi là CCleaner.

Quá trình tải xuống trên Mega thông qua trình duyệt như thế nào? Đầu tiên, nó được lưu trong trình duyệt, sau đó khi tải xuống hoàn toàn, nó sẽ tự động được chuyển sang máy tính. Thường xuyên nhất trong thư mục "Tải xuống". Vâng, hoặc vào một thư mục khác mà bạn đã cài đặt.

Chọn tệp bạn muốn tải xuống và nhấp vào “Tải xuống ở dạng zip”. Hoặc bạn có thể nhấp chuột phải vào tập tin. Một cửa sổ sẽ xuất hiện trong đó bạn nhấp vào “Tải xuống”, sau đó chọn tải xuống thông thường hoặc tải xuống zip. Tôi thích tải xuống các tệp ở dạng lưu trữ như zip và các tệp khác.

Ban đầu, tôi đã tải xuống một đối tượng - một kho lưu trữ 8 GB. Tất cả mọi thứ diễn ra tốt đẹp. Ngày hôm sau tôi bắt đầu tải xuống tệp 12 GB. Tôi đã đung đưa nó trong khoảng 22 giờ. Tôi mệt mỏi vì nó. Tốc độ, vì lý do nào đó không rõ, rất thấp. Sau đó, khi tệp đã được tải xuống 90%, quá trình tải xuống liên tục bị gián đoạn và bạn phải khởi động nó liên tục. Nó được viết bằng tiếng Anh đại loại như vậy, quá trình tải xuống sẽ tiếp tục sau khi bạn giải phóng dung lượng trên trình duyệt. Có thể 12 GB là quá nhiều đối với trình duyệt. Ngoài ra, nó còn bị ảnh hưởng bởi việc tôi không xóa trình duyệt trước khi tải xuống. Và kết quả là 99% quá trình tải xuống Mega bị gián đoạn. Tôi thất vọng vì không thể làm gì được. Vâng, và tôi đã dành rất nhiều thời gian và tắc nghẽn giao thông. Vì vậy, tôi phải tìm kiếm một phương pháp tải xuống khác thành công hơn từ Mega.

Cách thứ hai Cách tải xuống từ dịch vụ lưu trữ tệp Mega.nz là sử dụng chương trình Mipony. Cô ấy có nhiều lợi thế. Nó có khả năng tải xuống và không tạo các tập tin tạm thời. Tôi đã cài đặt nó từ mipony.net. Chương trình chống vi-rút của tôi không phát hiện bất kỳ dấu hiệu nào của vi-rút “ác” trong tệp này. Và trang web mipony.net có vẻ là trang chính thức, ít nhất thì trông giống như vậy. Đúng vậy, cùng với tiện ích này, một loạt chương trình không cần thiết đối với tôi đã được cài đặt. Tôi sẽ loại bỏ chúng, vì tôi không cần chúng, mặc dù chúng trông vô hại. Và trong số đó có trình duyệt Amigo. Tôi đã quá mệt mỏi với anh rồi. Tôi liên tục cài đặt nó cùng với một số chương trình. Rõ ràng các nhà phát triển phần mềm Chương trình khuyến mãi này nhằm trả tiền cho chủ sở hữu các chương trình khác để cùng với việc cài đặt tệp của họ, ứng dụng của họ cũng được cài đặt.

Sau đó bạn chọn tập tin cần thiết hoặc tất cả. Để bắt đầu tải xuống, hãy nhấp vào “Chọn tải xuống” bên dưới. Tất cả các tệp sau các bước này sẽ bắt đầu tải xuống.

Toàn bộ quá trình tải xuống diễn ra trong phần “Tải xuống”.

Đừng quên đặt tốc độ thành "Không giới hạn" ở góc dưới bên phải. Ban đầu tôi có 10 KB/s. Con số này là rất ít và bạn sẽ tải xuống các tệp lớn ở tốc độ này không chỉ trong nhiều tuần mà trong nhiều tháng, nếu không muốn nói là nhiều năm.

Nhờ sử dụng Mipony, tôi có thể tải xuống tệp 12 GB trong khoảng 8 giờ. Đối với bạn, quá trình này có thể mất ít thời gian hơn nhiều. Tất cả phụ thuộc vào tốc độ Internet bạn sử dụng.

Chúc may mắn! Tôi hy vọng rằng bài viết về cách tải xuống từ dịch vụ lưu trữ file Mega hữu ích cho bạn.

Mega là bộ lưu trữ đám mây cung cấp cho người dùng 50 GB dung lượng đĩa trống để lưu trữ dữ liệu. Sự gia tăng trí nhớ tương tự như ổ cứng nó sẽ không cần thiết đối với bất cứ ai.

Tiện ích mở rộng cho phép truy cập vào bộ lưu trữ đám mây thông qua trình duyệt. Điều này làm giảm thời gian khởi động, cải thiện hiệu suất và cải thiện tính bảo mật. Nói về lưu trữ đĩa MEGA, Chúng ta đang nói về về toàn cầu truy cập an toàn. Sử dụng tiện ích mở rộng của trình duyệt, tập tin cần thiết sẽ có sẵn cả ngày lẫn đêm. MEGA cung cấp mã hóa đầu cuối. Điều này có nghĩa là tin nhắn, ảnh, video được bảo vệ khỏi rơi vào tay kẻ xấu. Chỉ những kho lưu trữ đám mây có quyền truy cập vào dữ liệu cá nhân mới thuộc quyền kiểm soát của bạn. Ngay cả MEGA cũng không có quyền truy cập vào chúng! Không giống như hầu hết các dịch vụ đám mây khác, các nhà phát triển MEGA ủng hộ sự hợp tác an toàn. Điều này cho phép bạn trao đổi thông tin, kết nối với các liên hệ và xem thông tin cập nhật trong thời gian thực.

Không gian lưu trữ lớn

MEGA không chỉ an toàn hơn so với các đối thủ cạnh tranh. Số lượng cung cấp lưu trữ miễn phí nhiều lần hơn những người khác. Nhờ tính năng đồng bộ hóa tệp theo thời gian thực, tất cả các tệp đều an toàn và có thể được khôi phục nếu cần. Để cung cấp xác minh độc lập về tính chính xác và tính toàn vẹn của mô hình mật mã cũng như việc triển khai nó, MEGA xuất bản một bản đầy đủ nguồn ứng dụng khách. Và nó làm hài lòng!

Ngày nay, Internet cung cấp một số lượng lớn kho lưu trữ tập tin, tương tự nhau. Điều đầu tiên bạn nghĩ đến: Yandex.Disk, Google Drive, Dropbox, OneDrive. Điều khiến MEGA khác biệt so với các đối thủ cạnh tranh là nó cung cấp 50 GB dung lượng lưu trữ đĩa miễn phí cho người dùng đã đăng ký. MEGA không giới hạn kích thước tệp được tải lên đám mây.

Xin chào.

Một số người dùng buộc tôi phải viết bài này với sự than vãn của họ. Ngày càng có nhiều tài liệu thú vị bắt đầu xuất hiện trên trang web, có sẵn để tải xuống bằng bộ lưu trữ đám mây Mega. Thời gian đã cho thấy nhiều người dùng không thể tải xuống khóa học. Câu hỏi ngay lập tức được đặt ra: “Tại sao bạn cần một khóa học nếu bạn thậm chí không thể thực hiện hành động đơn giản nhất là làm cách nào để tải xuống tài liệu ?!” Nếu trước đây những bình luận này gây ra tiếng cười thì giờ đây nó đã trở nên hơi khó chịu và những người viết những bình luận như vậy giống như một miếng bọt biển nguyên thủy, như trong phần xem trước của bài viết này. Trong tương lai (trong tương lai rất gần), dự kiến ​​sẽ có rất nhiều tài liệu thú vị có sẵn để tải xuống qua Mega. Nếu bạn gặp vấn đề khi tải xuống- hãy đọc bài viết này, vì vấn đề này sẽ không được nêu ra nữa và không ai vì lợi ích của một số người dùng sẽ chia tài liệu thành hàng trăm mảnh và tải lại chúng lên các kho khác. Những người dùng tiếp tục than vãn sẽ được đưa đi học các kỹ năng về PC và sẽ tạm thời bị cô lập khỏi xã hội.

Vì vậy, hãy xem tại sao Mega? Mọi thứ đều rất đơn giản. Đối với chúng tôi, đây là một cơ sở lưu trữ thuận tiện, không có hạn chế về khối lượng tài liệu được tải lên, dung lượng đĩa lớn và các khiếu nại được xem xét nghiêm túc. Tài liệu dành cho người dùng được cung cấp miễn phí, vì vậy hãy tìm hiểu cách tải xuống hoặc không tải xuống. Giả sử bạn đã tìm thấy khóa học mong muốn và nó được tải lên Mega. Trước hết, hãy đảm bảo rằng bộ lưu trữ tự mở. Nếu Mega không khả dụng ở quốc gia của bạn (một số nhà cung cấp chặn bộ nhớ), hãy sử dụng proxy hoặc VPN để bỏ qua việc chặn. Bây giờ việc đơn giản nhất còn lại là tải tài liệu xuống. Có nhiều nhất là 2 cái những cách đơn giản lượt tải xuống:

1 chiều. Phương pháp này Thích hợp để tải các tập tin nhỏ. Để tải xuống các tệp lớn, hãy sử dụng phương pháp 2. Cách đầu tiên- Đây là sử dụng tải xuống thông qua trình duyệt thông thường. Như thực tế đã chỉ ra, nó hoạt động tốt nhất với Mega trình duyệt Google Trình duyệt Chrome. Vì vậy, chúng tôi khuyên bạn nên sử dụng nó. Cách tải qua trình duyệt:Đầu tiên, tài liệu được tải xuống bộ đệm, sau đó sau khi tải xuống hoàn toàn, bạn có thể lưu nó vào bất kỳ thư mục nào (nếu lựa chọn thư mục không được định cấu hình, tài liệu sẽ được lưu vào thư mục tải xuống).

Nhấp vào nút “Tải xuống trong trình duyệt” và đợi quá trình tải xuống hoàn tất. Bạn không thể đóng tab!

Bạn cũng có thể sử dụng phần mềm từ Mega - MegaSync và đồng bộ hóa các tệp, nhưng chúng tôi chưa thử phương pháp tải xuống này, mặc dù một số người dùng khen ngợi phương pháp cụ thể này. Ngoài ra, theo một số người dùng, để tải xuống thành công, các tệp cần phải được nhập vào máy tính của bạn. ổ đĩa đám mây, nhưng nói chung điều này là không cần thiết. Sau khi tải xuống một tệp lớn thông qua trình duyệt, chúng tôi khuyên bạn nên xóa bộ nhớ đệm của trình duyệt, chẳng hạn như sử dụng tiện ích CCleaner.

Phương pháp 2. Tải xuống bằng chương trình Mipony. chương trình mipony có thể được tải xuống từ trang web chính thức. Chúng tôi khuyên bạn nên sử dụng phương pháp này vì chương trình rất tiện lợi và có nhiều ưu điểm, chẳng hạn như phần mềm hỗ trợ tiếp tục các tệp (như torrent) và không tạo các tệp tạm thời, không giống như tải xuống qua trình duyệt. Một số phần mềm chống vi-rút có thể chửi rủa chương trình, nhưng điều đó không có gì sai. Chương trình không ăn cắp bất cứ thứ gì và không độc hại. Những người hoang tưởng có thể sử dụng chương trình trên máy ảo. Cài đặt chương trình (mọi thứ rất đơn giản) và khởi chạy nó. Trước hết, hãy mở tab “Tùy chọn” và đảm bảo rằng không có giới hạn tốc độ ở đó.