Онлайн-редактирование и совместная работа имеют соответствующие пробелы в безопасности файлов — в передаче данных в реальном времени и авторизованном совместном использовании. Преодоление этих ограничений существовавшей ранее индивидуальной защиты документов является ключевой задачей рассматриваемой схемы шифрования.
Двухуровневая модель шифрования, используемая в Р7, включает:
- симметричное шифрование документов по алгоритму AES-256;
- Асимметричное шифрование RSA паролей документов, необходимых для авторизованного совместного использования и совместной работы..
С текущей моделью шифрования можно добиться следующего:
- Конфиденциальность зашифрованных данных. В отличие от шифрования данных в состоянии покоя, сквозное шифрование документов в частных комнатах работает с активными данными каждого пользователя или группы пользователей и не подлежит центральному администрированию.
- Устойчивость к атакам. Алгоритм AES-256 гарантирует, что подход грубой силы к взлому пароля не будет эффективен против безопасности документа, независимо от применяемой вычислительной мощности.
- Безопасная модель обмена ключами. Принцип алгоритма RSA, основанный на сообщениях, представляется наиболее надежной моделью управления аутентифицированным доступом к зашифрованным данным, если пользователи не злоупотребляют закрытыми ключами. Это также позволяет выполнять операции с секционированными данными для поддержания того же уровня защиты при обработке данных в режиме реального времени.
Генерация ключей и управление ими
- Каждый пользователь получает пару ключей шифрования, закрытий и публичный, при первом входе в систему из экземпляра приложения. Эта персональная пара ключей является необходимым элементом асимметричного уровня механизмов шифрования и дешифрования документов.
- Если в DMS нет ключей, они генерируются методом NSOpenSSL::RSA_GenerateKeys:
if (!bIsServerPrivateKeyExist) { unsigned char* publicKey = NULL; unsigned char* privateKey = NULL; NSOpenSSL::RSA_GenerateKeys(publicKey, privateKey); ... }
- Чтобы зашифровать закрытый ключ перед его сохранением в базе данных, Р7 использует алгоритм NSOpenSSL::AES_Encrypt_desktopalgorithm, основанный на цепочке блоков шифрования AES-256:
std::string privateEnc; NSOpenSSL::AES_Encrypt_desktop(U_TO_UTF8(tmpInfo->m_sPassword), sPrivate, privateEnc, CAscRendererProcessParams::getInstance().GetProperty("user")); info.PrivateKeyEnc = NSFile::CUtf8Converter::GetUnicodeFromCharPtr(privateEnc);
- Расшифровка закрытого ключа выполняется, когда синхронизированную копию временного файла необходимо расшифровать при редактировании. Для расшифровки ключа используется алгоритм NSOpenSSL::AES_Decrypt_desktop:
std::string privateKey; if (nServerPrivateKeyVersion == 2) NSOpenSSL::AES_Decrypt_desktop_GCM(U_TO_UTF8(tmpInfo->m_sPassword), privateKeyEnc, privateKey, CAscRendererProcessParams::getInstance().GetProperty("user"), nServerPrivateKeyVersionOffset); else NSOpenSSL::AES_Decrypt_desktop(U_TO_UTF8(tmpInfo->m_sPassword), privateKeyEnc, privateKey, CAscRendererProcessParams::getInstance().GetProperty("user")); info.PrivateKey = NSFile::CUtf8Converter::GetUnicodeFromCharPtr(privateKey);
Операции с зашифрованными файлами
Для выполнения операций с зашифрованными файлами, включая шифрование файлов, расшифровку, создание, редактирование и совместное использование, Р7 использует индивидуальные учетные данные пользователей (пара ключей RSA) и пароль документа (ключ шифрования документа).
Зашифрованные файлы, кроме самого шифротекста, содержат массивы открытых ключей всех пользователей и зашифрованные с помощью этих ключей пароли документов. Это позволяет установить коллективный доступ к файлу и, следовательно, обеспечить совместное использование и совместную работу над зашифрованными документами.
Для шифрования пароля файла с помощью открытого ключа каждого авторизованного пользователя используется алгоритм NSOpenSSL::RSA_EncryptPublic_desktop:
std::string sKey = arguments[0]->GetStringValue().ToString(); NSStringUtils::string_replaceA(sKey, " ", "\n"); std::string sMessage = arguments[1]->GetStringValue().ToString(); std::string sOut; NSOpenSSL::RSA_EncryptPublic_desktop((unsigned char*)sKey.c_str(), sMessage, sOut); retval = CefV8Value::CreateString(sOut); return true;
Обратный алгоритм NSOpenSSL::RSA_DecryptPrivate_desktop используется для расшифровки файла с использованием закрытого ключа пользователя:
std::string sKey = arguments[0]->GetStringValue().ToString();
std::string sMessage = arguments[1]->GetStringValue().ToString();
std::string sOut;
NSOpenSSL::RSA_DecryptPrivate_desktop((unsigned char*)sKey.c_str(), sMessage, sOut);
retval = CefV8Value::CreateString(sOut);
return true;
При доступе к зашифрованному файлу он сначала отправляется на компьютер пользователя, прежде чем приложение начнет расшифровку.
Зашифрованное совместное редактирование
В приведенных ниже шагах объясняется процесс совместного редактирования зашифрованного документа в Р7 Document Server.
- Пользователь 1 и пользователь 2 открывают один и тот же документ в редакторе документов.
- Пользователь 1 вносит изменения в открытый документ.
- Редактор шифрует изменения с помощью алгоритма NSOpenSSL::AES_Encrypt_desktop на основе AES-256 CBC.
- Все сохраненные изменения отправляются на портал.
- Пользователь 2 получает зашифрованные изменения, и компьютер пользователя расшифровывает их с помощью метода NSOpenSSL::AES_Decrypt_desktop.
Расположение данных
Р7 использует хранилище данных для документов и зашифрованных данных между облачным хранилищем и локальным хранилищем пользователя для поддержания применяемой схемы. Распределение данных выглядит следующим образом:
Вещь | Расположение в экземпляре | Местоположение на устройстве |
---|---|---|
Закрытый ключ | Зашифровано, в базе данных | — |
Публичный ключ | База данных и внутри зашифрованных файлов (в файловой системе) | — |
Ключ шифрования файла | Зашифровано, внутри зашифрованных файлов (в файловой системе) | — |
Пользовательский пароль | — | — |
Зашифрованные файлы в состоянии покоя | На сервере | — |
Зашифрованные файлы при редактировании | — | На машине, во временной папке |
Удаление ключей
Десктопное приложение хранит все прочитанные ключи. Чтобы сбросить их и добавить новые, выполните следующие действия:
- удалить ключи в базе данных DMS;
- удалите файл cloud_crypto.xml из каталога sdkjs-plugins. Путь к папке зависит от используемой операционной системы:
- Для Linux — /opt/Р7/desktopeditors/editors/sdkjs-plugins/
- Для Windows — %ProgramFiles%\Р7\DesktopEditors\sdkjs-plugins\