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安裝
這個庫依賴了很多如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\native 下的e_sqlcipher.dll
打開Navicat 的安裝目錄,將剛剛複製的e_sqlcipher.dll複製到該目錄下。
備份sqlite3.dll(將該dll複製到其他文件夾下),
然後將複製的e_sqlcipher.dll改名成 sqlite3.dll 替換掉原來的sqlite3.dll
設置密碼
在資料庫連接右鍵編輯連接–>高級–>設置資料庫文件位置–>勾選已加密–>設置密碼–>勾選保存密碼
雙擊連接資料庫,連接成功!!