我正在尝试解密加密的SQLite数据库(在.Net中)。根据Zetetic的文档(https://www.zetetic.net/sqlcipher/sqlcipher-api/),可以为此目的使用sqlcipher_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 Error 1: 'table "__EFMigrationsHistory" already exists'.'
我不知道自己在做什么错,有什么想法吗?
答案 0 :(得分:1)
从我的测试中,代码按预期方式工作,并且将代码EXPORTED
plaintext.db
复制到名为plaintext.db
的新数据库文件中。
由于您没有提供ATTACH DATABASE 'C:\Users\John\Data\plaintext.db' AS plaintext KEY '';
文件的完整路径,因此不确定在何处生成该文件,但是如果要在attach语句中提供完整的文件路径,例如:plaintext.db
a文件__int64
将在该文件夹中创建,其中将包含原始数据库中未加密的数据。
关于收到的异常,一定是因为多次调用了导出代码,已经创建了带有表的数据库,现在随后的导出调用正在尝试创建已经存在但失败的表。