当前位置:   article > 正文

C# Sqlite数据库加密_sqlite加密

sqlite加密

sqlite官方的数据库加密是收费的,而且比较贵。
幸亏微软提供了一种免费的方法。

1 sqlite加密demo

这里我做了一个小的demo演示如下:

在界面中拖入数据库名、密码、以及保存的路径
在这里插入图片描述
比如我选择保存路径桌面的sqlite目录,数据库名guigutool.db,密码1234
点创建数据库。
在这里插入图片描述
我们在桌面文件夹sqlite看到guigutool.db
在这里插入图片描述
然后向其中插入
在这里插入图片描述

2.开发过程

2.1 通过Nuget安装依赖包

Microsoft.Data.Sqlite.Core
SQLitePCLRaw.bundle_e_sqlcipher
Dapper
  • 1
  • 2
  • 3

2.2 新建项目Sqlite工具箱

在Form中拖入控件这里就省略了。
在这里插入图片描述

2.3 建立连接过程

        static SqliteConnection conn = null;

        private void getConn()
        {
            string dbpath = txt_path.Text;
            string dbname = txt_dbname.Text;
            string pwd = txt_pwd.Text;

            string dbpathConn = Path.Combine(@"Data Source=" + dbpath, dbname);
            string connString = new SqliteConnectionStringBuilder(dbpathConn)
            {
                Mode = SqliteOpenMode.ReadWriteCreate,
                Password = pwd
            }.ToString();

            if (conn != null)
            {
                conn.Dispose();
            }
            conn = new SqliteConnection(connString);
        }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

2.4 创建数据库

创建数据库时,会自动创建一个测试表User

        private void btn_createdb_Click(object sender, EventArgs e)
        {
            if (String.IsNullOrEmpty(txt_dbname.Text) || String.IsNullOrEmpty(txt_pwd.Text))
            {
                MessageBox.Show("请输入数据库名和密码");
                return;
            }
            string dbFullPath = Path.Combine(txt_path.Text, txt_dbname.Text);
            ShowInfo(txtInfo, dbFullPath);
            if (File.Exists(dbFullPath))
            {
                MessageBox.Show("该数据库已存在,不能创建");
                return;
            }

            getConn();
            if (conn.State == System.Data.ConnectionState.Closed)
            {
                conn.Open();

                var createTable = @"CREATE table if not exists ""User"" (""Id""  INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,""name""  TEXT,""age""  INTEGER);";
                var result = conn.Execute(createTable);
                conn.Close();
                ShowInfo(txtInfo, "数据库:" + this.txt_path.Text + txt_dbname.Text + "已创建成功,并插入了测试表User");
            }
        }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

2.5 插入记录

        private void btn_insert_Click(object sender, EventArgs e)
        {
            getConn();
            if (conn.State == System.Data.ConnectionState.Closed)
            {
                conn.Open();
                var name = GenerateSurname();
                var age = GenerateAge();
                var insertSql = $@"INSERT INTO ""main"".""User""(name,age) VALUES (""{name}"", {age});";
                int result = conn.Execute(insertSql);
                conn.Close();
                ShowInfo(txtInfo, $"插入记录成功==> Name:{name} Age:{age} ");
            }
        }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

2.6 从数据库中查询记录

        private void btn_query_Click(object sender, EventArgs e)
        {
            getConn();
            if (conn.State == System.Data.ConnectionState.Closed)
            {
                conn.Open();
                var name = GenerateSurname();
                var age = GenerateAge();
                var selectSql = "select id,name,age from main.User;";
                var users = conn.Query<User>(selectSql).ToList();
                ShowInfo(txtInfo, $"================ 查询db[{txt_dbname.Text}]到以下记录:===================");
                foreach (var user in users)
                {
                    ShowInfo(txtInfo, $"Id:{user.Id} Name:{user.Name} Age:{user.Age} ");
                }
                ShowInfo(txtInfo, $"=============== 共{users.Count} 条 ================");
                conn.Close();

            }
        }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

以上就是主要的代码。
项目的完整代码可以在以下资源中下载。
https://download.csdn.net/download/wang6733284/87503163

3 如何使用Navicat打开创建的数据库

将Navicat目录下创建一个备份文件夹sqlite3_bak, 然后将sqlite3.dll文件(大约910KB)移动到备份文件夹中。
在这里插入图片描述
将e_sqlcipher.dll(1763KB)包拷贝到navicat 目录下,重命名为sqlite3.dll
在这里插入图片描述
然后在navicat中新建SQLite连接。
在这里插入图片描述
这里选择我们在桌面创建的guitutool.db文件。
(这里下的连接测试,无论是否加密,都会显示连接成功的,但是实际打开数据库时,如果不输入密码会提示错误。)
在这里插入图片描述
然后选择高级,在这里输入密码。
在这里插入图片描述
这时候连接,就可以打开了。
在这里插入图片描述
在这里插入图片描述
比如我手工通过navicat添加一条记录。
在这里插入图片描述
然后再选择Sqlite工具箱查询:
在这里插入图片描述
即可查询到。
总结一下
使用e_sqlcipher.dll替代sqlite3.dll,可以通过navicat来方便数据的管理。
e_sqlcipher.dll文件在我们的源程序的Debug目录下,大小月1763KB,具体参考下面。

SqliteBox\bin\Debug\net7.0-windows\runtimes\win-x64\native\
  • 1

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/492426
推荐阅读
相关标签
  

闽ICP备14008679号