В процессе разработки ПО для трейдинга столкнулся с тем, что программа должна иметь целую кучу файлов конфигурации, содержание которых хотелось бы скрыть от пользователя. Это могут быть настройки стратегий, параметры авторизации на сервере, текст для разных языков интерфейса и т.д.
Для файлов конфигурации я уже давно использую файлы с JSON. Очень удобная вещь. Осталось лишь добавить поддержку комментариев и зашифровать текст при помощи алгоритма AES. А для большей красоты еще и сжать текст перед шифровкой алгоритмом brotli.
Сказано — сделано. Встречайте — crypto-json, проект на гитхабе. Репозиторий содержит готовый редактор JSON с комментариями, который может также сохранить текст в зашифрованном виде. Настройки сжатия и шифрования можно задать перед сохранением файла и во время открытия. Также редактор позволяет сделать проверку JSON и может подсвечивать проблемные места.
Для использования зашифрованных файлов в программе библиотека содержит простые функции. Покажу пример кода, который раскрывает почти все возможности библиотеки:
#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);
JSON эт неплохо. Но зачем его сжимать не пойму. Неужели такой громадный?
А шифровать? — от кого?
Велосипед