gpt4 book ai didi

c# - 如何在 C# 中读取加密的 sqlite 数据库

转载 作者:行者123 更新时间:2023-12-05 08:09:29 25 4
gpt4 key购买 nike

一段时间以来,我一直在努力解决这个问题 - 我不是一个出色的编码员,但我只能想象我缺少一个简单的解决方案。我一直在研究一些 PoC 代码,以使用 System.Data.SQLite 数据提供程序创建加密的 SQLite 数据库。我正在用 C# 编写一个基本的控制台应用程序,以帮助自己理解它是如何工作的。这是我的问题。

我可以在连接字符串中使用密码创建一个新的 sqlite 数据库(据我所知)加密数据库。这是完整的代码:

try
{
if (!System.IO.File.Exists(@"c:\temp\test.db.sqlite"))
{
System.Data.SQLite.SQLiteConnection.CreateFile(@"c:\temp\test.db.sqlite");
}

System.Data.SQLite.SQLiteConnection conn = new System.Data.SQLite.SQLiteConnection(@"Data Source=c:\temp\test.db.sqlite;Version=3;password=abc");
conn.Open();

System.Data.SQLite.SQLiteCommand cmd = new SQLiteCommand(conn);
//System.Data.SQLite.SQLiteCommand cmd = new System.Data.SQLite.SQLiteCommand("create table test (name char(50))", conn);
//cmd.ExecuteNonQuery();


cmd.CommandText = "insert into test values ('my string')";
cmd.ExecuteNonQuery();

cmd.CommandText = "select * from test";

var dr = cmd.ExecuteReader();
while (dr.Read())
{
Console.WriteLine(dr.GetString(0));
}

conn.Close();
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
throw;
}

这似乎工作正常...我可以创建一个表,将数据添加到表中,然后查询该表。下次我尝试运行它时,我将进行以下更改,以免重新创建表...否则,代码应该是相同的:

...

if (!System.IO.File.Exists(@"c:\temp\test.db.sqlite"))
{
System.Data.SQLite.SQLiteConnection.CreateFile(@"c:\temp\test.db.sqlite");
}

System.Data.SQLite.SQLiteConnection conn = new System.Data.SQLite.SQLiteConnection(@"Data Source=c:\temp\test.db.sqlite;Version=3;password=abc");
conn.Open();

//System.Data.SQLite.SQLiteCommand cmd = new SQLiteCommand(conn);
System.Data.SQLite.SQLiteCommand cmd = new System.Data.SQLite.SQLiteCommand("create table test (name char(50))", conn);
cmd.ExecuteNonQuery();


cmd.CommandText = "insert into test values ('my string')";

...

第二次运行时,出现如下错误:

System.Data.SQLite.SQLiteException (0x80004005): file is encrypted or is not a database file is encrypted or is not a database
at System.Data.SQLite.SQLite3.Prepare(SQLiteConnection cnn, String strSql, SQLiteStatement previous, UInt32 timeoutMS, String& strRemain)
at System.Data.SQLite.SQLiteCommand.BuildNextCommand()
at System.Data.SQLite.SQLiteCommand.GetStatement(Int32 index)
at System.Data.SQLite.SQLiteDataReader.NextResult()
at System.Data.SQLite.SQLiteDataReader..ctor(SQLiteCommand cmd, CommandBehavior behave)
at System.Data.SQLite.SQLiteCommand.ExecuteReader(CommandBehavior behavior)
at System.Data.SQLite.SQLiteCommand.ExecuteNonQuery(CommandBehavior behavior)

知道我做错了什么吗?如何重新打开并使用我创建并加密的数据库?

最佳答案

设置密码:

string conn = @"Data Source=database.s3db;Password=Mypass;";
SQLiteConnection connection= new SQLiteConnection(conn);
connection.Open();
//Some code
connection.ChangePassword("Mypass");
connection.Close();

更改密码:

string conn = @"Data Source=database.s3db;";
SQLiteConnection connection= new SQLiteConnection(conn);
connection.Open();
//Some code
connection.ChangePassword("Mypass");
connection.Close();

可以通过连接字符串进行密码连接:

string conn = @"Data Source=database.s3db;Password=Mypass;";

或:

string conn = @"Data Source=database.s3db;";
SQLiteConnection connection= new SQLiteConnection(conn);
connection.Open();
//Some code
connection.SetPassword("Mypass");
connection.Close();

关于c# - 如何在 C# 中读取加密的 sqlite 数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36613603/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com