密码保护SQLite数据库。可能吗?


87

我必须面对一个新的小项目。它将有大约7或9个表,其中最大的一个表将以每月1000行的最大速度增长。

我考虑将SQLite作为我的数据库...但是如果有人要更改数据库中的数据,我将需要保护数据库。

我的主要问题是:

是否可以像访问时那样用密码保护sqlite数据库?

对于如此小的解决方案,您会建议其他哪些RDBMS?

开发将在C#上进行,但我正在免费搜索。


2
您可能想查看SQLiteCrypt
Mike Buckbee,09年


如果您需要频繁锁定/解锁数据库以进行调试,请尝试使用此工具goo.gl/12VnQd
Mangesh,2015年

您可以在此处找到解决方案,并在此处输入链接说明
Ishwar Rimal

Answers:


72

您可以使用密码保护SQLite3数据库。在进行任何操作之前,请按以下步骤设置密码。

SQLiteConnection conn = new SQLiteConnection("Data Source=MyDatabase.sqlite;Version=3;");
conn.SetPassword("password");
conn.Open();

然后下次您可以像访问

conn = new SQLiteConnection("Data Source=MyDatabase.sqlite;Version=3;Password=password;");
conn.Open();

这将不允许任何GUI编辑器查看您的数据。如果提供密码,某些编辑器可以解密数据库。使用的算法是RSA。

以后如果您想更改密码,请使用

conn.ChangePassword("new_password");

要重置或删除密码,请使用

conn.ChangePassword(String.Empty);

唯一的免费工具,到目前为止,将打开密码保护数据库,这样我发现是SQLite2009临详述这个答案
JumpingJezza

这个例子是什么?看起来像.NET?
pimbrouwers 2015年

1
从技术上讲,.NET是框架。C#是此处显示的语言。
vapcguy

此外,每次更改密码时,您都必须在下次打开前更新连接字符串时要小心,否则最终会
遇到

请注意,在没有提供密码的情况下,Open()不会在密码保护的SQLite数据库上失败,就像您期望的那样!失败的是对该打开文件进行的任何后续数据或元数据操作。
Cristi S.18年

33

您可以使用sqlite .net提供程序(System.Data.SQLite)的内置加密。在http://web.archive.org/web/20070813071554/http://sqlite.phxsoftware.com/forums/t/130.aspx中查看更多详细信息

加密现有的未加密数据库更改加密数据库的密码,请打开数据库,然后使用SQLiteConnection的ChangePassword()函数:

// Opens an unencrypted database
SQLiteConnection cnn = new SQLiteConnection("Data Source=c:\\test.db3");
cnn.Open();
// Encrypts the database. The connection remains valid and usable afterwards.
cnn.ChangePassword("mypassword");

要使用或密码解密现有的加密数据库调用:ChangePassword()NULL""

// Opens an encrypted database
SQLiteConnection cnn = new SQLiteConnection("Data Source=c:\\test.db3;Password=mypassword");
cnn.Open();
// Removes the encryption on an encrypted database.
cnn.ChangePassword(null);

要打开现有的加密数据库或创建新的加密数据库,请ConnectionString如上例所示在中指定一个密码,或者SetPassword()在打开new之前调用该函数SQLiteConnection。在中指定的密码ConnectionString必须是明文,但是SetPassword()函数中提供的密码可以是二进制字节数组。

// Opens an encrypted database by calling SetPassword()
SQLiteConnection cnn = new SQLiteConnection("Data Source=c:\\test.db3");
cnn.SetPassword(new byte[] { 0xFF, 0xEE, 0xDD, 0x10, 0x20, 0x30 });
cnn.Open();
// The connection is now usable

默认情况下,将另一个数据库文件附加到现有连接时,ATTACH关键字将使用与主数据库相同的加密密钥。若要更改此行为,请使用KEY修饰符,如下所示:

如果要使用明文密码附加加密的数据库,请执行以下操作:

// Attach to a database using a different key than the main database
SQLiteConnection cnn = new SQLiteConnection("Data Source=c:\\test.db3");
cnn.Open();
cmd = new SQLiteCommand("ATTACH DATABASE 'c:\\pwd.db3' AS [Protected] KEY 'mypassword'", cnn);
cmd.ExecuteNonQuery();

要使用二进制密码附加加密的数据库,请执行以下操作:

// Attach to a database encrypted with a binary key
SQLiteConnection cnn = new SQLiteConnection("Data Source=c:\\test.db3");
cnn.Open();
cmd = new SQLiteCommand("ATTACH DATABASE 'c:\\pwd.db3' AS [Protected] KEY X'FFEEDD102030'", cnn);
cmd.ExecuteNonQuery();

2
实际上,这个仅链接的答案是一个清楚的例子,为什么我们不这样做。实际的链接不见了;它不存在了。我们能够看到该站点的唯一原因是因为它是由web.archive.org自动归档的。
HanletEscaño17年

它不再起作用,在最新版本中找不到此类功能。
MindRoasterMir


6

您可以使用SEE插件加密SQLite数据库。这样,您可以防止未经授权的访问/修改。

引用SQLite文档:

SQLite加密扩展(SEE)是SQLite的增强版本,它使用128位或256位AES加密数据库文件,以帮助防止未经授权的访问或修改。整个数据库文件都经过加密,因此对于外部观察者而言,该数据库文件似乎包含白噪声。没有什么可以将文件标识为SQLite数据库。

您可以在此链接中找到有关此插件的更多信息。


7
该扩展名也是sqlite的付费插件。
John Boker

3

一种选择是VistaDB。它们允许数据库(甚至表)受到密码保护(并可以选择加密)。


1
有更高效,更自由的方式!
沙旺2012年

1
@MSS但是-正如我所说,VistaDB解决方案确实具有一些优势,包括在表级别进行单独的加密,而不是对数据库进行完整的加密。我不知道其他实现此功能的.NET本机选项。与大多数其他选项不同,它也是纯托管的-仅仅是因为它不是免费的,并不意味着会有更多有效或更好的选项-它完全取决于使用要求。
Reed Copsey 2012年

3

对于您有关保护sqlite数据库的密码的问题,我认为无法完成。

您可以对其进行加密,以下是一些信息:

http://sqlcrypt.com/

每个平台149美元。


3

如果使用FluentNHibernate,则可以使用以下配置代码:

private ISessionFactory createSessionFactory()
{
    return Fluently.Configure()
            .Database(SQLiteConfiguration.Standard.UsingFileWithPassword(filename, password))
            .Mappings(m => m.FluentMappings.AddFromAssemblyOf<DBManager>())
            .ExposeConfiguration(this.buildSchema)
            .BuildSessionFactory();    
}

private void buildSchema(Configuration config)
{
        if (filename_not_exists == true)
        {
            new SchemaExport(config).Create(false, true);
        }
}    

方法UsingFileWithPassword(filename,password)加密数据库文件并设置密码。
仅在创建新数据库文件时运行。使用此方法打开时,未加密的旧文件将失败。


2

我知道这是一个古老的问题,但是简单的解决方案不是仅在操作系统级别保护文件吗?只是阻止用户访问文件,然后他们就不能触摸它。这只是一个猜测,我不确定这是否是理想的解决方案。


2
我不确定这是否是一个好的解决方案,因为任何使用USB记忆棒的人都可以引导到另一个操作系统并读取文件。
nurettin

我认为这很合理,但是在那种情况下,请禁用USB。如果某些人可以物理访问您的计算机,则可以执行许多其他操作。
大卫·普赖斯

您想要保护敏感数据,以便其他问题会出错。
3:07三胞胎

对于SQLite数据库,实际上根本不可能。您需要用户能够对其进行读写,这意味着SQLite DB所在文件夹的ACL也必须允许他们具有这些权限。您可以通过仅允许真实用户对该文件夹的权限来保护它免受非用户的侵害,但是您仍然会遇到“内部威胁”。
vapcguy

1

为什么需要加密数据库?用户可以轻松地反汇编程序并找出密钥。如果要对它进行加密以进行网络传输,请考虑使用PGP而不是将加密层压缩到数据库层中。


6
在启动时可能会要求用户输入密码,因此通过分解程序将无法获得任何密钥。
kgadek 2012年

1
使用Redgate Reflector或ILSpy。
Zev Spitz 2013年

4
为什么将密钥放入程序中?您不会这样做,从用户密码生成密钥并使用它,那么您就不需要源代码中的任何秘密。
蹦床
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.