sqlite 无法在连接字符串中提供密码

s4chpxco  于 2022-11-24  发布在  SQLite
关注(0)|答案(3)|浏览(160)

在带有实体框架的SQLite中,我使用以下内容创建数据库:

class MyContext : DbContext
{   
    // DbSets, OnModelCreating(), etc.

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlite("Data Source=c:\\test.db");
    }
}

//this is in my test method
 using (var db = new MyContext())
{
    db.Database.EnsureCreated();
}

它可以工作;数据库被创建。但是我想通过在连接字符串中提供密码来加密数据库:

optionsBuilder.UseSqlite("Data Source=c:\\test.db;Password=mypassword");

根据EnsureCreated,我得到:
System.Data.dll中发生类型为'System.ArgumentException'的未经处理的异常其他信息:不支持的关键字:“密码”。
如何加密SQLite数据库?

pxq42qpu

pxq42qpu1#

这个“纯”的开源sqlite3.dll不支持加密。还有其他的实现,包括许可的和未许可的。
我的解决方案:
1.下载已编译的二进制文件

  • 将sqlite3.dll复制到BIN文件夹
  • 在Visual Studio中将DLL添加到项目中
  • 设置复制到输出目录-始终复制
  • 在上下文的构造函数中使用以下代码:
string password;
var connection = Database.GetDbConnection();
connection.Open();
using (var command = connection.CreateCommand())
{
    command.CommandText = $"PRAGMA key='{password}';";
    command.ExecuteNonQuery();
}
ngynwnxp

ngynwnxp2#

根据此答案Protect SQLite database used by EntityFramework Core Application
EF Core使用的是Microsoft.Data.Sqlite,目前还不支持现成的加密。请参阅https://github.com/aspnet/Microsoft.Data.Sqlite/issues/184。您可以使用SQLite扩展自行添加加密。
在提供的GitHub链接中,还有其他链接指向以下位置的替代项:
Encryption in Microsoft.Data.Sqlite

4smxwvx5

4smxwvx53#

我使用了Tschareck发布的实现:

private const string Password = "1234";
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            var conn = new SqliteConnection(@"Data Source=test.db;");
            conn.Open();

            using (var command = conn.CreateCommand())
            {
                command.CommandText = $"PRAGMA key = '{Password}';";
                command.ExecuteNonQuery();
            }
            optionsBuilder.UseSqlite(conn);
        }

并设法为我的解决方案设置了密码,解决方案运行良好,但我遇到了另一个问题-我无法使用该密码打开数据库(我使用的是DB Browser for SQL Lite)(当我单击“Ok”时,密码被删除,没有任何React):
printScreen DB Browser

相关问题