.net - 在 .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'.'
我无法弄清楚我做错了什么,有什么想法吗?
解决方案
从我的测试来看,代码按预期工作,它做了什么,它将EXPORTED
加密的数据库转换为一个名为plaintext.db
.
由于您没有提供plaintext.db
文件的完整路径,我不确定它是在哪里生成的,但是如果您要在附加语句中提供完整的文件路径,例如:将在该文件夹中创建ATTACH DATABASE 'C:\Users\John\Data\plaintext.db' AS plaintext KEY '';
一个文件plaintext.db
,它将包含未加密的文件原始数据库中的数据。
至于您收到的异常,一定是因为多次调用了导出代码,已经创建了带有表的数据库,现在后续的导出调用试图创建已经存在但失败的表。
推荐阅读
- excel - 如何在excel中获取列名
- javascript - 我的 discord.js 命令加载器不工作
- sql-server - 在系统上显示在线用户
- java - 使用正则表达式从锚标记中获取文本并在java中转换为超链接
- python - 循环命令 (discord.py)
- java - 使用 IP 流向它们发送 http post 请求
- c - Sscanf 忽略日期字符串中的日期“-”
- reactjs - Axios POST 和 GET
- python - 无法在 Django HttpResponse (HTML/PDF) 中强制下载文件
- javascript - 我如何改进在> = ES6中返回创建时间差异的方法,例如(30s,5m,3h,1y前)