1

我正在使用 C#(.NET 4.0、SQL CE 4.0 数据库)编写一个小型企业应用程序。数据库是加密的(SQL CE 支持数据库加密),但据我所知,来自http://msdn.microsoft.com/en-us/library/aa257373(v=sql.80).aspx密码:

最长可达 40 个字符。可以包含字母、符号、数字或组合。无法恢复。

我的用户将输入应用程序的密码,这可能不会很复杂和安全。因此,我想以某种方式修改用户密码以创建更安全的数据库加密密码。据我所知,有Rfc2898DeriveBytes Class,它从密码中派生字节。但是我需要有效字符(SQL Server CE 密码的允许字符?)作为数据库密码,这意味着我可能无法使用toBase64String()

到目前为止,我的想法是为数据库创建一个随机且安全的密码并将其保存到一个文件中,该文件将使用 AES256 加密,密钥来自用户密码。有没有更好的方法来做到这一点?

另外,我怎样才能实现每个拥有自己的应用程序密码的多个用户可以使用相同的数据库密码访问同一个数据库?

感谢您的时间和回答

4

3 回答 3

2

您不能直接这样做:将所有用户密码转换为相同数据库密码的功能会破坏数据库加密的目的。将数据库密码存储在应用程序中是同构的。

这并不是说没有简单的解决方法:

  • 有第二个文件 - 未加密的 SQL CE 数据库或纯文本文件
  • 这里面有一个简单的表:

    User | EncryptedPassword(所有字符串)

  • 对于每个用户,此文件中都有一行(如果是文本文件,则为一行),其中包含用户名和使用用户密码加密的 DB 密码(显然是 pw 的二进制哈希,存储为 base64)

  • 当用户登录时,使用给定的密码来解密EncryptedPassword该用户的字段,这应该是数据库密码,您现在可以使用它来打开数据库

  • This also means, that a wrong user password is detected by failure to supply the correct SQL database password.

于 2012-04-05T20:31:06.100 回答
1

在我看来,它ToBase64String()返回一个只包含字母、数字和斜杠的字符串。这符合 SQL CE 的要求。您可以使用Rfc2898DeriveBytes,生成 20 个字节,然后从中生成一个 40 个字符的 base64 字符串。盐应该因用户而异 - 例如,您可以使用用户名和站点名称的串联。

于 2012-04-05T20:28:11.540 回答
0

任何知道您的密码增强算法的人都可以重新应用该算法并使用弱用户密码进行攻击加密。在这方面,在密码中添加“一些东西”是一个好主意,但不是一个完美的解决方案。

通常,您所说的概念是salting。您在散列之前用其他数据加盐输入(听起来“不可恢复”密码实际上是密码的散列)。看起来(从您提供的链接文章中)连接字符串中使用了密码,这限制了您的有效字符集。

创建将密码存储为加盐哈希的用户帐户时,应在服务器端确定盐值并以安全方式存储,与该用户相关联。创建或更改密码时,每个用户的盐值应包含在哈希算法中。

不要使用单个中央密钥进行加密。只需在用户提供的密码中添加盐。

更新

如果您必须使用单个密码而不是使用特定于用户的密码来分发数据库(例如,如果您不能为每个用户单独加密副本),那么您有两个解耦的问题:

  • 如何保护数据库不被未经授权的人查看?
  • 如何验证我的用户?

要处理第一个问题,在您的应用程序中安全地嵌入一个相当长的密码是可行的方法。然而,对于坚定的攻击者来说,“安全嵌入”很难实现。在那里,您必须估计某人投入精力闯入数据库(“电影清单”或“信用卡号码”?)的可能性,并确定如果有人真的有能力,您的公司或您的客户会遭受损失闯入(例如,您是否会因无论如何都不会购买该程序的人而“失去收入”,您是否会允许泄露客户的秘密,...)。

如果您确定需要尽最大努力保护数据库密钥,请使用高端混淆解决方案。请注意,如果您将 AES 加密的密钥存储在文件中,您的代码仍需要解密加密数据以检索密钥。如果您的代码没有被很好地混淆,那么某人将调试器附加到您的程序并允许您的程序为他们解密密钥是微不足道的,因此从这个意义上说,AES 几乎没有什么好处。然而,即使是最好的混淆也无法阻止最熟练和最坚定的黑客。

至于第二个要点,您需要授权用户访问您的程序(并间接访问数据库)。一种方法是使用简单的用户名/密码哈希方法。您可以将用户表存储在 SQL CE 数据库中。毕竟,无论用户是否成功验证,程序都可以访问该数据库。

于 2012-04-05T20:27:15.380 回答