在.Net中解密加密的SQLite数据库
我正在尝试解密加密的SQLite DB(在.Net中)。根据Zettetic的文档()可以使用在.Net中解密加密的SQLite数据库,.net,sqlite,sqlcipher,.net,Sqlite,Sqlcipher,我正在尝试解密加密的SQLite DB(在.Net中)。根据Zettetic的文档()可以使用sqlcipher\u export实现此目的,如下所示: var connection = new SqliteConnection(string.Format("Data Source={0}", fullDbPath)); connection.Open(); var key = //get it from somewhere va
sqlcipher\u export
实现此目的,如下所示:
var connection = new SqliteConnection(string.Format("Data Source={0}", fullDbPath));
connection.Open();
var key = //get it from somewhere
var command = connection.CreateCommand();
command.CommandText = "SELECT quote($password);";
command.Parameters.AddWithValue("$password", key);
var quotedPassword = (string)command.ExecuteScalar();
command.Parameters.Clear();
command.CommandText = $"PRAGMA key = {quotedPassword}; ATTACH DATABASE 'plaintext.db' AS plaintext KEY '';SELECT sqlcipher_export('plaintext');DETACH DATABASE plaintext";
command.ExecuteNonQuery();
但是,这会引发一个异常Microsoft.Data.Sqlite.SqliteException:“Sqlite错误1:“表”\uu EFMigrationsHistory“已存在”。
我不知道我做错了什么,有什么想法吗?从我的测试中,代码按预期工作,它
将加密数据库导出到名为明文.db
的新数据库文件中
由于您没有为plaintext.db
文件提供完整路径,我不确定它是在哪里生成的,但是如果您要在attach语句中提供完整的文件路径,例如:attach DATABASE'C:\Users\John\Data\plaintext.db'作为明文密钥'
将在该文件夹中创建一个文件plaintext.db
,其中包含原始数据库中未加密的数据
至于您收到的异常,一定是因为导出代码被多次调用,数据库及其表已经创建,现在后续的导出调用正在尝试创建已经存在的表,但失败了。谢谢!您是对的,我之前试图将明文数据库文件的完整路径传递给命令,但出现了一个错误,我可能弄错了什么,并假设sqlcipher将只使用与输入数据库相同的文件夹。