在 .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
,它将包含来自原始数据库的未加密数据。
至于您收到的异常,一定是因为导出代码被多次调用,数据库及其表已经创建,现在后续的导出调用试图创建已经存在的表失败。
我正在尝试解密一个加密的 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
,它将包含来自原始数据库的未加密数据。
至于您收到的异常,一定是因为导出代码被多次调用,数据库及其表已经创建,现在后续的导出调用试图创建已经存在的表失败。