sqlcipher与Microsoft.Data.Sqlite.Core踩坑

sqlcipher可视化工具

SQLiteStudio 3.2.1
DB Browser for SQLite 3.12.0
都是Github上的开源项目
需要非常注意的一点是 sqlcipher数据库文件也是有版本区分的
因为不同的版本有不同的默认缺省设置,缺省设置不对也打不开sqlcipher的数据文件。
可以通过

PRAGMA cipher_compatibility = 3; 

启用sqlcipher3默认配置,可选的值有1,2,3,4

SQLiteStudio

SQLiteStudio 3.2.1 只支持 sqlcipher 3版本的数据库文件
sqlitestudio

DB Browser for SQLite

DB Browser for SQLite 3.12.0同时支持 sqlcipher3和sqlcipher4版本的文件
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

ADO.NET的使用

  • sqlcipher和sqlite是兼容的,没有密码的sqlcipher数据库就是sqlite数据库。

  • sqlite的一般方式是安装 SQLitePCLRaw.bundle_e_sqlite + Microsoft.Data.Sqlite.Core
    或者直接安装它们的二合一整合包 Microsoft.Data.Sqlite
    同理sqlcipher则是使用 1.SQLitePCLRaw.bundle_e_sqlcipher + 2.Microsoft.Data.Sqlite.Core
    安装上面两个包就已经有 Microsoft.Data.Sqlite.SqliteConnection 可以用了,
    所谓的ADO.NET就是所有的实现都继承System.Data下面那一套接口,比如IDbConnection,IDbCommand,IDbTransaction等等

  • 如果想用EF框架,那就在1,2的基础上安装Microsoft.EntityFrameworkCore.Sqlite.Core

  • 如果想用Linq2db这种轻量型的框架,就在1,2的基础上安装linq2db, 注意设置 providerName = ProviderName.SQLiteMS

SqlCipher加密参数设置

zetetic sqlcipher-api
此处巨坑 使用Microsoft.Data.Sqlite.SqliteConnection 如果需要修改 sqlcipher 的加密参数,
不能在连接字符串中直接放置密码, 需要通过下面的代码进行操作(在Microsoft.Data.Sqlite.Core 5.0.0以及之后的版本修复了这个问题,可以直接在连接字符串中放置密码)

var filePath = "test.db";
var pwd = "password";
using (var db = new SqliteConnection($"DataSource=\"{filePath}\";"))
{
    db.Open();
    using (var command = db.CreateCommand())
    {
    
 	    // 默认是基于sqlcipher4 的缺省配置上进行修改
		command.CommandText = $"PRAGMA key = '{pwd}';"
        command.ExecuteNonQuery();
        command.CommandText = "PRAGMA cipher_memory_security = OFF;";
        command.ExecuteNonQuery();
        command.CommandText = "PRAGMA kdf_iter = '1000';";
        command.ExecuteNonQuery();
        command.CommandText = "PRAGMA cipher_page_size = 8192;";
        command.ExecuteNonQuery();
    }
}

var filePath2 = "test.db";

using (var db2 = new SqliteConnection($"DataSource=\"{filePath2}\";"))
{
    db2.Open();
    using (var command = db2.CreateCommand())
    {
    
 	    // 指定再sqlcipher3 的缺省配置上进行修改
		command.CommandText = $"PRAGMA key = '{pwd}';"
        command.ExecuteNonQuery();
        command.CommandText = "PRAGMA cipher_compatibility = 3;"
        command.ExecuteNonQuery();
        command.CommandText = "PRAGMA cipher_memory_security = OFF;";
        command.ExecuteNonQuery();
        command.CommandText = "PRAGMA cipher_page_size = 8192;";
        command.ExecuteNonQuery();
    }
}


其它库

也可以通过 nuget 包 sqlite-net-sqlcipher 使用 sqlcipher,可惜的是,此库没有继承 System.Data 中那套接口,没什么扩展性。使用方法:

var db = new SQLiteConnection(new SQLiteConnectionString(file, true, pwd, null, new Action( _=>
{
   _.Execute("PRAGMA cipher_memory_security = OFF;";
   _.Execute("PRAGMA kdf_iter = '1000';";          
   _.Execute("PRAGMA cipher_page_size = 8192;";           
})));
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
SQLite是一个轻量级的数据库引擎,它可以在各种操作系统和开发环境中使用。在运行SQLite数据库之前,需要安装一些必要的组件和文件。 首先,为了在Windows操作系统中正确运行SQLite,需要安装Visual C++(VC)运行环境。VC运行环境是一组由Microsoft提供的支持C++运行的库文件,它可以提供所需的运行时支持。这些库文件有助于确保在Windows环境中正确加载和运行system.data.sqlite.dll和sqlite.interop.dll文件。 其次,纯净版的system.data.sqlite.dll和sqlite.interop.dll是SQLite数据库引擎的核心文件。system.data.sqlite.dll是SQLite的.NET封装库,它提供了对SQLite数据库的操作和管理功能。sqlite.interop.dll是SQLite的本地互操作库,它允许在.NET环境中与SQLite数据库进行通信。 这些文件是SQLite运行所需的关键组件,需要将它们正确地部署在系统中。在运行时,程序会加载这些文件,并使用其中的函数和方法来访问和操作SQLite数据库。 为了使用SQLite,可以将这些文件复制到应用程序的工作目录中(通常是应用程序所在的目录),或者将它们添加到.NET项目的引用中。确保这两个文件的版本与应用程序或系统的要求兼容。 综上所述,为了在Windows环境中运行SQLite,需要安装VC运行环境,并确保系统中存在纯净版的system.data.sqlite.dll和sqlite.interop.dll文件。这些组件和文件是支持SQLite数据库引擎正常运行的必要条件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值