在 .Net 中解密加密的 SQLite 数据库

Decrypt an encrypted SQLite DB in .Net

我正在尝试解密一个加密的 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'.'

我不知道我做错了什么,有什么想法吗?

根据我的测试,代码按预期工作,并且它所做的是,它 EXPORTED 加密数据库到一个名为 plaintext.db 的新数据库文件。

由于您没有提供 plaintext.db 文件的完整路径,我不确定它是在哪里生成的,但是如果您要在附加语句中提供完整的文件路径,例如:ATTACH DATABASE 'C:\Users\John\Data\plaintext.db' AS plaintext KEY ''; 将在该文件夹中创建一个文件 plaintext.db,它将包含来自原始数据库的未加密数据。

至于您收到的异常,一定是因为导出代码被多次调用,数据库及其表已经创建,现在后续的导出调用试图创建已经存在的表失败。