编写需要嵌入加密数据库的C#桌面应用程序。我应该使用什么类型的数据库?
大家好,我正在制作一个C#/WPF应用程序,它需要访问多个表来生成我将在应用程序中使用的一些xaml代码。这些表还将包含一些浮点数字数据 该程序是单用户的,因此rdbms不必非常花哨,但文件确实需要加密,因为它将被“收缩包装”并发送。我也不能强迫用户为此安装单独的程序 到目前为止,我一直倾向于使用加密的.accdb数据库,但我愿意接受更好的选择。使用accdb是否要求用户安装access (注意:我也一直在看和)你看了吗 SQL Server Compact 3.5是免费的, 易于使用的嵌入式数据库引擎 这让开发人员能够构建健壮的 Windows桌面和移动设备 在所有Windows上运行的应用程序 包括Windows XP、Vista、, Pocket PC和智能手机 “我也不能强迫用户为此安装单独的程序。”-您可以随应用程序分发所需的文件 另一种解决方案是使用加密的xml文件。使用xml文件可以非常轻松地保存和加载数据集:编写需要嵌入加密数据库的C#桌面应用程序。我应该使用什么类型的数据库?,c#,wpf,ms-access,encryption,rdbms,C#,Wpf,Ms Access,Encryption,Rdbms,大家好,我正在制作一个C#/WPF应用程序,它需要访问多个表来生成我将在应用程序中使用的一些xaml代码。这些表还将包含一些浮点数字数据 该程序是单用户的,因此rdbms不必非常花哨,但文件确实需要加密,因为它将被“收缩包装”并发送。我也不能强迫用户为此安装单独的程序 到目前为止,我一直倾向于使用加密的.accdb数据库,但我愿意接受更好的选择。使用accdb是否要求用户安装access (注意:我也一直在看和)你看了吗 SQL Server Compact 3.5是免费的, 易于使用的嵌入式数
最后一点注意:选择SQLServerCompact将使您能够使用内置的LINQ提供程序,它有可能使您的生活更加轻松 从您将如何使用它以及它的单用户特性的简要概述来看,RDBMS可能会有些过分,您可能只需将少量数据存储在文本/xml文件中,并将其作为资源嵌入exe中(需要时进行加密) SQLite是一个软件库 实现了一个自包含的, 无服务器,零配置, 事务SQL数据库引擎。 SQLite是部署最广泛的SQL 世界上的数据库引擎。这个 SQLite的源代码位于 公共领域 System.Data.SQLite是原始的SQLite数据库引擎,是一个完整的ADO.NET 2.0/3.5提供程序,全部集成到一个混合模式程序集中。它完全替代了原来的sqlite3.dll(如果您在本机使用它,甚至可以将其重命名为sqlite3.dll) 可用于c#的Aviable wrappers列表如下:在c#wrappers部分下 我在这里使用的是一个:它是基本的,但足以满足我的需要。也可以查看,它是一个开源对象数据库。它们支持对象数据库的加密以及linq,这使得查询数据变得轻而易举
- 支持数据库的社区项目
这个答案<强>完全< /强>取决于你有一个相对的<强>小数据集< /强>,因此相应地考虑…
您是否考虑过将对象保存在集合中,然后将其序列化到磁盘 您可以使用Linq to对象来查询它们,方式与查询数据库(包括联接等)的方式大致相同 我在一些个人项目中使用过这种技术,如果你有一个小的数据集,效果会很好 一个例子是我为ASP.Net编写的自定义成员资格提供程序,如果您没有可用的数据库(想想真正便宜的托管环境),它将使用此方法 我已经用10000个用户的负载对它进行了测试,基本上都是即时响应(毕竟它来自内存)。当我有100000个用户时,它开始有点退化,到500000时,它是一只无法使用的狗 您可以实现自己的加密序列化/反序列化方法 在上有一个加密应用程序演练希望这有帮助。jeffa00指出,如果数据集不是很大,可以通过简单的序列化来实现。下面是一个完整的工作实现,说明它是多么容易:
public class DataSerializer<T>
{
static XmlSerializer _serializer = new XmlSerializer(typeof(T));
static SymmetricAlgorithm _encryptionAlgorithm;
public static void SetEncryptionKey(byte[] key)
{
_encryptionAlgorithm = Aes.Create();
_encryptionAlgorithm.Key = key;
}
public static void WriteData(string filePath, T data)
{
using(var fileStream = File.OpenWrite(filePath))
{
var cryptoStream = new CryptoStream(fileStream, _encryptionAlgorithm, CryptoStreamMode.Write);
_serializer.Serialize(cryptoStream, data);
cryptoStream.Flush();
}
}
public static T ReadData(string filePath)
{
using(var fileStream = File.OpenRead(filePath))
{
var cryptoStream = new CryptoStream(fileStream, _encryptionAlgorithm, CryptoStreamMode.Read);
return (T)_serializer.Deserialize(Stream);
}
}
}
公共类数据序列化程序
{
静态XmlSerializer_serializer=新的XmlSerializer(typeof(T));
静态对称算法;
公共静态无效SetEncryptionKey(字节[]密钥)
{
_encryptionAlgorithm=Aes.Create();
_encryptionAlgorithm.Key=密钥;
}
公共静态void WriteData(字符串文件路径,T数据)
{
使用(var fileStream=File.OpenWrite(filePath))
{
var cryptoStream=新的加密流(fileStream,_encryptionAlgorithm,CryptoStreamMode.Write);
_序列化(加密流,数据);
cryptoStream.Flush();
}
}
公共静态T读取数据(字符串文件路径)
{
使用(var fileStream=File.OpenRead(filePath))
{
var cryptoStream=新的加密流(fileStream,_encryptionAlgorithm,CryptoStreamMode.Read);
返回(T)\反序列化(流);
}
}
}
通过此操作,只需执行以下操作,即可将整个对象树以加密形式保存到磁盘:
DataSerializer<MyObjectType>.WriteData(@"c:\somewhere\something.data", myObject);
DataSerializer.WriteData(@“c:\somewhere\something.data”,myObject);
并用以下文字重新阅读:
myObject = DataSerializer<MyObjectType>.ReadData(@"c:\somewhere\something.data");
myObject=DataSerializer.ReadData(@“c:\somewhere\something.data”);
这比使用SQLServerCompact甚至完整的SQLServer要好得多,因为LINQtoObjects比LINQtoSQL强大得多。在很多情况下,速度太快了
但是只有当您的数据集很容易放入RAM时,这才有效。答案取决于更多细节;然而C#SQLite()可以