SQLiteencryption/密码保护

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

  1. 数据库文件的encryption?

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

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

SQLite内置了用于encryption的钩子,这些钩子并没有在正常的发行版中使用,但是这里有一些我知道的实现:

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

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

披露:我创build了botansqlite3。

.net库System.Data.SQLite也提供了encryption。

你可以用密码保护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);

您可以从http://system.data.sqlite.org/获取带有encryption支持的;sqlite3.dll文件。

1 – 进入http://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki并下载其中一个软件包。; .NET版本在这里是不相关的。

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

提到的文件是本地的,不需要.NET框架。 它可能需要Visual C ++运行时间,具体取决于您下载的软件包。

UPDATE

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

这当然是可能的,除了SEE,还有几个开源的解决scheme。 其中包括wxSQLite3随附的encryption扩展。 有关详细信息,请参阅我对类似问题的回答。

请记住,以下内容不能替代正确的安全解决scheme。

在玩了四天之后,我只用了NuGet的开放源代码System.Data.SQLite包来解决这个问题。 我不知道这个提供了多less保护。 我只是把它用于我自己的学习。 这将创build数据库,encryption它,创build一个表,并添加数据。

 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");replace它conn.ChangePassword("password"); 需要放在conn.Open(); 而不是之前。 那么你将不需要GetBytes方法。

要解密,这只是在打开电话之前将密码放在连接string中的问题。

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

litereplica支持使用ChaCha密码进行encryption。

Chacha在基于ARMv7的便携式设备上比AES 快几乎3倍 。

要创build并打开encryption的数据库,我们使用这样的URI:

 "file:/path/to/file.db?cipher=...&key=..." 

你总是可以在客户端encryption数据。 请注意,并非所有数据都必须encryption,因为它有性能问题。

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

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

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

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

当检索数据时,您也可以使用SQLsearchfunction:

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