繁体   English   中英

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

[英]Writing a C# desktop application that needs to embed an encrypted database. What type of database should I use?

嘿SO'ers,我正在制作一个C#/ WPF应用程序,需要访问许多表来生成我将在应用程序中使用的一些xaml代码。 表格还将包含一些浮点数值数据。

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

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

(注意:我也一直在使用C#中的桌面应用程序查看数据库引擎

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

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

http://technet.microsoft.com/en-us/library/ms172901.aspx

...但是您必须小心连接字符串,因为获取客户端中嵌入的未加密密码是微不足道的。

最后一点:选择SQL Server Compact将使您能够使用内置的LINQ提供程序,它有可能使您的生活更轻松。

你看过SQL Server Compact吗?

SQL Server Compact 3.5是一款免费,易于使用的嵌入式数据库引擎,可让开发人员构建可在所有Windows平台(包括Windows XP,Vista,Pocket PC和Smartphone)上运行的强大Windows桌面和移动应用程序。

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

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

这个答案完全取决于你有一个相对较小的数据集 ,所以相应地考虑一下......

您是否考虑过将对象保留在集合中,然后将它们序列化为磁盘?

你可以使用Linq to Objects来查询它们,就像数据库包括连接等一样。

我已经将这种技术用于一些个人项目, 如果你有一个小数据集,它可以很好地工作。

一个例子是我为ASP.Net编写的自定义成员资格提供程序,如果您没有可用的数据库,则使用此方法(想想非常便宜的托管环境)。

我已经测试了它的负载高达10,000个用户,基本上是即时响应(毕竟它来自内存)。 当我达到100,000个用户时,它开始降级一点,而500,000这是一个无法使用的总狗。

您可以实现自己的加密序列化/反序列化方法。

有一个加密应用程序演练,请访问http://msdn.microsoft.com/en-us/library/bb397867.aspx

希望这可以帮助。

从您的简要概述中了解如何使用它以及它的单一用户性质可能RDBMS会过度,您可能只需将少量数据存储在text / xml文件中并将其作为资源嵌入到exe中(如果需要加密)

源码

SQLite是一个软件库,它实现了一个独立的,无服务器,零配置的事务SQL数据库引擎。 SQLite是世界上部署最广泛的SQL数据库引擎。 SQLite的源代码位于公共域中。

sqlite.phxsoftware.com System.Data.SQLite是原始的SQLite数据库引擎和一个完整的ADO.NET 2.0 / 3.5提供程序,它们都集成到一个混合模式程序集中。 它是原始sqlite3.dll的完全替代品(如果您原生使用它,您甚至可以将其重命名为sqlite3.dll)。

c#的可用包装列表: http ://www.sqlite.org/cvstrac/wiki?p = SqliteWrappers下的C#包装器部分

我正在使用这里的一个: SQLite的简单C#Wrapper,它是基本的,但足以满足我的需求

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);
    }
  }
}

通过这种方式,您可以通过以下方式将整个对象树以加密形式保存到磁盘:

DataSerializer<MyObjectType>.WriteData(@"c:\somewhere\something.data", myObject);

并阅读它:

myObject = DataSerializer<MyObjectType>.ReadData(@"c:\somewhere\something.data");

这比使用SQL Server Compact甚至完整的SQL Server要好得多,因为LINQ to Objects比LINQ to SQL强大得多。 在许多情况下也更快。

这只适用于您的数据集很容易适合RAM的情况。

答案取决于更多细节; 但C#SQLite( http://code.google.com/p/csharp-sqlite/ )可能是一个选项。 如果您的数据库将少于4GB数据,那么SQL Server Compact是一个完美的候选者; 没有安装,没有配置,xcopy部署。

VistaDB支持在数据库或表级别上使用完全加密的xcopy(轻松部署)。

另请查看Db4o ,它是一个开源对象数据库。 它们支持加密对象数据库以及linq,这使得查询数据变得轻而易举。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM