SQLite Encryption(加密)问题_码农01号的博客-程序员宅基地 - 程序员宅基地 (cxyzjd.com)

SQLite Encryption(加密)问题_码农01号的博客-程序员宅基地 - 程序员宅基地 (cxyzjd.com)

SQLite Encryption(加密)问题_码农01号的博客-程序员宅基地

技术标签: C#  sqlite  SQLite

什么是SQLite?

SQLite是一个C语言实现的小型、快速、自包含、高可靠性、功能全面的SQL数据库引擎。

起因:
刚好项目上有个需求,需要使用VS2019+.Net famework 4.6.1+sqlite完成数据层。

System.Data.SQLite库

先尝试了官方的System.Data.SQLite 包。

首先,使用VS2019创建.名字为 TestSqlite的.Net famework 4.6.1的控制台项目。

通过nuget安装

这个库依赖了很多如linq、EF6等其他库.个人不是很喜欢···有需要的朋友直接安装是可以的。

Stub.System.Data.SQLite.Core.NetFramework

这个库没有依赖项···这里推荐···

通过nuget安装后使用如下代码成功运行。

using System;
using System.Data.SQLite; namespace TestSqlite
{ internal class Program
{ private static void Main(string[] args)
{ string cs = "Data Source=TestSqlite.sqlite";//数据库连接字符串
string stm = "SELECT SQLITE_VERSION()";//查看版本
var con = new SQLiteConnection(cs);//创建连接
con.Open();
var cmd = new SQLiteCommand(stm, con);
string version = cmd.ExecuteScalar()
.ToString();//查看版本
Console.WriteLine($"SQLite version: {version}");
Console.ReadKey();
}
}
}

运行后成功,可以看到版本是3.35.5

在bin文件夹下也生成了sqlite数据库

加密失败

作为一个数据库,没有密码是不行的。
于是我们在连接字符串加上password

运行,报错

System.IO.FileNotFoundException:“未能加载文件或程序集“System.Data.SQLite.SEE.License, Version=1.0.114.0, Culture=neutral, PublicKeyToken=433d9874d0bb98c5”或它的某一个依赖项。系统找不到指定的文件。”


这个System.Data.SQLite.SEE(SQLite Encryption Extension) 是System.Data.SQLite 的官方 SQLite 加密扩展包。

没错···SQlite开源版本是加密收费的···购买需要2000$·····

贫穷让我另谋出路

曲线救国 :Microsoft.Data.Sqlite

经过资料查询,发现微软的Microsoft.Data.Sqlite 库支持,所以再次进行尝试。

首先,使用VS2019创建.名字为 TestSqlite的.Net famework 4.6的控制台项目。

通过NuGet安装 Microsoft.Data.Sqlite.Core和 SQLitePCLRaw.bundle_e_sqlcipher

通过程序包管理器安装

Install-Package Microsoft.Data.Sqlite.Core
另外我们需要安装加密包
Install-Package SQLitePCLRaw.bundle_e_sqlcipher·

Dapper.Crud

个人比较喜欢Dapper,不喜欢的小伙伴可以使用自己的ORM,不用安装这个,使用自己喜欢的方式创建表即可。

Install-Package Dapper.Crud

安装完成后使用如下代码

using System;
using System.Data;
using Dapper;
using Microsoft.Data.Sqlite;
namespace TestSqlite
{ internal class Program
{ private static void Main(string[] args)
{ var connStr = @"Data Source=TestSqlite.sqlite;";//连接字符串 var conn = new SqliteConnectionStringBuilder(connStr)
{ Mode = SqliteOpenMode.ReadWriteCreate,
Password = "password"
}.ToString();//使用这个方式设置密码,避免sql注入 var connection = new SqliteConnection(conn);//创建SQLite连接
if (connection.State == ConnectionState.Closed)
{ connection.Open();
var createTableSqlStr = @"CREATE TABLE if not exists ""Alarm"" ( ""Id"" INTEGER NOT NULL, ""AlarmName"" TEXT, ""AlarmTypeId"" INTEGER, PRIMARY KEY ( ""Id"" ) );";
var result = connection.Execute(createTableSqlStr);//使用Dapper执行sql语句创建表
Console.ReadKey();
} } }
}

运行后成功!

这里有个需要注意的点:

在设置密码创建数据库后,需要使用ORM执行sql创建表,如果是空数据库,是未加密的··可以直接打开。原因暂未可知。希望知道的大佬能告知

我们使用Navicat for SQLite 打开,如果出现以下弹窗,就说明加密成功了!

使用Navicat for SQLite 打开加密数据库

没有Navicat的童鞋点这里下载安装

替换sqlite3.dll

步骤如下:
打开Bin文件夹下的runtimes


根据自己系统选择文件夹x64还是x86
复制win-x64\native 下的e_sqlcipher.dll

打开Navicat 的安装目录,将刚刚复制的e_sqlcipher.dll复制到该目录下。
备份sqlite3.dll(将该dll复制到其他文件夹下),
然后将复制的e_sqlcipher.dll改名成 sqlite3.dll 替换掉原来的sqlite3.dll

设置密码

在数据库连接右键编辑连接–>高级–>设置数据库文件位置–>勾选已加密–>设置密码–>勾选保存密码

双击连接数据库,连接成功!!

版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。

C# 使用Microsoft.Data.Sqlite 的一些方法 System.Data.SQLite 包加密失败的更多相关文章

  1. 【EF框架异常】System.MissingMethodException:“找不到方法:“System.Data.Entity.ModelConfiguration.Configuration.PrimitivePropertyConfiguration

    最近调试EF的时候遇到下面这个问题 System.MissingMethodException:“找不到方法:“System.Data.Entity.ModelConfiguration.Config ...

  2. 报错:无法将类型"System.Data.EntityState"隐式转换为"System.Data.Entity.EntityState"

    报错:无法将类型"System.Data.EntityState"隐式转换为"System.Data.Entity.EntityState".   出错语句停留 ...

  3. SQLite 之 C#版 System.Data.SQLite 使用

    简介 SQLite简介 SQLite,是一款轻型的关系型数据库.它的设计目标是嵌入式. 它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 C++.C ...

  4. C#连接Oracle数据库的方法(System.Data.OracleClient、Oracle.DataAccess.Client也叫ODP.net、Oracle.ManagedDataAccess.dll)

    官方下载地址(ODP.net)(中文):http://www.oracle.com/technetwork/cn/topics/dotnet/downloads/index.html 官方下载地址(O ...

  5. C++: read access data using ADOX.DLL and System::Data::OleDb

    #pragma once #include "Form2.h" namespace cdemo { using namespace System; using namespace ...

  6. MVC ---- 无法将类型"System.Data.EntityState"隐式转换为"System.Data.Entity.EntityState"

    1.EF 5.0解决方法 先卸载EF:Uninstall-Package EntityFramework -Force 在安装EF5.0:Install-Package EntityFramework ...

  7. System.Data.SQLite.dll控件常规安装方法

    原文地址:http://www.jb51.net/dll/System.Data.SQLite.dll.html 文件运行必须安装   Microsoft Visual C++ 2010 SP1 Re ...

  8. 未找到具有固定名称“System.Data.SQLite”的 ADO.NET 提供程序的实体框架提供程序

    用户代码未处理 System.InvalidOperationException   HResult=-2146233079   Message=未找到具有固定名称"System.Data. ...

  9. System.Data.SQLite安装的相关问题

    在使用System.Data.SQLite的过程中,遇到各种问题,特此记录下.(都被搞的折寿了,不仔细看文档的下场!) 1.选对.net Framework的版本. 2.X64和X86的问题,如果项目 ...

  10. 使用System.Data.SQLite及其EF模块操作SQLite数据库(文件)

    SQLite for .NET (System.Data.SQLite) introduction An ADO.NET provider for SQLite including EF and Li ...

随机推荐

  1. $.ajax jsonp parsererror

    场景重现 通过$.ajax()发起的跨越请求代码如下: $.ajax({ dataType: "JSONP", type: "GET", url: " ...

  2. CM311-1A魔百和刷armbian或openwrt系统包

    系统包下载链接:Openwrt:阿里云盘链接:https://www.aliyundrive.com/s/tEemRbs1TYB已失效下载后请解压!!!!!!!!! Armbian:链接:https: ...

  3. redis的作用:高性能和高并发

    一.高性能 假设这么个场景,你有个操作,一个请求过来,吭哧吭哧你各种乱七八糟操作mysql,半天查出来一个结果,耗时600ms.但是这个结果可能接下来几个小时都不会变了,或者变了也可以不用立即反馈给用 ...

  4. STM32 开发环境用哪个呢?

    我的STM32开发环境血泪史:从入门到精通,少走弯路才是硬道理 说起STM32开发环境的选择,我真是有太多想说的了.作为一个已经在嵌入式领域摸爬滚打近十年的老兵,从当年刚入行时的懵懂无知,到现在能够从 ...

  5. Spring Boot 根据配置决定服务(集群、单机)是否使用某些主件

    比如:在集群模式下,我想用 Nacos 组件,单机版不想用它. server: name: VipSoft Server Dev port: 8193 cloud: nacos: discovery: ...

  6. kettle介绍-Step之Abort

    Abort中止介绍 中止步骤用于读取指定行数之后停止读取剩余行数,可以用于调试转换 Step Name:步骤的名称,在单一的转换中,名称必须唯一 Abort threshold:指定行数,转换读取到指 ...

  7. php-ffmpeg保存为.mp4格式时报错

     原文: php-ffmpeg保存为.mp4格式时报错:FFMpeg\Exception\RuntimeException: Encoding failed in - 搜栈网 (seekstack.c ...

  8. 工具 | Hashcat

    0x00 简介 Hashcat是一款强大的密码破解工具. 下载地址 Hashcat下载: Hashcat下载 0x01 功能说明 直接破解 组合攻击 掩码暴力破解 混合攻击 联合攻击 注:仅供安全研究 ...

  9. [java与https]第一篇、证书杂谈

    一.算法.密钥(对).证书.证书库 令狐冲是个马场老板,这天,他接到店里伙计电话,说有人已经签了租马合同,准备到马场提马,,他二话不说,突突突就去了,到了之后,发现不认识租客. 令狐冲说,你把你租马合 ...

  10. Linux系列:聊一聊 SystemV 下的进程间共享内存

    一:背景 1. 讲故事 昨天在分析一个 linux 的 dump 时,看到了这么一话警告,参考如下: 0:000> !eeheap -gc *** WARNING: Unable to veri ...