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

时间:2009-11-18 16:41:02

标签: c# wpf ms-access encryption rdbms

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

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

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

(注意:我也一直在关注Database engine for a desktop application in C#和)

9 个答案:

答案 0 :(得分:11)

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提供程序,它有可能让您的生活更轻松。

答案 1 :(得分:5)

你有没有看过SQL Server Compact

  

SQL Server Compact 3.5是免费的,   易于使用的嵌入式数据库引擎   这让开发人员可以构建强大   Windows桌面和移动设备   在所有Windows上运行的应用程序   平台包括Windows XP,Vista,   掌上电脑和智能手机。

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

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

答案 2 :(得分:2)

这个答案 TOTALLY 取决于你有一个相对小数据集,所以请相应考虑......

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

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

我已经将这项技术用于一些个人项目并且效果很好, IF 你有一个小数据集。

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

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

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

http://msdn.microsoft.com/en-us/library/bb397867.aspx

上有一个加密应用演练

希望这有帮助。

答案 3 :(得分:1)

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

答案 4 :(得分:1)

sqlite

  

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

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

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

我正在使用这里的那个:Simple C# Wrapper for SQLite这是基本但足以满足我的需求

答案 5 :(得分:1)

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的情况。

答案 6 :(得分:1)

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

答案 7 :(得分:0)

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

答案 8 :(得分:0)

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