【问题标题】:How to properly insert encrypted data into database and retrieve from it?如何正确地将加密数据插入数据库并从中检索?
【发布时间】: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 sqlite openssl


【解决方案1】:

我怎样才能正确地将它插入到 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

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

【讨论】:

  • 感谢您的帮助。到目前为止,不需要加密整个数据库或密码保护功能。我将使用 Base64 编码方法。我尝试使用 blob,但如何从数据库中检索它?我使用 blob 插入了一个包含 null 的字符串,但是当我使用“sqlite3_column_blob”检索它时,结果字符串将不包含完整数据。我的意思是说,如果插入一个字符串“text\0abc”,我只会返回“text”我做错了吗?
  • 我知道 C 字符串是 '\0' 终止的。我该怎么办?
  • @abhaykanade - 听起来您遇到了SQLite not storing blobs containing \0 bytes 中讨论的问题。您是否查看过问题及其答案?
  • 是的!我将使用 base64 编码:)
猜你喜欢
  • 1970-01-01
  • 2017-07-24
  • 1970-01-01
  • 2019-01-29
  • 1970-01-01
  • 2015-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多