Сервис хранения данных Mega co nz был запущен в 2013 году. В первый день сайт посетило 1 миллион пользователей, а в течении первого часа зарегистрировались более 100 000 пользователей. На 2015 год Mega хранит информацию в интернете более чем 15 миллионов пользователей.
Облачный сервис Mega расшифровывается как «MEGA Encrypted Global Access» (Зашифрованный глобальный доступ). При загрузке данных в хранилище все файлы шифруются в браузере с помощью алгоритма AES, и хранятся на сервере в зашифрованном виде. Кроме того, Mega не хранит пароли и . Они принадлежат только пользователю, и не могут быть восстановлены в компании. Если вы забыли пароль, единственный способ восстановить его - иметь мастер ключ Mega nz.
Хранилище данных Mega co nz - предоставляет как бесплатное так и платное место для хранения файлов в интернете. Дает возможность хранить и получать доступ к вашим файлам в любой точке мира. Имеет несколько способов загрузки файлов в хранилище Mega.nz используя веб браузер или специальные клиентские приложения.
Создать учетную запись в Мега просто. Вы должны указать адрес электронной почты и пароль, чтобы начать работу. Отличие хранилища Mega.co от в том, что после вы бесплатно получите 50GB дискового пространства для хранения файлов в интернете, и не нужно вводить данные кредитной карты во время регистрации.
В облаке Mega co очень легко ориентироваться. Кнопки загрузки файлов и папок расположены в верхней панели меню, а под ним загруженные данные. Слева расположена колонка управления и отображения в облачном сервисе Mega. При нажатии на кнопку меню вверху справа можно сменить язык, установить Add-On приложения на браузеры Google Chrome, Mozilla Firefox, синхронизировать любые папки на компьютере работающего под операционной системой Windows, Mac, Linux с папками в облаке Mega, синхронизация и загрузка ваших данных с облаком у становив мобильное приложение Android iOS Blackberry Windows на смартфон или планшет.
Хранить файлы и открыть к ним общий доступ в облачном сервисе Mega.co.nz очень просто, создайте новую папку, загрузите в нее фото, видео, документы или другую информацию нажав кнопу вверхнем меню "Загрузить файл". Хранилище данных Mega.nz не использует ограничений размера загружаемого файла, и скорости загрузки если вы не ограничили ее в настройках.
При нажатии правой кнопкой мыши на папку в выпадающем меню, можно открыть , получить ссылку на скачивание файла с облачного сервиса, копировать, переименовать, переместить, удалить данные с диска.
Хранилище данных Mega.nz предлагает три платных тарифа для хранения файлов на облаке:
PRO Ⅰ
500 GB € 9.99/мес ИЛИ € 99.99/год
PRO Ⅱ
2TB GB € 19.99/мес ИЛИ € 199.99/год
PRO Ⅲ
4TB GB € 29.99/мес ИЛИ € 299.99/год
При покупке годового тарифа PRO 2 месяца получите бесплатно.
Облоко MEGA бесплатно использовать могут все.
Mega | cloud storage Mega | Облако Mega | Хранилище Mega
После запуска в какой-то мере скандального сервиса MEGA разговоры о его защищенности немного побурлили и затихли. На сегодняшний день сервис живет своей жизнью и его никто даже не поломал. Из всех разговоров почему-то был упущен термин «User Controlled Encryption» (UCE, или Контролируемая пользователем криптография), которой кичится MEGA. Под словом «упущен» я подразумеваю тот факт, что мы не рассмотрели все возможности, которые дает нам криптографический движок, выполняющийся в JavaScript на стороне клиента.
Конечно, сам сервис MEGA под этим подразумевает всего лишь то, что ключи шифрования не хранятся на сервере, а вся их криптография выполняется в контексте браузера. При этом после запуска сервиса было много разговоров о том, что в нем используются нестойкие криптографические алгоритмы и что вообще все плохо и мы все умрем, а наши файлы прочитает ФСБ. Это подтолкнуло меня на мысль расширить понятие «UCE» и действительно взять криптографию под свой контроль, а именно - заменить или дополнить некоторые механизмы обеспечения безопасности сервиса.
В этой статье я частично разложу по полочкам магию, которая происходит в двух мегабайтах JavaScript-кода MEGA и покажу, как можно переопределить некоторые методы, чтобы перестать волноваться и полюбить криптографию. В результате мы получим сервис облачного хранения файлов с двухфакторной аутентификацией и аппаратным шифрованием критически важной информации.
MEGA, UCE и все-все-все
Итак, начнем с того, что рассмотрим технологии, на которых построена клиентская часть сервиса, как происходит регистрация новых пользователей, аутентификация зарегистрированных пользователей, смена пароля и загрузка/скачивание файлов.JavaScript
Как вам уже может быть известно, вся клиентская часть сервиса основана на JavaScript, в коде главной страницы прописаны контрольные суммы SHA-256 для всех скриптов и страниц, которые загружаются браузером. Сама загрузка происходит следующим образом: у всех файлов проверяются контрольные суммы, после чего они объединяются в один BLOB, который отдается браузеру. По исходному коду js-файлов видно, что их писали разные люди и порой встречаются забавные перлы, как например последствия копипаста, бессмысленные условия и просто странные переменные.В процессе изучения исходного кода сайта я также заметил, что он довольно активно обновляется, разработчики исправляют мелкие ошибки и оптимизируют уже написанный код, что не может не радовать. Сам код написан весьма прямолинейно и без излишней накрутки в виде прототипов: сайт обходится тремя сотнями глобальных переменных и более чем 8000 функций. Разбираться в архитектуре сайта и менять его код было весьма просто.
Из сторонних фреймворков MEGA использует jQuery (без него сейчас никуда), Ext JS и SJCL . Последний как раз реализует криптографическое ядро с AES-шифрованием. SJCL также обуславливает интересный формат хранения ключей и прочих байт-массивов: вместо того, чтобы просто гонять байты в обычном массиве, они «сжимаются» в формат, который именуется a32. Его суть в том, что содержимое любого массива байт пакуется в 32-битные числа и записывается в массив меньшей длины. То есть, каждые 4 байта массива преобразуются в один банальный int. В коде сайта есть функции, которые выполняют всевозможные преобразования над импровизированным множеством {a32 array, string, base64 string}.
Ключевая информация
Прежде, чем перейти к описанию процессов регистрации и аутентификации, стоит рассмотреть информацию, которая подлежит зашифрованию, а именно:- Мастер-ключ учетной записи , который создается случайным образом в момент регистрации пользователя и имеет длину в 128 бит. Да и в принципе, длина всех ключей, используемых для симметричного шифрования, равна 128 бит.
- Закрытый ключ RSA : создается в момент регистрации на основе движений мыши и ввода с клавиатуры. В данной статье я не буду акцентировать внимание на ассиметричной криптографии, поскольку она используется для общего доступа к загруженным файлам, а у меня стояла задача изменить процесс аутентификации и шифрования данных пользователя.
- Индивидуальные ключи файлов и сами файлы , загружаемые на сервис. Ключи создаются случайным образом при загрузке файла, для зашифрования данных файла используется сам этот ключ, а для зашифрования атрибутов - ключ, созданный на основе индивидуального ключа файла и его контрольной суммы.
Ближе к коду
Сейчас я предлагаю разобрать процессы регистрации и аутентификации, посмотреть, как создается мастер-ключ и как производится его зашифрование.Я тут попытался изобразить на бумажке эти процессы и дабы дать вам понять всю суть безумия, даже сделал вот такую фотку:
Регистрация нового пользователя
Сам по себе процесс регистрации довольно запутанный, после заполнения пользователем анкеты вызывается могучая кучка функций, но нас интересует функция api_createuser: // создание нового пользователя и его мастер-ключа
function api_createuser(ctx, invitecode, invitename, uh) {
var i;
var ssc = Array(4); // session self challenge, will be used to verify password
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(); // генерирование случайного мастер-ключа u_k
for (i = 4; i--;) ssc[i] = rand(0x100000000); // генерирование случайной аутентификационной последовательности
if (d) console.log("api_createuser - masterkey: " + u_k + " passwordkey: " + ctx.passwordkey);
// зашифрование мастер-ключа на текущем пароле и отправка его на сервер (поле k)
// поле ts представляет собой конкатенацию ssc с ее зашифрованным значением
req = {
a: "up",
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.cipher.aes(u_k), ssc)))
};
if (invitecode) {
req.uh = uh;
req.ic = invitecode;
req.name = invitename;
}
if (d) console.log("Storing key: " + req.k);
api_req(, ctx);
}
В этой функции нас интересуют следующие вещи:
- u_k - сам мастер-ключ, глобальная переменная. Массив из 4х 32-битных чисел, который создается функцией api_create_uk
- ssc - просто случайный массив, который зашифровывается на мастер-ключе, конкатенируется со своим открытым значением и отправляется на сервер. Позже он будет использован для проверки корректности мастер-ключа при аутентификации
- sjcl - криптографическая библиотека, реализующая AES
- rand() - местная реализация генератора псевдослучайных чисел, основанная на RC4
- encrypt_key() - функция-краеугольный камень симметричной криптографии сервиса. Принимает инициализированный ключом объект sjcl и массив, который надо зашифровать. Код функции приведен ниже и, надеюсь, не нуждается в пояснениях.
В итоге после регистрации на сервер отправляются:
- Мастер-ключ, зашифрованный на ключе, выведенном из пароля учетной записи
- Строка вида ssc||encrypt_AES-128(u_k, ssc)
Вход пользователя в систему
Теперь можно плавно перейти к процессу аутентификации. Вкратце оно производится так:- Пользователь вводит логин/пароль
- Если первый этап аутентификации пройден, то с сервера приходит зашифрованный мастер-ключ и аутентификационная последовательность (ssc), созданная при регистрации
- Производится расшифрование мастер-ключа на введенном пользователем пароле
- На мастер-ключе расшифровывается аутентификационная последовательность и сравнивается со своим открытым значением - таким образом проверяется корректность мастер-ключа и пароля.
// расшифрование мастер-ключа после входа пользователя в систему
function api_getsid2(res, ctx) {
var t, k;
var r = false;
if (typeof res == "object") {
// инициализируем sjcl-aes текущим паролем учетки
var aes = new sjcl.cipher.aes(ctx.passwordkey);
// если нам в ответе сервера пришел мастер-ключ...
if (typeof res.k == "string") {
k = base64_to_a32(res.k);
if (k.length == 4) {
// ... то расшифровываем его
k = decrypt_key(aes, k);
// и пере-инициализируем sjcl-aes, используя мастер-ключ
aes = new sjcl.cipher.aes(k);
// если нам пришла ssc из процесса регистрации
if (typeof res.tsid == "string") {
t = base64urldecode(res.tsid);
// зашифровываем первую половину строки и сравниваем со значением с сервера
// если они совпали - значит, все явки и пароли сошлись и можно впустить юзера
if (a32_to_str(encrypt_key(aes, str_to_a32(t.substr(0, 16)))) == t.substr(-16)) r = ;
}
// ниже разбирается закрытый ключ RSA-пары, нам это пока не интересно
else if (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);
// decompose private key
for (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") break;
privk = privk.substr(l);
}
// check format
if (i == 4 && privk.length < 16) {
// TODO: check remaining padding for added early wrong password detection likelihood
r = ;
}
}
}
}
}
ctx.result(ctx, r);
}
Как бонус к регистрации/аутентификации можно взглянуть на процесс смены пароля.
// смена пароля пользователя
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);
}
Код этой функции говорит сам за себя: мы зашифровываем мастер-ключ на двух ключах, полученных из старого и нового паролей, а затем отправляем эти значения на сервер. Если текущий пароль подошел, то он заменяется на новый. Тут я больше хотел обратить внимание на функцию prepare_key_pw , которая неявно присутствовала во всех предыдущих операциях. Ее задача - преобразовать строковый пароль в a32-массив, а потом выполнить операцию деривации ключа следующим образом:
// convert user-supplied password array
function 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;
}
Эта функция вызвала много нареканий, поскольку основана на доморощенном алгоритме. За время написания статьи создатели сервиса успели немного поменять ее код, но существенных изменений я тут не заметил. Ее суть состоит в том, что переданный пароль зашифровывается 65536 раз на константном ключе для того, чтобы получить неотличимый от случайного ключ. Почему создатели сервиса не воспользовались существующими алгоритмами (например, PBKDF2), остается загадкой.
Загрузка и зашифрование файлов
Вкратце весь этот процесс можно представить вот так:Предупреждаю, долгое вникание в эту картинку опасно для мозга, поэтому ниже я расскажу, как же все это происходит.
Как я уже говорил, при загрузке для каждого файла создается свой случайный ключ-массив из 6ти 32-битных чисел. Первые четыре элемента этого массива используются для зашифрования содержимого файла, а два последних - как начальные значения счетчика, с помощью которого вычисляется контрольная сумма файла. Этот массив хранится в глобальной переменной ul_key . Его же содержимое заносится в JSON-сериализированную строку ul_KeyNonce .
Само за(рас)шифрование происходит с помощью Web Worker (если браузер поддерживает эту технологию) или просто внутри основного кода страницы. Когда файл становится готов к отправке, для зашифрования его атрибутов (на данный момент под атрибутами подразумевается только имя файла) создается новый ключ filekey , основанный на ul_key и контрольной сумме файла. Этот ключ затем зашифровывается на мастер-ключе и отправляется на сервер вместе с атрибутами файла. За все эти действия отвечают функции initupload3 и api_completeupload2 . Создание ключа filekey происходит в функции ul_chunkcomplete , ниже я приведу ее часть.
// начало загрузки файла: создание его индивидуального ключа и инициализация механизма шифрования function initupload3() { // ... вырезано =) // создание случайного индивидуального ключа файла // ul_key используется в коде страницы, // ul_keyNonce передавается в Web Worker и используется там // для зашифрования файла и вычисления его контрольной суммы ul_key = Array(6); for (i = 6; i--;) ul_key[i] = rand(0x100000000); ul_keyNonce = JSON.stringify(ul_key); ul_macs = ; // ... дальше идет обработка очереди загрузки, она не несет интереса... // инициализация sjcl-aes для файла на основе ul_key ul_aes = new sjcl.cipher.aes(); // ... // запуск процесса загрузки файла: // чтение его с диска, зашифрование и отправка onUploadStart(ul_queue_num); ul_dispatch_chain(); } // создание ключа для зашифрования атрибутов файла function ul_chunkcomplete(slot,pos,response) { // ... var t = ; // ul_macs - массив с контрольной суммой файла, полученной внутри worker"а for (p in ul_macs) t.push(p); // заполнение и сортировка временного массива, если кто знает зачем это - объясните пожалуйста 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 { // зашифрование имени файла на ключе, выведенном из ul_key и контрольной суммы // 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); // передача атрибутов и зашифрованного на мастер-ключе ключа файла var req = { a: "p", t: ut, n: [{ h: ctx.t, t: 0, a: ab_to_base64(ea), // атрибуты k: a32_to_base64(encrypt_key(u_k_aes, ctx.k)), // == AES_encrypt(u_k, filekey) fa: ctx.fa }] }; if (ut) { // a target has been supplied: encrypt to all relevant shares var sn = fm_getsharenodes(ut); if (sn.length) { req.cr = crypto_makecr(, sn, false); req.cr = ctx.t; } } api_req(, ctx.ctx); } }
Скачивание и расшифрование файлов
Очевидно, что эти процессы должны быть просто обратными к зашифрованию файла. Единственное что может нести интерес - это получение значения ключа ul_key из пришедшего с сервера зашифрованного значения filekey .На момент скачивания файла в контексте браузера уже содержится объект, хранящий расшифрованные ключи файлов. Поэтому сначала имеет смысл рассмотреть процесс, который происходит сразу после аутентификации пользователя, а именно - загрузку файл-менеджера. После того как пользователя пустили на сервис, ему естественно хочется получить доступ к своим файлам (предположим, что они у него уже там были). Для этого нам нужно расшифровать сначала ключи файлов, а затем - их атрибуты. Этим делом занимается очередная пачка функций, из которых нас интересуют loadfm_callback и process_f_f .
Вкратце процесс получения атрибутов файлов можно описать следующим алгоритмом:
- Дождаться загрузки файл-менеджера (loadfm_callback), где получить JSON с описанием всех загруженных файлов
- Создать массив farray , в который положить массив с информацией о файлах
- Запустить (рекурсивно) для каждого файла функцию process_f_f
- Для каждого файла, у которого есть ключ, расшифровать этот ключ и атрибуты (функция crypto_processkey) и сохранить их обратно в массив с информацией о файлах
- После этого сохранить расшифрованные значения в переменную FileStore (окончание рекурсии в process_f_f)
// callback загрузки файл-менеджера
function loadfm_callback(json, res) {
// ...
// обработка JSON с информацией о файлах
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,
rights: json.s[i].r,
date: json.s[i].ts
});
sharednodes.h] = true;
}
}
}
// ... дальше ничего особого...
// занесение информации о файлах в еще один глобальный массив
farray = new Object;
farray.f = json.f;
// запуск его обработки, callback был объявлен выше
// в этой функции и просто модифицирует верстку
process_f(fi, false, callback);
fi++;
}
// рекурсивная функция, в которой происходит расшифрование ключей и атрибутов файлов
// вызывается из process_f
function process_f_f(fid) {
// условие окончания рекурсии - мы обработали все файлы в массиве farray
if (!farray.f.i]) {
if (farray.ap) FileStore.suspendEvents();
// запись данных в 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);
// если файл подходит по типу и имеет ключ, то обработаем его
if ((f.t !== 2) && (f.t !== 3) && (f.t !== 4) && (f.k)) {
crypto_processkey(u_handle, u_k_aes, f); // описание этой функции ниже
u_nodekeys = f.key;
if ((typeof f.name !== "undefined") && (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;
else if (f.t == 3) InboxID = f.h;
else if (f.t == 4) TrashbinID = f.h;
else if ((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)
// ключ записан в виде "
После этого мы можем получить значение исходного ключа ul_key из контекста браузера следующим образом: dl_keyNonce = JSON.stringify();
Это преобразование происходит в функции startdownload . Если учесть, что значение dl_key == filekey из функции ul_chunkcomplete и выполнить нехитрые операции сложения по модулю, то мы заметим, что в переменной dl_keyNonce будет хранится значение ul_key , сгенерированное при загрузке файла. Иллюстрацию этому можно наблюдать в нижнем левом углу доски на фотографии в начале раздела про загрузку файлов.
«Перегрузка» криптографических операций
Несмотря на то, что вышеописанные принципы защиты файлов и ключей являются весьма безопасными, кому-то может не понравиться, что мы все равно зависим от реализации алгоритмов, которые предоставляет сервис. В этом случае мы можем разработать свое расширение для браузера, которое будет переопределять некоторые функции сервиса, реализуя в них дополнительное шифрование. А именно, я решил реализовать защиту ключевой информации (мастер-ключа и ключей файлов) с помощью аппаратного шифрования на неизвлекаемом ключе по алгоритму ГОСТ 28147-89. Бонусом к этому также будет и включение на сервисе двухфакторной аутентификации.Итак, рассмотрим такой use-case:
- Пользователь регистрируется на сервисе
- Затем он устанавливает расширение
- С его помощью производится аппаратное зашифрование мастер-ключа на неизвлекаемом с токена ключе
- Зашифрованный таким образом мастер-ключ загружается на сервер
- Двухфакторную аутентификацию на сервисе (без корректно расшифрованного мастер-ключа «завалится» функция api_getsid2)
- Без токена также нельзя будет сменить текущий пароль учетной записи
Хочу отметить, что здесь я применил весьма хитрый метод. В данном случае нам важно, чтобы злоумышленник не мог расшифровать файл, даже если он перехватит пришедший с сервера ключ файла и будет знать мастер-ключ пользователя. Поэтому тут можно сыграть на особенностях архитектуры сервиса и использовать для за(рас)шифрования файлов значение ключа ul_keyNonce (оно же dl_keyNonce), полученное в результате зашифрования на токене значения ключа ul_key (или dl_key).
С момента написания этих статей в наш продукт добавилась возможность аппаратного шифрования по алгоритму ГОСТ 28147-89. Beta-версию плагина с функциональностью аппаратного шифрования по алгоритму ГОСТ 28147-89 можно скачать . Эта версия плагина еще не прошла полное тестирование, поэтому предупреждаю о том, что в ней могут быть ошибки, о нахождении которых прошу сообщать в личку.
В интерфейсе плагина симметричное зашифрование реализуется функцией encrypt , которая имеет следующий синтаксис:
encrypt(deviceId, keyLabel, data, resultCallback, errorCallback) → {string}
В качестве входных данных функция принимает:
- Идентификатор устройства, number
- Метку ключа для шифрования, number (если такого ключа нет, он будет сгенерирован)
- Зашифровываемые данные, string (строка, содержащая в себе байт-массив вида "aa:bb:cc:dd")
- Функции обратного вызова для успешного и неуспешного завершения операции шифрования
Отдельное внимание стоит уделить метке ключа, поскольку она определяет, на каком ключе будет производится за(рас)шифрование данных. Метка представляет собой произвольную строку и в основном служит для удобной идентификации ключа. В данном случае я использую две ключевых пары: одну для за(рас)шифрования мастер-ключа, вторую - для зашифрования индивидуальных ключей файлов. Ключ, на котором зашифровывается мастер-ключ имеет метку, равную паролю пользователя (сейчас мне пришла в голову идея использовать хеш от строки e-mail||пароль, в ближайшее время я это исправлю). Для зашифрования ключей загружаемых файлов используется ключ с меткой, равной строковому представлению мастер-ключа (здесь также стоит использовать хеш от мастер-ключа).
Непосредственно разработка
Сразу хочу сделать замечание по поводу моего исходного кода: он, по сути, находится в альфа-версии, хотя и реализует описанную выше функциональность. Я не проверял, насколько моя переделка получилась совместимой с остальными функциями сервиса, поэтому все исходники я выложил на github и буду рад любой помощи по доработке этой системы. Поэтому я не буду засорять статью дальше огромными листингами, а лишь опишу общую схему работы расширения.Готовое расширение можно скачать . Разработано оно с помощью сервиса Crossrider , что дает расширения для трех браузеров (Chrome, Firefox и IE), но проверять его работу лучше в Chrome или Firefox, причем в первом оно работает гораздо стабильнее.
Код расширения до банального прост: он проверяет, находимся ли мы на странице сервиса и если это так, то просто подгружает дополнительные скрипты. Эти скрипты модифицируют код страницы, добавляя пару диалогов, и переопределяют следующие функции сервиса:
- changepw: отвечает за смену пароля
- api_getsid2: один из callback"ов логина
- api_completeupload2: callback завершения загрузки файла
- loadfm_callback: callback загрузки файл-менеджера
- processpacket: очередной callback, в котором расшифровываются атрибуты только что загруженного файла
- parsepage: отвечает за рисование дополнительных диалогов
- dologin: расширяет возможности аутентификации
- initupload3: отвечает за создание ключа шифрования файла
- startdownload: обратный разбор ключа файла и инициализация скачивания
- Для начала неплохо раздобыть Рутокен ЭЦП (или Рутокен Web) и установить плагин для браузера
- Установить расширение
- Залогиниться на сервис с отключенным расширением
- Включить расширение в браузере
- Зайти на страницу учетной записи
- Нажать на кнопку «Привязать токен»
- Ввести текущий пароль и выполнить эту операцию
Демонстрация работы
Для начала подключим наше творение к сайту. Для этого:Затем можно выйти из сервиса и попробовать снова зайти, используя двухфакторную аутентификацию:
Аутентификация при этом происходит по следующей схеме:
- Проверка пары логин-пароль на сервере
- Если логин-пароль правильные, то с сервера приходит зашифрованный мастер-ключ
- Посредством плагина производится запрос PIN-кода к токену
- Если PIN введен правильно, то производится расшифрование мастер-ключа на ключе с токена
Вместо заключения
Здесь мне так и хочется написать «продолжение следует...», поскольку я не осветил детали создания расширения и интересности прикручивания асинхронных функций шифрования в сервис, который в большинстве случаев использует синхронные вызовы. В заключении этой статьи я хотел бы еще раз обратиться к идее реализации client-side криптографии.Подход к реализации дополнительных криптографических функций на стороне клиента может быть применен к любому веб-сервису, которому не важно, что хранить у себя на сервере: будь то файловое хранилище, почта или простейший чат. Например, можно реализовать защищенную почту на базе любого почтового сервиса с использованием шифрования сообщений в формате CMS и механизмов обмена ключами по алгоритму VKO GOST R 34.10-2001.
Спасибо за внимание, жду ваших вопросов и комментариев.javascript Добавить метки
И Microsoft SkyDrive.
А вот облачное хранилище MEGA не так известно, хотя предлагает в бессрочное бесплатное пользование целых 50Gb, доступных сразу после регистрации!
Если Вам не помешает такая солидная «прибавка» к жесткому диску, и Вы хотите узнать как получить эти самые 50 гигабайт и эффективно ими распоряжаться, то читайте сегодняшний обзор!
Откуда взялся сервис MEGA.NZ
Поскольку Вы собираетесь доверить сервису какие-то свои личные данные, то не лишним будет узнать откуда он собственно взялся, и кто за ним стоит…
Наверняка Вы слышали про такое хранилище как Megaupload. Оно было закрыто в 2012 году по решению властей США – причастные к созданию сервиса, в том числе его основатель Ким Дотком, были обвинены ФБР в нарушении авторских прав (хранение и распространение лицензионного контента). Спустя ровно год Ким Дотком запустил новый сервис на домене mega.co.nz.
В настоящее время вход в облако доступен по адресу mega.nz , поэтому если встретите аналогичные обзоры данного хранилища, где в качестве адреса будет указан mega co или mega co nz, знайте, что они безнадежно устарели:)
Нужна ли регистрация на Мега?
На главной страничке хранилища Вы увидите большую красную кнопку с призывом перетащить на неё файлы и начать пользоваться сервисом.
Складывается ощущение, что регистрация для работы вообще не нужна. В принципе это так – Вы можете сразу же загрузить в облако какие-то свои файлы и даже увидите их в хранилище. Однако без регистрации Ваши загруженные данные будут удалены из хранилища после закрытия странички или браузера:
Поэтому пройдите стандартный процесс регистрации, после чего Вы сразу получаете 50 гигабайт места в облаке совершенно бесплатно!
Необходимые настройки сразу после регистрации
Mega nz огромное внимание уделят безопасности хранения данных и конфиденциальности. Подробно об этом поговорим чуть позже, а пока укажу на то, что надо обязательно сделать сразу после регистрации.
Поскольку сервис не хранит Ваш пароль на своих серверах, то в случае его утери у Вас не будет возможности восстановить доступ к своей учетной записи. Чтобы избежать подобной проблемы, надо скачать и сохранить на своем ПК ключ восстановления:
Это необходимая мера предосторожности, которой не стоит пренебрегать! Согласитесь, будет обидно потерять все свои файлы в облаке лишь потому, что Вы забыли пароль.
Как пользоваться хранилищем Mega
В левой части окна в меню нажмите на иконку облака:
Вы окажетесь в своем облачном диске. При помощи инструментов в верхней части окна Вы можете создавать новые папки, заливать туда файлы и даже загружать с компьютера готовые папки с файлами.
Работать с интерфейсом хранилища не сложнее чем с проводником в Windows. Клик правой клавишей мыши на папке или файле вызывает контекстное меню с целым набором возможностей.
С его помощью можно:
- Получать информацию об элементе (размер, дата создания и пр.)
- Назначать цветные метки и добавлять в Избранное
- Переименовывать
- Перемещать в пределах диска, копировать, удалять
- Скачивать
- Открывать общий доступ к папкам
- Создавать публичную ссылку на скачивание файлов
Разработчики конечно же учли свой опыт негативный опыт с Megaupload, поэтому при создании публичной ссылки будет показано такое окошко, с условиями которого Вам остается только согласиться:
Сервис не накладывает никаких ограничений на размер загружаемых файлов! В пределах своей квоты в 50 GB Вы можете загрузить тысячи небольших файлов, либо, к примеру, два файла по 25 гигабайт каждый. Однако следует помнить, что сами браузеры имеют функциональные ограничения на размер файлов, которые они могут скачать. Наиболее «уязвимы» в этом плане браузеры Internet Explorer, Firefox и Safari, которые еще полностью не поддерживают HTML5.
Создание общего доступа к папкам с файлами
К любой папке в своем онлайн хранилище, Вы можете организовать общий доступ (расшарить её). Для этого проделайте следующие манипуляции:
- Кликните на ней правой клавишей мыши и в выпадающем контекстном меню выберите опцию «Общий доступ».
- Укажите адрес электронной почты пользователя, которому надо расшарить доступ к папке (можно сразу указать целый список пользователей).
- Выберите способ доступа: только для чтения, чтение и запись либо полный доступ.
После этого указанному пользователю на email придет письмо с ссылкой для доступа к расшаренной папке.
Как создать ссылку на файл в хранилище Mega nz
Помимо доступа к папкам, Вы можете разрешать любым пользователям скачивать из Вашего хранилища какие-то отдельные файлы.
Для этого надо кликнуть правой кнопкой мыши на любом файле в облаке и выбрать опцию «Получить ссылку»:
- Ссылка без ключа дешифрования
- Ссылка с ключом
Также в этом окошке можно отдельно скопировать сам ключ дешифрования. В чем же отличие между этими типами ссылок? А оно очень важное!
В первом случае пользователь, перейдя по ссылке, для скачивания файла должен будет ввести в специальное окошко ключ дешифрования, который Вы ему сообщите. А во втором случае, пользователь переходит по ссылке с уже «вшитым» ключом безопасности и может сразу же скачать файл.
Обзор функционала и настроек хранилища, не вошедших в обзор, смотрите в данном видео:
Почему Мега можно доверить личные данные?
- Разработчики уделяют самое пристальное внимание конфиденциальности хранимых данных. Сама аббревиатура MEGA расшифровывается как Mega Encrypted Global Access, т.е. Мега Зашифрованный Глобальный Доступ).
- Шифрование файлов прямо в браузере при помощи алгоритма AES.
- Сервис не хранит пароли пользователей для доступа к облачному диску.
- Все файлы в хранилище находятся в зашифрованном виде, их нельзя просмотреть без ключа безопасности. Даже если злоумышленники получат доступ к серверам компании, они не смогут прочитать данные пользователей.
- Даже к файлам, предназначенных для публичного скачивания, можно отдельно генерировать ключи доступа.
Mega Cloud Storage - это современное виртуальное хранилище информации, которое выгодно выделяется среди похожих контейнеров увеличенным объемом бесплатного дискового пространства - целых 50 ГБ. Поддерживается доступ с портативных устройств на базе Blackberry, iOS, Android и Windows Mobile. Основатели сервиса - разработчики известного ранее файлообменника Megaupload.
Возможности:
- виртуальный контейнер файлов с большим объемом бесплатного места (50 ГБ);
- шифрование данных по алгоритму AES;
- поддержка мобильных устройств;
- наличие дополнений для Chrome и Firefox;
- интерфейс на русском языке.
Принцип работы:
после загрузки и запуска утилита предложит внести данные аккаунта - без регистрации воспользоваться сервисом не получится. Затем следует выбрать тип синхронизации - полный (вся информация переносится в «облако») или выборочный (определенные директории).
После внесения параметров приложение «свернется» в системный трей. Нажав на иконку, можно просмотреть свободное место и добавить новые папки для обмена данными.
Окно интерфейса программы логично разделено на пять вкладок. Благодаря русской локализации разобраться с функционалом смогут даже неопытные пользователи. Самое «вкусное» на наш взгляд находится в последнем разделе (кнопка «Продвинутые»). В нем можно задать индивидуальный алгоритм синхронизации определенных типов объектов.
Плюсы:
- большой объем «облака»;
- гибкие ценовые предложения;
- можно задать персональные условия обмена файлами.
Минусы:
- малое число пользователей в Рунете;
- есть ограничения на трафик при загрузке данных с «облака» большим количеством пользователей.
Mega Cloud - достойный конкурент даже именитому Google Drive. Хранилище подкупает своей простотой, высокой степенью безопасности и наличием клиентов для популярных платформ. Корпоративным клиентам понравится лояльная ценовая политика разработчиков и возможность заказать большой объем виртуального места для хранения информации. Например, в тарифе Pro III предлагается целых 4 ТБ пространства.
Аналоги:
- Яндекс.Диск - виртуальное хранилище от разработчиков самого популярного поисковика Рунета;
- Copy Cloud Storage - мощный защищенный архив.
Новое в версии 4.5 (iOS) (01.03.2019)
- Групповые звонки. Вы можете сделать групповой звонок с общим количеством до двадцати человек и максимум 6 видео. Просто откройте групповой чат и начните групповой звонок в правом верхнем углу. Убедитесь, что у вас есть права доступа выше, чем только для чтения.
- Навигация по вызову. Вы можете использовать MEGA, как обычно, во время разговора, нажав по верхнему левому углу..
Новое в версии 3.6.0 (227) (Android) (28.02.2019)
- Названия для групп
- Исправлено несколько ошибок
Новое в версии 4.0.1 (Windows) (18.01.2019)
- Новый дизайн основного окна
- Улучшенный помощник по настройке
- Поддержка показа публичных служебных объявлений
- Современные уведомления
- Обновлены сторонние библиотеки
- Другие мелкие исправления и улучшения
Mega (файлообменник) - безопасный сервис облачного хранения и обмена файлами, который предоставляет от 15 ГБ надежного хранилища бесплатно. Вы можете расширить облачное хранилище, используя платный Pro-аккаунт, с 200 ГБ до 4 ТБ.
В отличие от многих других провайдеров облачных систем хранения данных, с использованием Mega ваши данные шифруются и расшифровываются только с помощью клиентских устройств. Таким образом, ваши данные надежно защищены и доступны только вам. Mega шифрует весь контент прямо в браузере или клиенте MEGASync с помощью алгоритма AES.
Ваши данные доступны в любое время, с любого устройства, в любом месте. Добавьте файлы, синхронизируйте папки с облаком и другими устройствами, делитесь данными с доверенными контактами - обновление происходит в режиме реального времени. Доступ к файлам вы можете получить с помощью компьютера, смартфона или планшета, любого браузера.
Основные преимущества MEGASync
Безопасность : Ваши данные зашифрованы от места отправки до места доставки. Никто не сможет перехватить их во время хранения или перемещения.
Гибкость : Синхронизация любых папок на компьютере, смартфоне или планшете с облачным хранилищем. Синхронизируйте любое количество папок одновременно.
Скорость : Воспользуйтесь мощной инфраструктуры MEGA и возможностью отправки с помощью нескольких соединений.
Щедрость : храните до 50 ГБ бесплатно при использовании достижений MEGA.
Клиент MEGASync доступен для компьютеров с ОС Windows (ожидается поддержка Mac OS X и Linux) и мобильных устройств на базе iOS и Android.