加密/解密数据到数据库

问题描述:

我需要创建一个.NET应用程序,它将一些机密信息存储到数据库(例如密码和东西)。在我将它们存储到数据库之前,我可以使用对称加密对它们进行加密,但是如果有人反编译源代码,对称密码可能会受到影响。加密/解密数据到数据库

既然这将是服务应用程序,我不能要求用户提供对称密码。我也不能使用与机器相关的密码,因为这些数据将从不同的计算机中读取。

这样做的最好方法是什么?

更新:哈希不适用于这种情况...因为有人需要输入有效的密码来验证它与哈希,而事实并非如此。信息必须驻留在数据库中,但它将被Windows服务应用程序检索(这里没有用户)。没有人可以输入密码并用哈希验证它,所以我需要检索原始密码...

+0

密码应该被盐渍和散列并且存储散列。 – 2009-09-24 12:04:05

+0

哈希不适用于这种情况...因为有人需要输入有效的密码才能验证它是否符合哈希值,但情况并非如此。信息必须驻留在数据库中,但它将被Windows服务应用程序检索(这里没有用户)。没有人可以输入密码并对其进行验证,因此我需要检索原始密码... – Anne 2009-09-24 12:14:08

+0

为什么需要“使用”用户密码?这似乎是一种使用useraccounts的奇怪方式。 – Glenner003 2009-09-24 12:19:32

所以你有一个应用程序需要加密/解密数据,但不需要用户输入密码来使用它?首先,这听起来像是一个安全漏洞 - 黑客无需获得密钥或密码 - 他们只需要获取应用程序。

为了安全地做到这一点,在不将密钥存储在应用程序代码中的情况下,您必须拥有某种来自用户的密码,您可以使用该密码来加密/解密使用的“真实密钥”加密和解密实际数据。

如果您使用的是服务来访问数据,并且没有输入密码,您可以根据机器信息生成一个唯一字符串,并将其用作密码类型来加密密钥。

要在多台机器上执行此操作,每台机器都会根据机器信息生成自己的“密码”。这个密码将被用来生成一个密钥(对于该机器来说是唯一的),然后该密钥将被用于加密共享密钥(用于加密实际数据)。这些信息将存储在数据库中的一个带有两列的简单表格中:MachineID和EncryptedSharedKey。

在启动时,服务将检查机器信息,生成其密码,使用该密钥生成其密钥,并使用该密钥从数据库表中解密共享密钥。然后它可以使用该共享密钥来加密/解密数据。

当您使用该服务设置新计算机时,您将拥有一个单独的程序,用于从文本文件读取共享密钥,生成计算机密钥,使用计算机标识在表中创建一行并加密共享键,然后使用其中未加密的共享密钥删除程序和文本文件。

这对于将您的程序复制到另一台机器的人来说是相当安全的,但实际上仅仅依赖于默默无闻。如果有人想知道如何生成机器密钥,并且可以访问其中一台机器,那么他们可以使用来自受感染机器的信息自行生成机器密钥。

将密码存储为单向哈希值。当用户输入密码进行验证时,以与密码相同的方式对其尝试进行散列,并验证散列结果是否匹配。

下面是PHP中的例子,但概念是一样的,不管语言: How to store passwords in databases

编辑

你可能想看看在数据库级加密。我假设你使用的SQLServer: http://msdn.microsoft.com/en-us/library/cc278098.aspx

甲骨文也有类似的encyption技术,其中使用表中的应用程序不知道的加密。如果您将此服务与您的服务与数据库的加密连接进行配对,那么您应该完成它看起来像你之后的事情。

+0

那么......这里没有用户,也没有人输入密码......服务应用程序需要不时检索信息... – Anne 2009-09-24 12:11:13

散列密码时,反编译的源代码不会给黑客任何破坏密码的机会。

+0

哈希不适用于我的情况...导致某人需要输入有效的密码用哈希来验证它,但事实并非如此。 – Anne 2009-09-24 12:12:05

您可以使用Database Level encryption(假设您使用.net表示Sql Server),并使用Encrypted Connections指向Sql Server。这样可以在存储和传输到应用程序服务器时保护数据。

这需要在没有任何特殊密码的情况下处理安全问题 - 它基于能够向数据库服务器进行身份验证。和你不必加密一样。

+0

服务应用程序仍然需要存储数据库用户名和密码。如果她担心人们反编译应用程序的源代码,她可能会担心人们通过存储的服务连接字符串获取应用程序配置文件。 – 2009-09-24 12:36:37

+0

在某些情况下,必须将某些凭证存储在某处 - 最好不要在遵从的代码中,而应在受限制的配置文件中。并且可以使用网络安全来限制与某些计算机的数据库连接。然而,黑客总是会有一种方法进入。提醒安全的角落石头的主要原因是我们无法保证任何东西的安全 - 只会使得获得的价值更高。 – Chad 2009-09-24 12:52:35