编写需要嵌入加密数据库的C#桌面应用程序。我应该使用什么类型的数据库?

编写需要嵌入加密数据库的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是免费的, 易于使用的嵌入式数

大家好,我正在制作一个C#/WPF应用程序,它需要访问多个表来生成我将在应用程序中使用的一些xaml代码。这些表还将包含一些浮点数字数据

该程序是单用户的,因此rdbms不必非常花哨,但文件确实需要加密,因为它将被“收缩包装”并发送。我也不能强迫用户为此安装单独的程序

到目前为止,我一直倾向于使用加密的.accdb数据库,但我愿意接受更好的选择。使用accdb是否要求用户安装access

(注意:我也一直在看和)

你看了吗

SQL Server Compact 3.5是免费的, 易于使用的嵌入式数据库引擎 这让开发人员能够构建健壮的 Windows桌面和移动设备 在所有Windows上运行的应用程序 包括Windows XP、Vista、, Pocket PC和智能手机

“我也不能强迫用户为此安装单独的程序。”-您可以随应用程序分发所需的文件

另一种解决方案是使用加密的xml文件。使用xml文件可以非常轻松地保存和加载数据集:


支持在数据库或表级别进行完全加密的xcopy(轻松部署)。

SQL Server Compact Edition和SQL Lite似乎是您的两个主要选项。SQLServerCompact有更好的.NET集成和日期/时间处理,所以我会选择这个。此外,可再发行文件的重量相当低(2-3MB IIRC)

SQL Server Compact将允许您加密数据库:

…但您必须小心使用连接字符串,因为获取嵌入在客户端中的未加密密码很简单


最后一点注意:选择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()可以