在.Net

时间:2019-08-23 14:51:39

标签: .net sqlite sqlcipher

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

我不知道自己在做什么错,有什么想法吗?

1 个答案:

答案 0 :(得分:1)

从我的测试中,代码按预期方式工作,并且将代码EXPORTED plaintext.db复制到名为plaintext.db的新数据库文件中。

由于您没有提供ATTACH DATABASE 'C:\Users\John\Data\plaintext.db' AS plaintext KEY '';文件的完整路径,因此不确定在何处生成该文件,但是如果要在attach语句中提供完整的文件路径,例如:plaintext.db a文件__int64将在该文件夹中创建,其中将包含原始数据库中未加密的数据。

关于收到的异常,一定是因为多次调用了导出代码,已经创建了带有表的数据库,现在随后的导出调用正在尝试创建已经存在但失败的表。