SQLiteencryption/密码保护
我只是学习使用SQLite,我很好奇,如果这是可能的:
-
数据库文件的encryption?
-
密码保护数据库的开放?
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');