首页 > 解决方案 > 在 .Net 中解密加密的 SQLite DB

问题描述

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

我无法弄清楚我做错了什么,有什么想法吗?

标签: .netsqlitesqlcipher

解决方案


从我的测试来看,代码按预期工作,它做了什么,它将EXPORTED加密的数据库转换为一个名为plaintext.db.

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

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


推荐阅读