前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SQLite加密新姿势,你知道吗?

SQLite加密新姿势,你知道吗?

作者头像
沙漠尽头的狼
发布2021-12-01 16:13:44
6.5K3
发布2021-12-01 16:13:44
举报
文章被收录于专栏:Dotnet9

什么是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安装后使用如下代码成功运行。

代码语言:javascript
复制
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,不用安装这个,使用自己喜欢的方式创建表即可。

代码语言:javascript
复制
Install-Package Dapper.Crud

安装完成后使用如下代码

代码语言:javascript
复制
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

设置密码

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

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-07-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Dotnet9 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 什么是SQLite?
  • System.Data.SQLite库
  • Stub.System.Data.SQLite.Core.NetFramework
  • 加密失败
  • 曲线救国 :Microsoft.Data.Sqlite
  • 使用Navicat for SQLite 打开加密数据库
    • 替换sqlite3.dll
      • 设置密码
      相关产品与服务
      数据库
      云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档