• SQLite Encryption(加密)新姿势


    什么是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安装
    ![(https://img-blog.csdnimg.cn/20210703172632243.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3E5MTM3NzcwMzE=,size_16,color_FFFFFF,t_70)

    这个库依赖了很多如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.1的控制台项目。

    通过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 ative 下的e_sqlcipher.dll
    在这里插入图片描述
    打开Navicat 的安装目录,将刚刚复制的e_sqlcipher.dll复制到该目录下。
    备份sqlite3.dll(将该dll复制到其他文件夹下),
    然后将复制的e_sqlcipher.dll改名成 sqlite3.dll 替换掉原来的sqlite3.dll

    设置密码

    在数据库连接右键编辑连接-->高级-->设置数据库文件位置-->勾选已加密-->设置密码-->勾选保存密码
    在这里插入图片描述
    双击连接数据库,连接成功!!
    在这里插入图片描述

  • 相关阅读:
    C++ template —— 模板中的名称(三)
    关于烂代码的那些事(下)
    关于烂代码的那些事(中)
    关于烂代码的那些事(上)
    比尔的村庄:创业是选择做赚钱的事,还是值钱的事?
    C++ template —— 深入模板基础(二)
    依赖倒置,控制反转,依赖注入
    JAVA中限制接口流量、并发的方法
    SVN同步时忽略特定文件或文件夹
    MySQL中查询表及索引大小的方法
  • 原文地址:https://www.cnblogs.com/ma-nong01/p/14988073.html
Copyright © 2020-2023  润新知