具有加密/密码保护的 SQLite

我正在学习使用 SQLite,我很好奇这是否可行:

  1. 数据库文件的加密?

  2. 密码保护打开数据库?

附言。我知道有这样一个“ SQLite 加密扩展(SEE)”但是,根据文件,“这是授权软件... ...”和“永久源代码许可证的成本是2000美元。”

287088 次浏览

您总是可以在客户端对数据进行加密。请注意,并非所有数据都必须加密,因为它存在性能问题。

SQLite 内置了用于加密的钩子,这些钩子在普通发行版中没有使用,但下面是我所知道的一些实现:

  • - 正式实施。
  • WxSQLite -一个 wxWidgets 样式的 C + + 包装器,它也实现了 SQLite 的加密。
  • SQLCipher -使用 openSSL 的 libcrypto 实现。
  • SQLiteCrypt -自定义实现,修改后的 API。
  • Botansqlite3 -botansqlite3是一个针对 SQLite3的加密编解码器,可以使用 Botan 的任何算法进行加密。
  • Sqleet -另一个加密实现,使用 ChaCha20/Poly1305原语。注意,上面提到的 wxSQLite 可以将其用作加密提供程序。

SEE 和 SQLiteCrypt 需要购买许可证。

披露: 我创建了 botansqlite3。

Net 库 System.Data.SQLite还提供了加密。

您可以对 SQLite3DB 进行密码保护。 在执行任何操作之前,首次将密码设置为如下。

SQLiteConnection conn = new SQLiteConnection("Data Source=MyDatabase.sqlite;Version=3;");
conn.SetPassword("password");
conn.open();

那么下次你可以像这样

conn = new SQLiteConnection("Data Source=MyDatabase.sqlite;Version=3;Password=password;");
conn.Open();

这不允许任何 GUI 编辑器查看您的数据。 稍后,如果您希望更改密码,请使用 conn.ChangePassword("new_password"); 若要重置或删除密码,请使用 conn.ChangePassword(String.Empty);

您可以从 http://system.data.sqlite.org/获得具有加密支持的 sqlite3.dll文件。

1-转到 http://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki并下载其中一个包. NET 版本与此无关。

2-从包中提取 SQLite.Interop.dll并将其重命名为 sqlite3.dll。此 DLL 支持通过明文密码或加密密钥进行加密。

上面提到的文件是本机文件,没有需要这个文件吗。NET 架构。它可能需要 VisualC + + 运行时,具体取决于您下载的包。

更新

这是我为32位开发下载的软件包: http://system.data.sqlite.org/blobs/1.0.94.0/sqlite-netFx40-static-binary-Win32-2010-1.0.94.0.zip

请记住,以下内容并不意味着可以替代适当的安全解决方案。

在花了四天时间研究这个问题之后,我只使用开源系统组装了一个解决方案。来自 NuGet 的 Data.SQLite 包。我不知道这能提供多少保护。我只是把它用在我自己的课程上。这将创建数据库,加密它,创建一个表,并添加数据。

using System.Data.SQLite;


namespace EncryptDB
{
class Program
{
static void Main(string[] args)
{
string connectionString = @"C:\Programming\sqlite3\db.db";
string passwordString = "password";
byte[] passwordBytes = GetBytes(passwordString);
SQLiteConnection.CreateFile(connectionString);
SQLiteConnection conn = new SQLiteConnection("Data Source=" + connectionString + ";Version=3;");
conn.SetPassword(passwordBytes);
conn.Open();
SQLiteCommand sqlCmd = new SQLiteCommand("CREATE TABLE data(filename TEXT, filepath TEXT, filelength INTEGER, directory TEXT)", conn);
sqlCmd.ExecuteNonQuery();
sqlCmd = new SQLiteCommand("INSERT INTO data VALUES('name', 'path', 200, 'dir')", conn);
sqlCmd.ExecuteNonQuery();
conn.Close();
}
static byte[] GetBytes(string str)
{
byte[] bytes = new byte[str.Length * sizeof(char)];
bytes = System.Text.Encoding.Default.GetBytes(str);
return bytes;
}
}
}

或者,您可以删除 conn.SetPassword(passwordBytes);,并将其替换为需要放置在 conn.Open();之后而不是之前的 conn.ChangePassword("password");。那么您就不需要 GetBytes 方法了。

要解密,只需在调用打开之前将密码放入连接字符串中即可。

        string filename = @"C:\Programming\sqlite3\db.db";
string passwordString = "password";
SQLiteConnection conn = new SQLiteConnection("Data Source=" + filename + ";Version=3;Password=" + passwordString + ";");
conn.Open();

您可以使用 SQLite 的函数创建例程(PHP 手册) :

$db_obj->sqliteCreateFunction('Encrypt', 'MyEncryptFunction', 2);
$db_obj->sqliteCreateFunction('Decrypt', 'MyDecryptFunction', 2);

在插入数据时,您可以直接使用加密函数并插入加密数据,也可以使用自定义函数并传递未加密的数据:

$insert_obj = $db_obj->prepare('INSERT INTO table (Clear, Encrypted) ' .
'VALUES (:clear, Encrypt(:data, "' . $passwordhash_str . '"))');

在检索数据时,还可以使用 SQL 搜索功能:

$select_obj = $db_obj->prepare('SELECT Clear, ' .
'Decrypt(Encrypted, "' . $passwordhash_str . '") AS PlainText FROM table ' .
'WHERE PlainText LIKE :searchterm');

SEE很贵的。但是 SQLite有内置的加密接口(Pager)。这意味着,在现有代码之上可以很容易地开发一些加密机制,而不必是 AES。什么都行。 请看我的帖子: < a href = “ https://stackoverflow./a/49161716/9418360”> https://stackoverflow.com/a/49161716/9418360

您需要定义 SQLITE _ HAS _ CODEC = 1来启用 Pager 加密:

#ifdef SQLITE_HAS_CODEC
/*
** This function is called by the wal module when writing page content
** into the log file.
**
** This function returns a pointer to a buffer containing the encrypted
** page content. If a malloc fails, this function may return NULL.
*/
SQLITE_PRIVATE void *sqlite3PagerCodec(PgHdr *pPg){
void *aData = 0;
CODEC2(pPg->pPager, pPg->pData, pPg->pgno, 6, return 0, aData);
return aData;
}
#endif

C language中有一个商业版的 SQLite加密使用 AES256-它也可以与 PHP一起工作,但它需要与 PHPSQLite扩展编译。它对 SQLite数据库文件进行动态解密,文件内容总是加密的。非常有用。

Http://www.iqx7.com/products/sqlite-encryption

我也有类似的问题。需要在简单数据库中存储敏感数据(SQLite 是除安全性之外的最佳选择)。最后,我已经把数据库文件的 TrueCrypt 加密值。

其他控制台应用程序使用 TrueCrypt CLI 挂载临时驱动器,然后启动数据库应用程序。等待数据库应用程序退出,然后再次卸载驱动器。

也许在所有情况下都不是合适的解决方案,但对我来说工作得很好..。