• Post category:Общее
  • Запись изменена:08.11.2022

Онлайн-редактирование и совместная работа имеют соответствующие пробелы в безопасности файлов — в передаче данных в реальном времени и авторизованном совместном использовании. Преодоление этих ограничений существовавшей ранее индивидуальной защиты документов является ключевой задачей рассматриваемой схемы шифрования.

Двухуровневая модель шифрования, используемая в Р7, включает:

  • симметричное шифрование документов по алгоритму AES-256;
  • Асимметричное шифрование RSA паролей документов, необходимых для авторизованного совместного использования и совместной работы..

С текущей моделью шифрования можно добиться следующего:

  • Конфиденциальность зашифрованных данных. В отличие от шифрования данных в состоянии покоя, сквозное шифрование документов в частных комнатах работает с активными данными каждого пользователя или группы пользователей и не подлежит центральному администрированию.
  • Устойчивость к атакам. Алгоритм AES-256 гарантирует, что подход грубой силы к взлому пароля не будет эффективен против безопасности документа, независимо от применяемой вычислительной мощности.
  • Безопасная модель обмена ключами. Принцип алгоритма RSA, основанный на сообщениях, представляется наиболее надежной моделью управления аутентифицированным доступом к зашифрованным данным, если пользователи не злоупотребляют закрытыми ключами. Это также позволяет выполнять операции с секционированными данными для поддержания того же уровня защиты при обработке данных в режиме реального времени.
  1. Каждый пользователь получает пару ключей шифрования, закрытий и публичный, при первом входе в систему из экземпляра приложения. Эта персональная пара ключей является необходимым элементом асимметричного уровня механизмов шифрования и дешифрования документов.
  2. Если в DMS нет ключей, они генерируются методом NSOpenSSL::RSA_GenerateKeys:
    if (!bIsServerPrivateKeyExist)
    {
        unsigned char* publicKey = NULL;
        unsigned char* privateKey = NULL;
        NSOpenSSL::RSA_GenerateKeys(publicKey, privateKey);
        ...
    }
    
  3. Чтобы зашифровать закрытый ключ перед его сохранением в базе данных, Р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);
    
  4. Расшифровка закрытого ключа выполняется, когда синхронизированную копию временного файла необходимо расшифровать при редактировании. Для расшифровки ключа используется алгоритм 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. Пользователь 1 и пользователь 2 открывают один и тот же документ в редакторе документов.
  2. Пользователь 1 вносит изменения в открытый документ.
  3. Редактор шифрует изменения с помощью алгоритма NSOpenSSL::AES_Encrypt_desktop на основе AES-256 CBC.
  4. Все сохраненные изменения отправляются на портал.
  5. Пользователь 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\