具有加密/密码保护的SQLite

| 我只是在学习使用SQLite,我很好奇是否有可能: 加密数据库文件? 用密码保护打开数据库? PS。我知道有此\“ SQLite加密扩展(SEE)。\”,但是根据文档,\“ SEE是许可软件.... \”和\“ SEE永久源代码许可证的成本是2000美元。\“     
已邀请:
SQLite内置了用于加密的挂钩,这些挂钩在正常发行版中没有使用,但是我知道一些实现: SEE-正式实施。 wxSQLite-一个wxWidgets样式的C ++包装器,也实现了SQLite的加密。 SQLCipher-使用openSSL \的libcrypto实施。 SQLiteCrypt-自定义实现,已修改的API。 botansqlite3-botansqlite3是SQLite3的加密编解码器,可以使用Botan中的任何算法进行加密。 SEE和SQLiteCrypt要求购买许可证。 披露:我创建了botansqlite3。     
您可以使用密码保护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);
    
.net库System.Data.SQLite还提供加密。     
您可以从http://system.data.sqlite.org/获得具有加密支持的“ 4”文件。 1-转到http://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki并下载其中一个软件包。 .NET版本与此处无关。 2-从软件包中提取
SQLite.Interop.dll
,并将其重命名为
sqlite3.dll
。该DLL支持通过纯文本密码或加密密钥进行加密。 提到的文件是本机文件,不需要.NET Framework。根据您下载的软件包,它可能需要Visual C ++ Runtime。 更新 这是我为进行32位开发而下载的软件包:http://system.data.sqlite.org/blobs/1.0.94.0/sqlite-netFx40-static-binary-Win32-2010-1.0.94.0。压缩     
这当然是可能的,除了SEE之外,还有几种开源解决方案。其中wxSQLite3附带的加密扩展。有关详细信息,请参见我对类似问题的回答。     
请记住,以下内容不能替代适当的安全解决方案。 在玩了四天之后,我仅使用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.ChangePassword(\"password\");
应该放在placed10ѭ之后而不是之前。然后,您将不需要GetBytes方法。 要解密,只需在打开呼叫之前将密码放入连接字符串中即可。
        string filename = @\"C:\\Programming\\sqlite3\\db.db\";
        string passwordString = \"password\";
        SQLiteConnection conn = new SQLiteConnection(\"Data Source=\" + filename + \";Version=3;Password=\" + passwordString + \";\");
        conn.Open();
    
您始终可以在客户端上加密数据。请注意,由于性能问题,并非所有数据都必须加密。     
SEE
很贵。但是,ѭ13具有内置的加密接口(Pager)。这意味着,在现有代码之上可以轻松开发某种加密机制,而不必是“ 14”。真的是。 请在这里查看我的帖子:https://stackoverflow.com/a/49161716/9418360 您需要定义SQLITE_HAS_CODEC = 1才能启用寻呼机加密。下面的示例代码(原始的
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
扩展名进行编译。它即时解密/加密“ 13”数据库文件,文件内容始终被加密。很有用。 http://www.iqx7.com/products/sqlite-encryption     
您可以使用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\');
    
是的,有可能。如果以.Net Standard 4.6.1+或Core为目标,我认为获得Sqlite加密的一个相当简单的方法是在此处根据我的回答使用Microsoft.Data.Sqlite。     
对于使用Javascript的项目,tripapps编写的软件包可以无缝运行。 https://github.com/journeyapps/node-sqlcipher 它适用于Mac / Windows / Linux。它在您的平台上编译SQLCipher。无需从Zetetic支付许可证费用。     

要回复问题请先登录注册