【问题标题】:Encrypting/decrypting data to database加密/解密数据到数据库
【发布时间】:2010-10-14 21:34:03
【问题描述】:

我需要创建一个 .NET 应用程序,它将一些机密信息存储到数据库中(例如密码和资料)。在将它们存储到数据库之前,我可以使用对称加密对其进行加密,但如果有人反编译源代码,对称密码可能会被泄露。

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

最好的方法是什么?

更新: 哈希不适用于这种情况...因为有人需要输入有效密码才能针对哈希进行验证,但事实并非如此。信息必须驻留在数据库中,但将由 Windows 服务应用程序检索(此处没有用户)。没有人输入密码并针对哈希进行验证,所以我需要找回原始密码...

【问题讨论】:

  • 密码应该被加盐和散列并存储散列。
  • 哈希不适用于这种情况......因为有人需要输入有效密码才能根据哈希验证它,但事实并非如此。信息必须驻留在数据库中,但将由 Windows 服务应用程序检索(此处没有用户)。没有人输入密码并针对哈希进行验证,所以我需要找回原始密码...
  • 为什么需要“使用”用户密码?这似乎是一种使用用户帐户的奇怪方式。
  • 安妮,你在投票给人们,因为你没有正确地陈述你的问题,在给出关于哈希的答案之前更新不存在。这似乎很不公平。
  • 您需要先定义您的威胁模型,然后才能有人给出有用的答案。您要防范哪些威胁?您试图防范哪些威胁?

标签: c# .net sql cryptography


【解决方案1】:

你可以使用Database Level encryption(假设你说的是.net Sql Server)并使用Encrypted Connections 到Sql Server。这负责在存储和传输到应用程序服务器时保护数据。

这无需任何特殊密码即可确保安全——它基于能够对数据库服务器进行身份验证。与没有加密的情况相同。

【讨论】:

  • 服务应用仍然需要存储数据库用户名和密码。如果她担心人们会反编译她的应用程序的源代码,那么她可能会担心人们会使用存储的服务连接字符串获取应用程序配置文件。
  • 在某些时候,必须在某处存储一些凭据——最好不在编译的代码中,而是在受限的配置文件中。并且可以使用网络安全来限制与某些计算机的数据库连接。然而,黑客总是有办法进入的。提醒一下安全的基石原则是我们无法保护任何东西——只会让获取它的成本超过其价值。
【解决方案2】:

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

为了安全地执行此操作,无需将密钥存储在您的应用程序代码中,您必须拥有来自用户的某种密码,您可以使用该密码来加密/解密用于加密的“真实密钥”对实际数据进行加密和解密。

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

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

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

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

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

【讨论】:

    【解决方案3】:

    在对密码进行哈希处理时,反编译的源代码不会给您的黑客任何破解密码的机会。

    【讨论】:

    • 哈希不适用于我的情况...因为有人需要输入有效密码才能针对哈希进行验证,但事实并非如此。
    【解决方案4】:

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

    这是一个 PHP 的例子,但无论语言如何,概念都是一样的: How to store passwords in databases

    编辑

    您可能希望研究在数据库级别进行加密。我假设您使用 SQLServer: http://msdn.microsoft.com/en-us/library/cc278098.aspx

    Oracle 具有类似的加密技术,其中使用表的应用程序不知道加密。如果您将此与您的服务与数据库之间的加密连接配对,您应该会完成看起来像您之后的事情。

    【讨论】:

    • 嗯……这里没有用户,也没有人在输入密码……服务应用需要时常检索信息……
    猜你喜欢
    • 2018-02-27
    • 2013-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-07
    • 1970-01-01
    相关资源
    最近更新 更多