欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

.NET+Sqlite支持加密的操作方法

程序员文章站 2022-03-25 15:45:54
sqlitesqlite 来源于公共领域 sqlite is public domain、确保代码不会受到任何专有或许可内容的污染,没有任何来自互联网上的未知来源复制。即全是原创的。虽然是免费的,无需...

sqlite

sqlite 来源于公共领域 sqlite is public domain
确保代码不会受到任何专有或许可内容的污染,没有任何来自互联网上的未知来源复制。即全是原创的。

虽然是免费的,无需许可证,可用于任何目的,但如果你的公司必须要一个许可证,你也能申请授权https://sqlite.org/purchase/license.

但不支持加密。如果想支持登录加密,需要另外的扩展sqlite 加密扩展(sqlite encryption extension,),具有读取/写入 aes 加密数据库的附加功能。具体授权可参考 https://www.sqlite.org/prosupport.html

sqlite加密

一直以来,freesql开发群中,总会有一些开发者来询问sqlite加密的问题,事实上,官方提供的sqlite加密功能是收费的。当连接串上使用password时,会提示授权问题。
如果底层依赖于system.data.sqlite.core

could not load file or assembly 'system.data.sqlite.see.license,
version=1.0.115.5, culture=neutral, publickeytoken=433d9874d0bb98c5,
processorarchitecture=msil

如果底层依赖于microsoft.data.sqlite 也会提示

you specified a password in the connection string, but the native sqlite

library 'e_sqlite3' doesn't support encryption.

system.data.sqlite.core

创建一个控制台项目,起名 ovov.sqlitesystemcore

dotnet new console -n ovov.sqlitesystemcore
cd ovov.sqlitesystemcore

安装包

dotnet add package system.data.sqlite.core

使用sqliteconnection创建一个连接,使用password指定密码

using system.data.sqlite;

static void open()
{
    string baseconnectionstring = "data source=local.db";
    var connectionstring = new sqliteconnectionstringbuilder(baseconnectionstring)
    {
        password = "123qwe"
    }.tostring();

    using sqliteconnection? connection = new sqliteconnection(connectionstring);
    connection.open();
}
open();

运行项目

dotnet run

就会出现如下错误。

system.io.filenotfoundexception:“could not load file or assembly

'system.data.sqlite.see.license, version=1.0.115.5, culture=neutral, publickeytoken=433d9874d0bb98c5, processorarchitecture=msil'.

系统找不到指定的文件。”

microsoft.data.sqlite

创建一个控制台项目,起名 ovov.sqlitemicrosoft

dotnet new console -n ovov.sqlitemicrosoft
cd ovov.sqlitemicrosoft

安装包

dotnet add package microsoft.data.sqlite

使用sqliteconnection创建一个连接,使用password指定密码

using microsoft.data.sqlite;

static void open()
{
    string baseconnectionstring = "data source=local.db";
    var connectionstring = new sqliteconnectionstringbuilder(baseconnectionstring)
    {
        mode = sqliteopenmode.readwritecreate,
        password = "123qwe"
    }.tostring();

    using sqliteconnection? connection = new sqliteconnection(connectionstring);
    connection.open();
}

open();

运行项目

dotnet run

就会出现如下错误。

unhandled exception. system.invalidoperationexception: you specified a password in the connection string, 

but the native sqlite library

'e_sqlite3' doesn't support encryption. at microsoft.data.sqlite.sqliteconnection.open()

其实微软已经提供了加密的方案。

https://docs.microsoft.com/zh-cn/dotnet/standard/data/sqlite/encryption?tabs=netcore-cli

dotnet remove package microsoft.data.sqlite
dotnet add package microsoft.data.sqlite.core
dotnet add package sqlitepclraw.bundle_e_sqlcipher

重新运行项目 ,就会发现,他正常执行。没有任何报错。

有关使用不同的本机库进行加密的详细信息,请参阅自定义 sqlite 版本

我们从 自定义 sqlite 版本上可以看到。

默认情况下,主 microsoft.data.sqlite 包引入 sqlitepclraw.bundle_e_sqlite3。 若要使用不同的捆绑,请改为安装 microsoft.data.sqlite.core 包以及要使用的捆绑包。

sqlitepclraw.bundle_e_sqlcipher

提供 sqlcipher 的非官方开放源代码内部版本。此版本支持加密。

完整代码

https://github.com/luoyunchong/dotnetcore-examples/blob/master/database-drivers/ovov.sqlitemicrosoftcore/program.cs

到此这篇关于.net+sqlite如何支持加密的文章就介绍到这了,更多相关.net sqlite加密内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!