具有加密/密码保护的SQLite

问题描述 投票:0回答:9

我刚刚学习使用 SQLite,我很好奇这是否可能:

  1. 数据库文件加密?

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

PS。我知道有这个“SQLite Encryption Extension (SEE)”,但根据文档,“SEE 是许可软件......”和“SEE 永久源代码许可证的成本为 2000 美元”。

encryption sqlite password-protection
9个回答
141
投票

以下是一些实现:


22
投票

您可以使用密码保护 SQLite3 DB。 首次进行任何操作前,请按如下方式设置密码。

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);


16
投票

.net 库 System.Data.SQLite 还提供加密功能。


10
投票

您可以从 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框架。它可能需要 Visual C++ Runtime,具体取决于您下载的包。

更新

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


2
投票

请记住,以下内容无意替代适当的安全解决方案。

经过四天的研究,我仅使用 NuGet 的开源 System.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.ChangePassword("password");
,需要将其放置在
conn.Open();
之后而不是之前。那么您将不需要 GetBytes 方法。

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

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

2
投票

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


2
投票

嗯,

SEE
很贵。然而,
SQLite
有内置的加密接口(寻呼机)。这意味着,在现有代码之上,可以轻松开发某种加密机制,而不必是
AES
。真的什么都可以。 请在这里查看我的帖子:https://stackoverflow.com/a/49161716/9418360

您需要定义 SQLITE_HAS_CODEC=1 才能启用 Pager 加密。下面的示例代码(原始

SQLite
来源):

#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
中有一个商业版本,用于使用 AES256 进行
SQLite
加密 - 它也可以与
PHP
一起使用,但需要使用
PHP
SQLite
扩展进行编译。它动态解密/加密数据库文件,文件内容始终加密。非常有用。

http://www.iqx7.com/products/sqlite-cryption


2
投票

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

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


1
投票
PHP 手册

): SQLite

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.