Облачное хранилище mega. Создание общего доступа к папкам с файлами
Я уверен, что все активные интернет пользователи слышали про историю закрытия популярного файлообменника Megaupload и злоключениях его создателя. И уж наверняка знают о новом проекте Кима Доткома под названием Mega . Напомним вам, что этот сервис является реинкарнацией предыдущего творения Кима, но совершенно на другой платформе.
При его создании были учтены все недостатки и ошибки Megaupload и упор сделан прежде всего на устойчивость файлообменника. Причем не только к сетевым нагрузкам, но и атакам правообладателей. Для этого огромное внимание уделено конфиденциальности и безопасности ваших данных. Все загруженные вами файлы шифруются специальным алгоритмом, поэтому администрация сервиса не имеет понятия о содержимом ваших аккаунтов и, соответственно, не может нести ответственность за него. С этой же целью серверы Mega находятся в разных странах, так что при проблемах с законами в одной стране это не повлечет краха всего сервиса и ваши данные останутся в неприкосновенности.
Сегодня мы хотим познакомить вас поближе с работой этого сервиса и предлагаем вам небольшой скриншот-тур по его функциям.
Для начала работы необходимо зарегистрироваться. Для этого нужно указать свое имя, почтовый адрес и пароль. Сервис прекрасно русифицирован и отлично оформлен.
После окончания регистрации вам вышлют ссылку для входа на указанный вами адрес электронной почты. Перейдя по ссылке, придется пару минут подождать пока для вас сгенерируются специальные секретные ключи, с помощью которых будут шифроваться данные.
Попадаем в свое облачное хранилище. Здесь все понятно и просто: слева дерево папок, по центру область отображения файлов, сверху панель инструментов. Файлы можно загружать нажатием на кнопку Новая закачка или простым перетаскиванием в окно сервиса. Загрузки происходят исключительно быстро.
Файлы можно организовать в папки. Перемещение файлов между папками производится перетаскиванием или с помощью контекстного меню (см. ниже). Уровень вложенности каталогов не ограничен.
В появившемся всплывающем окне генерируется ссылка для скачивания файла.
Обратите внимание на опции в верхней части этого окна. Если включено только Ссылка на файл
, то ваш адресат не сможет скачать файл без ввода специального пароля, который вы можете выслать ему отдельно по электронной почте. Таким образом можно публиковать ссылки на скачивание в общедоступных местах, например в блоге или форуме, но разрешать скачивать только определенным лицам.
Если же дополнительно отмечен Ключ файла
, то по созданной ссылке файл сможет скачать любой желающий. Чекбоксы Имя
и Размер файла
добавляют соответствующие характеристики файла.
Контекстное меню папок немного отличается. Здесь имеется пункт Совместный доступ . С его помощью вы можете пригласить к совместному использованию своих сотрудников, друзей или семью. Приглашения рассылаются по электронной почте, а доступ может быть разного уровня. Read only — только просмотр, Read & Write — просмотр и закачка своих файлов в папку, Full access — просмотр, закачка и удаление файлов.
В разделе Аккаунт можно просмотреть заполненность своего хранилища, купить дополнительное место, изменить настройки передачи данных и некоторые другие опции.
Немного личных впечатлений
Файлообменный сервис Mega производит мега впечатление. Отличная скорость работы, понятный и приятный интерфейс, 50 гигабайт дискового пространства, отсутствие ограничений на трафик и размер закачиваемых файлов плюс полная бесплатность и приватность ваших данных. Это просто праздник какой-то!
Возможности сервиса Mega можно использовать в самых разных целях. Прежде всего это распространение различного вида информации, что очень порадует пиратов всех континентов. Впрочем, возможности ограниченого доступа по паролям могут пригодиться и для легальной продажи своих творений, например музыкантами. Совместный доступ к папкам делают 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 Добавить метки
Mega - облачное хранилище, которое предлагает для хранения данных пользователям 50 ГБ дискового пространства бесплатно. Подобная прибавка памяти к жесткому диску никому не будет лишней.
Расширение открывает доступ к облачному хранилищу посредством браузера. Это сокращает время загрузки, улучшает производительность и повышает безопасность. Говоря о дисковом хранении MEGA, речь идет о глобальном безопасном доступе. Используя браузерное расширение, необходимые файлы будут доступны днем и ночью. MEGA обеспечивает сквозное шифрование. Это значит, что сообщения, фотографии, видео защищены от попадания в чужие руки. Под вашим контролем только те облачные хранилища, у которых есть доступ к персональным данным. Даже у MEGA нет к ним доступа! В отличие от большинства других облачных сервисов, разработчики MEGA выступают за безопасное сотрудничество. Это позволяет обмениваться информацией, связываться с контактами, просматривать обновления в режиме реального времени.
Большое пространство для хранения
MEGA не просто безопаснее конкурентов. Предоставляемое количество бесплатного хранилища в разы больше, чем у других. Благодаря функции синхронизации файлов в режиме реального времени, все файлы в безопасности, а при необходимости могут быть восстановлены. Чтобы обеспечить независимую проверку правильности и целостности криптографической модели, а также ее реализации, MEGA публикует полный исходный код клиентских приложений. И это радует!
Сегодня, сеть Интернет предлагает большое количество файловых хранилищ, похожих друг на друга. Первое, что приходит на ум: Яндекс.Диск, Google Drive, Dropbox, OneDrive. Отличие MEGA от конкурентов заключается в том, что оно предоставляет 50 ГБ дискового хранения бесплатно для зарегистрированных пользователей. MEGA не ограничивает размер файлов, загружаемых в облачное пространство.
Всем привет! На связи с Вами Марат Наурузбаев. В этой статье я вам расскажу и покажу в видео как зарегистрироваться и пользоваться облачным сервисом для хранения файлов Mega , который предоставляет бесплатно 50 Гб дискового пространства! Mega облако также шифрует все ваши данные на стороне клиента и не имеет ограничений на размер загружаемых файлов.
В своем бесплатном видеокурсе я говорил про то что нужно резервировать свои важные данные (документы, проекты, личные фото и видео и т.д.) на другой жесткий диск, но еще надежнее будет размещать копию важных данных также и на облачном хранилище. Кроме того, что это будет надежнее, так ваши данные теперь будут доступны вам из любой точки земного шара, в том числе и со смартфона. Не правда, ли замечательная возможность пользоваться (просматривать и редактировать) свои файлы в любом месте, будь вы на работе, отдыхе или в кругу друзей?
Регистрация в Mega
Для того чтобы начать использовать облако для хранения файлов Mega, необходимо зарегистрироваться в нем. Для этого переходим на официальный сайт Mega . Нажимаем «Регистрация »
Создаем бесплатную учетную запись. Для этого вводим свои данные: Имя, Фамилия, Email и придумываем сложный пароль. Соглашаемся с условиями предоставления услуг Mega и нажимаем «Создать учетную запись »
Примечание: Если вы не находите письмо об активации аккаунта, проверьте папку Спам. Если и там его нет, повторите процедуру регистрации, указав другой Email.
Подтверждаем учетную запись вводом пароля, который придумали ранее
Выбираем бесплатный тариф (50 Гб ) или один из платных тарифов
Готово! Регистрация в облачном сервисе Mega
пройдена.
Как пользоваться Mega
Как только Вы зарегистрировались в Mega, все операции Вы можете проводить в браузере. Для начала Вы можете войти в свою панель и проверить данные своего тарифного плана. Для этого кликаем на «Dashboard » в верхнем левом углу
Чтобы начать работать с Мега, переходим в основное окно, кликнув на «Облачный диск ». Здесь Вы увидите основные кнопки работы с сервисом: «Новая папка », «Загрузить файл », «Загрузить папку »
Также проверьте настройки своего аккаунта, кликнув «Настройки ». Например, в разделе «Продвинутые », во вкладке «Трансферы » можно указать количество параллельных соединений на загрузку и количество параллельных соединений на скачивание, а также параметры ограничения скорости на загрузку и другие параметры
Теперь загрузим папку или файл в облако Мега. Для этого переходим в основное окно сервиса, кликнув «Облачный диск ». Нажимаем «Загрузить папку » и указываем папку на Вашем компьютере, которую хотим загрузить в облако
Наша папка с компьютера, в моем случае папка с фото, начала загружаться в облако Mega…
После окончания загрузки мы можем увидеть содержимое данной папки прямо в браузере. Фотографии отображаются эскизами, что очень удобно
При наведении курсора на любой файл в облаке, появляется значок контекстного меню, и при клике на нем, мы можем выбрать основные операции для данного файла. Например, выбираем «Просмотр »
Откроется галерея с просмотром данного фото с возможностью просмотра остальных фото в данной папке. Для этого кликаем мышью на значках < или > , слева и справа фото соответственно
Также мы можем переименовать, переместить, скопировать или скачать любой файл к себе на компьютер. Например, при выборе скачать мы можем выбрать обычную загрузку или в сжатом формате ZIP. Выбираем «»
Файл будет сохранен на жестком диске вашего компьютера.
Общий доступ к папкам в Mega
В Мега облачное хранилище возможно предоставить общий доступ к папкам. Это удобно, когда вы, например, хотите, чтобы вашу определенную папку с файлами в облаке Mega видели не только Вы, но и ваши друзья или коллеги по работе. Для этого Вам нужно предоставить общий доступ к данной папке. Общий доступ можно предоставить другим лицам только по приглашению по Email.
Для того, чтобы предоставить общий доступ к определенной папке, кликаем правой кнопкой мыши по этой папке и в контекстном меню выбираем «Общий доступ »
Далее вбиваем Email того человека, которому хотим предоставить общий доступ к папке, даем ему права «Только для чтения », «Чтение и запись » или «Полный доступ » и нажимаем «Готово »
На Email того человека, которому вы предоставили общий доступ к папке, придет письмо, в котором он может принять приглашение, кликнув по ссылке в письме
и нажав кнопку «Принять »
Теперь Ваша папка, к которой вы предоставили общий доступ будет видна у приглашенного человека в облачном хранилище Mega. Естественно, приглашенный человек тоже должен иметь аккаунт в Mega
Кроме общего доступа к папке, у Вас появится возможность общаться с данным человеком посредством чата, аудио или видео звонков. Причем все ваше общение будет проходить в зашифрованном виде. Вот лазейка для общения террористов 🙂
Как получить ссылку в Mega
Полезная функция Mega, это предоставление ссылки на скачивание любого файла, размещенного в облаке Mega другим пользователям.
Допустим, у Вас имеется коллекция фото в Mega облаке и Вы хотите дать ссылку на определенное фото или на всю папку целиком какому то пользователю. Неважно имеется ли у него учетная запись Мега или нет, пользователь, после получения предоставленной ссылки от Вас, сможет скачать данный файл или папку целиком к себе на компьютер.
Имеется возможность сформировать два вида ссылки: без ключа и с ключом дешифрования .
Если Вы это делаете в первый раз, то выйдет предупреждение о защите авторских прав, с которым Вам нужно ознакомиться и нажать «Я согласен »
В следующем окне выбираете вариант экспорта ссылок: «Ссылка с ключом » или «Ссылка без ключа ». Давайте сначала предоставим “свободную” ссылку, т.е. ссылку с вшитым ключом. Для этого жмем «Ссылка с ключом » и нажимаем «Копировать »
Ваша ссылка скопируется в буфер обмена (временная память). Теперь эту ссылку Вы можете отправить своему другу, брату или товарищу 🙂 . Как это сделать, я думаю не стоит рассказывать, можете отправить ссылку по почте, в сообщении в социальных сетях, в Viber или Whatsapp и т.д.
- Загрузить с MEGAsyng – загрузка файла только после установки клиента MEGAsyng. У кого клиент уже установлен, начнется закачка данного файла через клиент MEGAsyng;
- Загрузить в браузере — загрузка файла обычным способом в браузере;
- Импортировать на облачный диск – импорт файла на свой аккаунт в Mega.
а ключ дешифрования сформируем мы, выбрав вариант экспорта ссылок «Ключ дешифрования » и который предоставим пользователю за определенное вознаграждение 🙂
Пользователь вводит полученный от вас ключ и нажимает «Дешифровать »
И ему предлагается знакомые уже нам варианты скачивания файла. Выбираем, например, «Загрузить в браузере »
Видим, как файл скачивается и расшифровывается…
Клиент MEGA для Windows
Облачное хранилище Mega, кроме работы в браузере, предоставляет официальные приложения для Windows, Mac и Linux, а также мобильные приложения для Android и Iphone.
Рассмотрим, как установить и пользоваться приложением синхронизации Megasync для Windows.
Примечание: Синхронизация данных - ликвидация различий между двумя копиями данных. Предполагается, что ранее эти копии были одинаковы, а затем одна из них, либо обе были независимо изменены.
Для этого переходим на официальный сайт Mega и в правом верхнем углу нажимаем Меню
Находим пункт меню «Приложения » — «Приложение синхронизации »
Кликаем по кнопке «Загрузить бесплатно »
Указываем место сохранения дистрибутива Megasync и нажимаем «Сохранить »
Запускаем скачанный файл «MEGAsyncSetup » на установку
Установка клиента Megasync стандартная и не вызовет у Вас проблем…
Чтобы пролистать рисунки жмите «Назад » или «Вперед »
После первого запуска MEGAsync попросит Вас авторизоваться. Нажимаем «Вход » или «Регистрация », если Вы не зарегистрированы
При входе в учетную запись вводим почту и пароль
Выбираем «Выборочная синхронизация » и нажимаем «Вперед »
Указываем папки синхронизации на вашем жестком диске и в папке облака Мега. Оставляете по умолчанию или исправляем по кнопке «Изменить ». В дальнейшем Вы можете изменить эти папки или добавить другие. Нажимаем «Вперед »
Нажимаем «Готово »
Клиент MEGAsync запустится и будет работать в фоне. Его значок отобразится в трее и при клике по нему левой кнопкой мыши откроется небольшое окно, в котором отобразится панель управления Mega
Кликаем по шестеренке в панели управления и нажимаем настройки
Окно настроек состоит из нескольких вкладок, немного пройдемся по ним…
Вкладка «Учетная запис ь» отображает данные вашего Email и имеется возможность зарезервировать Ваш ключ, если Вы забудете пароль от учетной записи. Также отобразится ваша квота по дисковому пространству, опция включения/отключения уведомлений и включение/отключения автозагрузки приложения
Во вкладке «Синхронизации » можно добавить/удалить синхронизуемые папки
Во вкладке «Передача » можно выставить скорость загрузки и число параллельных TCP-подключений на передачу
Во вкладке «Продвинутые » можно изменить папки загрузки и скачивания по умолчанию, а также исключить имена файлов и папок из синхронизации. Можно исключить также по размеру файлов.
Например, можно исключить временные файлы и (или) файлы видео AVI, MTS или MP4, которые как правило занимают много дискового пространства или файлы MP3 с музыкой
По настройкам прошлись, нажимаем «OK » для сохранения настроек.
Теперь клиент MEGAsynс будет работать незаметно для Вас в фоне и синхронизировать файлы указанных папок в настройках клиента.
Чтобы отдельно загрузить какой либо файл на облако Mega через клиент MEGAsync, можно воспользоваться меню клиента. Для этого кликаем по значку MEGAsync в трее правой кнопкой мыши и выбираем «»
Откроется окно выбора файла, в котором мы можем выбрать файл(ы) или папку и нажать кнопку «Open »
Файл можно загрузить на Mega, просто кликнув по файлу в проводнике Windows правой кнопкой мыши и выбрав в контекстном меню «Загрузить на MEGA »
И наоборот, скачать файл с облака MEGA можно кликнув по значку MEGAsync в трее правой кнопкой мыши и выбрав в контекстном меню «Скачать »
В появившемся окне выбора папки выбрать файл(ы) или папку и нажать «OK »
Любые загрузки на облако или с облака можно увидеть в панели управления MEGAsync , кликнув по его значку в трее левой кнопкой мыши
Клиент MEGA для Android
Теперь рассмотрим как установить официальное приложение MEGA на смартфон на Android .
Для этого на своем смартфоне входим «Play Market » и вводим в строке поиска: “mega ”. Выбираем в результатах поиска MEGA от MegaLtd и тапаем по нему
Нажимаем «Установить »
Пойдет процесс скачивания и установки приложения
После установки приложения нажимаем «Открыть », т.е запускаем приложение
Жмем «Вход », если у Вас есть учетная запись Mega или «Создать учетную запись » для создания учетной записи
После нажатия «Вход » вводим Email и пароль указанный при регистрации
После ввода пароля идет расчет ключей шифрования
И происходит вход в учетную запись, после чего нужно указать через какой канал загружать фото с камеры на облако Mega, только Wi — Fi , или Wi — Fi или тарифный план (сотовая связь)
Заходим в настройки приложения Mega
И меняем или оставляем по умолчанию настройки приложения
Теперь мы можем открывать файлы, хранящиеся в облачном хранилище прямо на смартфоне! Например, заходим в папку фото…
И видим фото, которые мы скопировали в облако Mega с компьютера
При тапе на любом фото, оно открывается на весь экран
Также, у каждого файла есть контекстное меню, с помощью которого мы имеем возможность скачать файл на телефон, получить ссылку на файл, скопировать файл и другие операции…
Кроме меню на определенный файл имеется еще и общее меню приложения
С помощью которого например мы можем загрузить файл в облако. Для этого выбираем «Загрузить »
Выбираем тип файла (изображение, аудио или видео)
Находим данный тип файла, например фото у себя на смартфоне, для загрузки его в облако Mega
Вот основные функции облачного хранилища Mega. Данное облако резервирует и синхронизирует ваши файлы между компьютером, планшетом и смартфоном, а также предоставляет удобный доступ к вашим файлам из любой точки земного шара, где присутствует интернет.
Согласитесь, 50 Гб бесплатного зашифрованного дискового пространства и отсутствием ограничений на размер файла мало какой сервис предоставит. Совместный доступ к файлам, чат и секретные ссылки делают облако Mega еще привлекательнее.
Не обошлось и без минусов, скорость закачки файлов в Мега не всегда быстрая.
Кто знает облачный сервис с таким же или большим бесплатным объемом дискового пространства и с такими же возможностями, прошу написать в комментариях.
Хотите узнать больше о данном файловом хранилище?
- Как увеличить размер бесплатного дискового пространства Mega в 5-10 раз ?
- Как добавить папки для синхронизации?
- Как исключить только определенные файлы из синхронизации?
Как синхронизировать только важные данные и какую лучше программу для этого использовать?
Если эти и другие вопросы по резервному копированию интересны Вам, то я могу создать для Вас видеокурс по резервному копированию и синхронизации Ваших данных . Это будет обновленный + видеоуроки о программе синхронизации и облачных хранилищах . Только он будет не бесплатный, но согласитесь, что потеря важных файлов будет стоить во много раз дороже!
Кому интересен данный видеокурс, прошу Вас проголосовать ниже. Мне важно услышать Ваше мнение о данной теме. Спасибо!
Сегодня речь пойдет о новом мега хранилище. Данный сервис совсем молодой, но с серьезными намерениями конкурировать с аналогичными . Его первоочередная особенность которая возможно выдвинет его в лидеры, это объем предоставляемого бесплатного пространства равный 50Гб. Многие облачные сервисы за такой объем берут помесячную оплату, а тут 50Гб и все это бесплатно. И так, обзор.
Мега хранилище
Данный сервис расположен по адресу https://mega.co.nz/.
Для входа на сервис необходимо пройти очень простую процедуру регистрации.
Для начала выбираем язык на котором будем работать с облаком и заполняем не сложную форму регистрации, подтверждаем регистрацию через письмо которое придет на почтовый ящик указанный в регистрации. Входим в свой аккаунт.
Здесь видно членство, оно бесплатно. Есть и плантные услуги которые предоставляют больший объем для передачи и хранения данных. Следующий пакет услуг называется Pro 1 и начинается от 500Гб для хранения и 1 Тб для передачи данных. Стоимость пакета 9.99 евро. Имеются еще два пакета Pro 2 и Pro 3.
Ниже видно какой объем для хранения использован из предоставленного вам пакета. Здесь же можно произвести некоторые не сложные настройки необходимые для пользования хранилищем.
Если зайти в «менеджер файлов» можно увидеть стандартную панель управления файлами.
Провел небольшой тест на загрузку и скачивание файла, получение ссылки. Результатами удовлетворен, рекомендую к использованию.
1. Выбрать нужный файл, нажать правой мышкой, и в открывшемся окне выбрать «Получить ссылку».
2. В появившемся окне будет предложено:
Что значит с ключом? Это означает, что перейдя по этой ссылке любой пользователь может получить доступ к файлу для скачивания и просмотра.
б) Если файл несет конфидециальную информацию и его необходимо «зашифровать». В этом случае ссылка копируется в буфер обмена без ключа. Ключ копируется в буфер отдельно от ссылки.
Для получения доступа к файлу при переходе по ссылке без ключа появится дополнительное окно в которое необходимо ввести ключ.
Облако mail.ru дарит всем желающим 1Тб дискового пространства с 20.12.2013 по 20.01.2014. Спешите 1Тб.