SQLite具有加密/密码保护

时间:2011-04-14 21:25:38

标签: encryption sqlite password-protection

我只是学习使用SQLite,如果可能的话,我很好奇:

  1. 加密数据库文件?

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

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

12 个答案:

答案 0 :(得分:93)

SQLite具有内置加密的钩子,这些钩子在正态分发中没有使用,但是这里有一些我知道的实现:

  • SEE - 官方实施。
  • wxSQLite - 一个wxWidgets样式的C ++包装器,它也实现了SQLite的加密。
  • SQLCipher - 使用openSSL的libcrypto来实现。
  • SQLiteCrypt - 自定义实施,修改后的API。
  • botansqlite3 - botansqlite3是SQLite3的加密编解码器,可以使用Botan中的任何算法进行加密。
  • SQLiteCrypto - SQLiteCrypto是通过AES-256和SHA-256加密Sqlite数据库的更简单方法

SEE,SQLiteCrypt和SQLiteCrypto要求购买许可证。

披露:我创建了botansqlite3。

答案 1 :(得分:18)

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

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

答案 2 :(得分:14)

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

答案 3 :(得分:7)

您可以使用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支持通过明文密码或加密密钥进行加密。

上述文件是原生文件, NOT 需要.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

答案 4 :(得分:3)

这当然是可能的,除了SEE之外还存在一些开源解决方案。其中包括wxSQLite3的加密扩展。 See my answer to a similar question for details.

答案 5 :(得分:3)

请注意,以下内容并非旨在替代正确的安全解决方案。

在玩了四天之后,我只使用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方法。

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

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

答案 6 :(得分:2)

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

答案 7 :(得分:1)

嗯,SEE很贵。但是SQLite具有内置加密接口(寻呼机)。这意味着,在现有代码之上,可以轻松地开发一些加密机制,而不必是AES。什么都行。 请在此处查看我的帖子: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

使用AES256 C language进行SQLite加密的商业版本 - 它也可以与PHP一起使用,但需要使用PHP和{{ 1}}扩展名。它即时解密SQLite数据库文件,文件内容始终加密。非常有用。

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

答案 8 :(得分:0)

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

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

答案 9 :(得分:0)

是的,这是可能的。如果定位.Net Standard 4.6.1+或Core,我认为获得Sqlite加密相当简单,就是根据我的回答here使用Microsoft.Data.Sqlite。

答案 10 :(得分:0)

对于使用Javascript的项目,由journeyapps编写的程序包可以无缝运行。

https://github.com/journeyapps/node-sqlcipher

对我来说,它可以在Mac / Windows / Linux上运行。它在您的平台上编译SQLCipher。无需从Zetetic支付许可证费用。

答案 11 :(得分:0)

我也有类似的问题。需要将敏感数据存储在简单的数据库中(除了安全性,SQLite是最佳选择)。最后,我将数据库文件放在TrueCrypt加密的valume上。

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

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