c++ - 如何正确地将加密数据插入数据库并从中检索?

标签 c++ c sqlite openssl

我的开发环境: C/C++,CentsOS,Openssl,sqlite3.

我正在使用 openssl EVP 接口(interface)(AES 128 位)加密数据。加密数据可能包含空值。我怎样才能正确地将它插入到 sqlite3 数据库中并从数据库中检索回来解密?

谢谢。

最佳答案

How can i properly insert it into sqlite3 DB and retrieve back from DB to decrypt?

我认为您至少有两个选择。首先,您可以对密文进行编码。这可以在 OpenSSL 或数据库中完成。如果您使用 OpenSSL,请查看 BIO_f_base64在手册页中。

我不确定您将使用什么来使用数据库函数对二进制数据进行编码。为此,请参阅 SQL As Understood By SQLite | Core Functions .

其次,您可以放弃编码并简单地存储二进制 blob。 blob 是 SQLite 中的一种数据类型,参见 Datatypes In SQLite Version 3 .另请参阅 SQLite Blob insertion c++ 等问题和 SQLite not storing blobs containing \0 bytes .

避免编码并直接使用二进制数据可能是最有效的方法,因为它避免了额外的工作。但在某些情况下,这会使搜索数据变得更加困难。


可能还有第三种选择,但这取决于您的威胁模型。您可以加密整个数据库,然后将纯文本插入其中。对于此选项,请参阅 SQLite with encryption/password protection .

由于 key 管理,此选项可能不如在插入前加密数据安全。如果数据库需要在线,那么加密整个数据库的 key 必须存储在某个地方,这意味着攻击者可能可以从文件系统中恢复它。

关于c++ - 如何正确地将加密数据插入数据库并从中检索?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35361252/

相关文章:

iphone - Sqlite 选择列并删除重复项

c++ - Lambda 到函数指针适配器的理解

c++ - 如何通知我窗口已激活?

将 char 指针转换为 int 指针 - 缓冲区错误 10

C中的函数main可以返回一个指针吗?

c# - UWP - 在特定条件下在 ListView 中显示数据库

c++ - Trilinos - C++ : error trying to exec 'cc1plus' : execvp: No such file or directory

C++ 类重载 : is it possible to make compiler see which one to use based on template?

c - C中的NULL概念有困难吗?

sql - SQLite从表中的两列联接到另一个表上