【发布时间】:2016-02-13 22:24:38
【问题描述】:
我的开发环境: C/C++,CentsOS,Openssl,sqlite3.
我正在使用 openssl EVP 接口(AES 128 位)加密数据。加密数据可能包含空值。如何将其正确插入 sqlite3 DB 并从 DB 中取回解密?
谢谢。
【问题讨论】:
-
将其转换为 hex-ascii(因此
x00将变为 `x30x30')或将其转换为 Base64。
我的开发环境: C/C++,CentsOS,Openssl,sqlite3.
我正在使用 openssl EVP 接口(AES 128 位)加密数据。加密数据可能包含空值。如何将其正确插入 sqlite3 DB 并从 DB 中取回解密?
谢谢。
【问题讨论】:
x00 将变为 `x30x30')或将其转换为 Base64。
我怎样才能正确地将它插入到 sqlite3 数据库中并从数据库中取回解密?
我认为您至少有两个选择。首先,您可以对密文进行编码。这可以在 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。
由于密钥管理,此选项可能不如在插入前加密数据安全。如果数据库需要在线,那么加密整个数据库的密钥必须存储在某个地方,这意味着攻击者可以从文件系统中恢复它。
【讨论】: