我必须面对一个新的小项目。它将有大约7或9个表,其中最大的表将以每月1000行的最大速率增长。
我认为SQLite是我的数据库......但是如果有人想要从数据库中更改数据,我需要保护数据库
我的主要问题是:
是否可以像访问时那样使用密码保护sqlite数据库?
对于如此小的解决方案,您会推荐哪些其他RDBMS?
开发将在C#上进行,但我正在寻找免费的东西。
答案 0 :(得分:59)
您可以使用密码保护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);
答案 1 :(得分:31)
您可以使用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()
函数之前调用SQLiteConnection
函数1}}。 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 :(得分:12)
使用SQLCipher,它是SQLite的开源扩展,为数据库文件提供透明的256位AES加密。 http://sqlcipher.net
答案 3 :(得分:5)
您可以使用SEE插件加密SQLite数据库。这样可以防止未经授权的访问/修改。
引用SQLite文档:
SQLite加密扩展(SEE)是SQLite的增强版本,它使用128位或256位AES加密数据库文件,以帮助防止未经授权的访问或修改。整个数据库文件已加密,因此对于外部观察者,数据库文件似乎包含白噪声。没有任何东西可以将文件标识为SQLite数据库。
您可以在this link中找到有关此插件的更多信息。
答案 4 :(得分:3)
一个选项是VistaDB。它们允许数据库(甚至表)受密码保护(并且可选地加密)。
答案 5 :(得分:3)
答案 6 :(得分: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(文件名,密码)加密数据库文件并设置密码。
它仅在创建新数据库文件时运行。使用此方法打开时,旧的未加密失败。
答案 7 :(得分:2)
我知道这是一个老问题,但简单的解决方案是不是只是在操作系统级保护文件?只是阻止用户访问该文件,然后他们就无法触摸它。这只是一个猜测,我不确定这是否是一个理想的解决方案。
答案 8 :(得分:1)
为什么需要加密数据库?用户可以轻松地反汇编程序并找出密钥。如果您正在加密网络传输,请考虑使用PGP而不是将加密层压缩到数据库层。