Я работаю над встроенным устройством, чтобы внедрить систему управления ключами. Устройство хранит во внутренней флэш-памяти ключи, но недостаточно места для хранения всех связанных метаданных, поэтому я хочу сохранить метаданные на MicroSD, которые можно подключить к встроенному устройству, метаданные должны быть сохранены в базе данных.
Встроенное устройство не имеет операционной системы и программного уровня для использования файлов, оно может только читать / записывать блок с SD. По этой причине, поскольку устройство будет работать вместе с хост-приложением на компьютере, гораздо проще встроить SQLite и базу данных в приложение, работающее на компьютере (компьютер может легко получить доступ к карте MicroSD).
Моя цель - обеспечить безопасность базы данных с помощью ключа шифрования, который хранится во встроенном устройстве. Ключ не должен покидать встроенное устройство, кроме того, выбран алгоритм AES256 CBC. Я хочу сохранить базу данных SQL в зашифрованном виде с помощью ранее упомянутого ключа, чтобы злоумышленник не мог прочитать содержимое базы данных, если у него нет также встроенного устройства, где хранится ключ. Это мой рабочий процесс:
- Создайте новую базу данных SQLite, если она не существует (здесь БД не защищена)
- Отправьте файл .db на встроенное устройство, устройство зашифруетфайл .db с использованием специального ключа, хранящегося в его флэш-памяти (AES256 CBC), и отправит обратно зашифрованные данные на компьютер
- Сохраните зашифрованную базу данных в двоичном файле (например, mydatabase.encrypted) и удалите предыдущийфайл .db (который не был зашифрован)
- Когда пользователь системы управления ключами хочет получить данные из базы данных, он выполнит вход на встроенное устройство (используя пароль) и, если входВ случае успеха зашифрованная БД снова отправляется на встроенное устройство для расшифровки, затем снова сохраняется как обычный файл .db на MicroSD, чтобы SQLite мог делать то же, что и он.
- Когда пользователь выходит извстроенное устройство, шаги 2 и 3 повторяются, так что .db будет снова зашифрован, и единственным файлом на SD будет зашифрованная база данных.
При таком подходе существует огромная проблема: когда пользователь вошел в систему, база данных сохраняется в виде открытого текста на MicroSD, поэтому, если злоумышленник может получить доступ к SD в этот момент, он можетчитать базу данных. Чтобы минимизировать этот риск, я могу принудительно выйти из системы, как только пользователь не будет активен в течение определенного периода времени, но, на мой взгляд, это не очень хорошее решение.
Есть ли способ справиться сзашифрованная база данных (SQLite или любая другая БД с открытым исходным кодом), сохраняя при этом базу данных зашифрованной с помощью ключа, который не доступен локально? Например, версия SQLite, которая использует зашифрованный файл базы данных и предлагает интерфейсы для указания собственной библиотеки шифрования (которая в моем случае должна в основном получать данные из SQLite, отправлять их на внешнее устройство для шифрования или дешифрования и отправлять их обратно в SQLite).
Извините за длинное объяснение, но я хотел быть максимально ясным.