Для небольшого C ++ / Qt-приложения я хотел бы хранить зашифрованные данные в базе данных SQLite с расширением SQLCipher.
Ключ, который использовался для шифрования базы данных, должен быть известен C ++ / Qt-приложению, например:
...
q.exec("PRAGMA key = 'mysecretkey';");
...
Поскольку эта строка в двоичном файле легко читается с помощью hex-редактора, я написал небольшой метод, который создает ключ из хеш-значения во время выполнения:
...
q.exec("PRAGMA key='" + getKey().toHex() + "';");
...QByteArray getKey() {
...
}
При использовании этого метода ключ больше не является частью двоичного файла, но все еще существует в ОЗУ во время выполнения метода, который запрашивает базу данных. Когда метод завершен, ключ также больше не виден в оперативной памяти.
Можете ли вы помочь с идеей, как избежать видимости ключа в оперативной памяти? Или вы рекомендуете совершенно другой способ на основе C ++ / Qt и SQLite / SQLCipher-database, чтобы решить проблему правильного сокрытия ключа?
поправкаПрограмма должна позволять пользователю проверять, является ли поисковый термин частью базы данных или нет. Но пользователь не должен иметь доступ к базе данных в полном объеме.
Когда вы используете одну систему для этого приложения, вы, скорее всего, запускаете приложение на локальном хосте. Ключ в конечном итоге будет присутствовать только в памяти, независимо от того, что вы используете любое количество алгоритмов шифрования.
Вы также можете использовать совершенно другой подход, который я действительно рекомендую
Использование Концепция отрицательной базы данных.
«Негативная база данных — это разновидность базы данных, которая содержит огромное количество данных, состоящих из имитирующих данных. Когда кто-либо пытается получить доступ к таким базам данных, извлекаются как фактические, так и отрицательные наборы данных, даже если они крадут всю базу данных. Например, вместо того, чтобы хранить только личные данные, вы сохраняете личные данные, которых нет у участников ».
Это сохранит ваши данные в безопасности даже на сервере.