elektroyar
elektroyar личный блог
08 апреля 2021, 00:52

Зашифрованный и сжатый JSON с комментариями в качестве файла конфигурации

В процессе разработки ПО для трейдинга столкнулся с тем, что программа должна иметь целую кучу файлов конфигурации, содержание которых хотелось бы скрыть от пользователя. Это могут быть настройки стратегий, параметры авторизации на сервере, текст для разных языков интерфейса и т.д.

Для файлов конфигурации я уже давно использую файлы с JSON. Очень удобная вещь. Осталось лишь добавить поддержку комментариев и зашифровать текст при помощи алгоритма AES. А для большей красоты еще и сжать текст перед шифровкой алгоритмом brotli.

Сказано — сделано. Встречайте — crypto-jsonпроект на гитхабе. Репозиторий содержит готовый редактор JSON с комментариями, который может также сохранить текст в зашифрованном виде. Настройки сжатия и шифрования можно задать перед сохранением файла и во время открытия. Также редактор позволяет сделать проверку JSON и может подсвечивать проблемные места.

Зашифрованный и сжатый JSON с комментариями в качестве файла конфигурации
Зашифрованный и сжатый JSON с комментариями в качестве файла конфигурации


Работа с зашифрованными JSON файлами в C++


Для использования зашифрованных файлов в программе библиотека содержит простые функции. Покажу пример кода, который раскрывает почти все возможности библиотеки:

#include <crypto-json/crypto-json.hpp>

//...

/* загрузим текст из файла test.json */
std::string src;
crypto_json::load_file("test.json", src);

/* настроим тип шифрования - алгоритм AES в режиме CFB, длина ключа 256 */
crypto_json::EncryptionAlgorithmType type = crypto_json::EncryptionAlgorithmType::USE_AES_CFB_256;

/* создадим ключ и инициализирующий вектор длиной 256 */
std::array<uint8_t, 32> key;
std::array<uint8_t, 32> iv;

/* для примера, зададим случайный ключ и инициализирующий вектор */
crypto_json::generate_key_or_iv(key);
crypto_json::generate_key_or_iv(iv);

/* преобразуем ключ и инициализирующий вектор в hex-строку и выведем на экран */
std::cout << "key:" << std::endl << crypto_json::to_hex_string(key) << std::endl;
std::cout << "iv:" << std::endl << crypto_json::to_hex_string(iv) << std::endl;

/* преобразуем hex-строку в ключ и инициализирующий вектор */
std::array<uint8_t, 32> key2;
std::array<uint8_t, 32> iv2;
crypto_json::convert_hex_string_to_byte(crypto_json::to_hex_string(key), key2);
crypto_json::convert_hex_string_to_byte(crypto_json::to_hex_string(iv), iv2);

/* зашифруем текст и сожмьем его при помощи алгоритма brotli */
std::string crypto_json_str = crypto_json::to_crypto_json(src, key, iv, type, true);

/* сравним размеры зашифрованного текста и оригинального */
std::cout << "src size:" << src.size() << std::endl;
std::cout << "crypto json size: " << crypto_json_str.size() << std::endl;

/* дешифруем crypto json */
std::string str = crypto_json::to_string(crypto_json_str, key, iv, type, true);

/* дешифруем crypto json в класс json библиотеки nlohmann/json.hpp */
nlohmann::json j = crypto_json::to_json(crypto_json_str, key, iv, type, true);
std::cout << "to json:" << std::endl << j << std::endl;
	
/* зашифруем данные класса библиотеки nlohmann/json.hpp */ 
std::string crypto_json_str2 = crypto_json::to_crypto_json(j, key, iv, type, true);
31 Комментарий
  • 3Qu
    08 апреля 2021, 02:46

    JSON эт неплохо. Но зачем его сжимать не пойму. Неужели такой громадный?
    А шифровать? — от кого?

  • Алексей Никитин
    08 апреля 2021, 08:42
    От она удача!!!
  • Дедал
    08 апреля 2021, 09:06
    Zip с паролем ничем не хуже. И не надо тянуть лишние зависимости.
    Велосипед
  • CloseToAlgoTrading
    08 апреля 2021, 12:00
    Плюс за старания :), но не совсем понятна практическая сторона вопроса. Если вы не правите конфиг файлы руками, то сохраняйте все в бинарный формат. Сделали свою структуру данных и сохранили как байткод, никто и не разберется что там и где :)

Активные форумы
Что сейчас обсуждают

Старый дизайн
Старый
дизайн