Skip to content

EaaS HTTP API server for encrypt/decrypt private data in DataBases

Notifications You must be signed in to change notification settings

KuzinAndrey/cvaultsentinel

Repository files navigation

Проект CVaultSentinel

Маленький и быстрый HTTP API сервер для шифрования/дешифрования данных, написанный на Си. Предназначен для предоставления сервиса "шифрование-как-услуга" (EaaS, Encryption-as-a-service), когда клиент без использования дополнительных библиотек может защитить свои данные от перехвата и утечки.

Вся работа реализована в вызовах API методов /encrypt и /decrypt, через отправку данных методом POST. Возвращаемые защифрованные данные кодируются в Base64 для удобства применения в текстовых файлах и протоколах.

Большой ключ шифрования

Программа CVaultSentinel на этапе компиляции получает случайным образом сгенерированный ключ/пароль размером 1 Мегабайт (1048576 байт), и в дальнейшем для каждой операции шифрования случайным образом выбирается небольшой кусочек (необходимый для AES-256), смещение которого сохраняется в заголовок зашифрованных данных. В дальнейшем при дешифрации ключ восстанавливается по данному смещению.

Безопасность решения

Для защиты ключевой информации от утечки и перехвата применяется несколько технических методов защиты:

  1. Демон cvaultsentinel слушает подключения TCP только на адресе localhost (127.0.0.1) и работает по протоколу HTTP, таким образом достигается скорость работы и шифрование могут получить только локальные процессы, без передачи шифруемой информации в открытом виде по локальной сети. Хотя возможно удаленное использование сервиса по схеме с reverse-proxy Nginx, с применением HTTPS протокола.

  2. Ключевая информация разбивается на несколько блоков равной длины, и ежесекундно несколькими независимыми потоками изменяется операцией XOR со случайным числом (каждый блок разным числом). Таким образом защищаются данные в памяти от возможных считываний через снятие дампа памяти (в системах виртуализации) и атаки на конвееры и кеши процессоров (такие как Meltdown, Spectre и другие).

  3. На диске ключевая информация при компиляции шифруется специально сгенерированным мастер паролем разбитым через механизм разделения Шамира на несколько частей. При такой схеме генерируется 5 различных ключей-паролей для разных людей, и восстановить оригинальный мастер пароль можно только при наличии не менее 3-х ключей из 5.

Таким образом обеспечивается схема "с нулевыми знаниями", ни один из обладателей ключа не может единолично активировать программу и расшифровать зашифрованные данные. Функции шифрования/дешифрования доступны пока запущен процесс и "открыт" для работы с помощью 3 различных ключей.

При перезапуске процесс cvaultsentinel запускается в закрытом closed режиме и не может осуществлять никакие операции, пока не будет вызван метод /shamir?key=ключN с не менее 3 разделенными ключами.

Пример комплекта ключей для использования в программе (генерируется при компиляции с помощью программы помощника build_in_shamir.c):

secret="MJSFInGkm0wqJhkkcaOydyqUSMYkq6qA"
key1="1IJVoWoNGfHNTQSY1BSkAaEG5RCsrJVkQ"
key2="2okmhqzdHMSuEkBVmYSvHaLYzyJZVmim0"
key3="3FnN6RVCnpCqwQ7a3wqmKd6y8J3S8UBrM"
key4="4HFCpBRiWKHAUKmlYWAMZlRaaAZV2MSxL"
key5="5p7Bru0UUUEdDOMEZtrZEwqGqYylgMFIB"

В схеме разделения ключей Шамира важно знать номер ключа, он записывается в первом символе ключа как символ '1'..'5'.

Методы API REST

/status - статус демона

$ wget -O- -q http://127.0.0.1:6969/status
{"status": "CLOSED","keys": 0,"build": "bfffa109-91ce-4809-9049-e71c18c8359e"}

Демон запускается в закрытом режиме и не может производить какую-то работу.

/shamir?key=XXX - сохраняет в памяти ключ для последующего открытия секрета. Для открытия требуется вызвать метод несколько раз в разными ключами:

$ wget -O- -q http://127.0.0.1:6969/shamir?key=1IJVoWoNGfHNTQSY1BSkAaEG5RCsrJVkQ
.......

$ wget -O- -q http://127.0.0.1:6969/status
{"status": "CLOSED","keys": 1,"build": "bfffa109-91ce-4809-9049-e71c18c8359e"}

Каждый раз количество введенных ключей в "keys" будет возрастать. При достижении их количества необходимого для "открытия" секрета (не менее 3-х) будет произведена расшифровка ключевой информации по вычисленному секретному ключу Шамира.

В "открытом" режиме статус меняется на "OK", при этом память введенных и вычисленных ключей шифрования очищается заполнением случайными значениями:

$ wget -O- -q http://127.0.0.1:6969/status
{"status": "OK","keys": 0,"build": "bfffa109-91ce-4809-9049-e71c18c8359e"}

"/info" - страница статистики с количеством запросов, объемом трафика и время работы.

/encrypt - осуществляет шифрование данных из тела запроса POST. Возвращает зашифрованные данные в виде закодированной base64 текстовой последовательности.

$ wget -O- -q --post-data "encrypt_this_text" http://127.0.0.1:6969/encrypt
11jLAbBW8lN6Mu0HMebWYlZTZgcUWKKIX+ubD8GSVzSm/gxnvS2cLg==

/decrypt - осуществляет дешифрацию данных из тела запроса POST (передаются данные закодированные ранее в base64).

$ wget -O- -q --post-data "11jLAbBW8lN6Mu0HMebWYlZTZgcUWKKIX+ubD8GSVzSm/gxnvS2cLg==" http://127.0.0.1:6969/decrypt
encrypt_this_text

В режиме компиляции с отладкой (когда не указана переменная PRODUCTION_MODE) для просмотра состояния блоков шифрования доступен дополнительный метод /blockinfo.

Клиентские библиотеки

Набор функций и примеры для работы с cvaultsentinel для различных языков:

  • PHP в каталоге client-php

Автор

Кузин Андрей kuzinandrey@yandex.ru

About

EaaS HTTP API server for encrypt/decrypt private data in DataBases

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published