我需要创建一个.NET应用程序,它将一些机密信息存储到数据库中(例如密码和东西)。在将数据存储到数据库之前,我可以使用对称加密对这些进行加密,但是如果有人对源代码进行反编译,则对称密码可能会受到损害。
由于这将是服务应用程序,我不能要求用户提供对称密码。我也不能使用机器相关的密码,因为这些数据将从不同的计算机上读取。
最好的方法是什么?
更新:哈希在这种情况下不起作用...导致有人需要输入有效密码来对照哈希进行验证,而事实并非如此。信息必须驻留在数据库中,但它将由Windows服务应用程序检索(此处没有用户)。没有人输入密码并根据哈希验证它,所以我需要检索原始密码...
答案 0 :(得分:2)
您可以使用Database Level encryption(假设您说.net时为Sql Server)并使用Encrypted Connections到Sql Server。这样可以在存储和传输到应用程序服务器时保护数据。
这样可以在没有任何特殊密码的情况下处理安全问题 - 它基于能够对数据库服务器进行身份验证。与没有加密的情况相同。
答案 1 :(得分:1)
将密码存储为单向哈希。当用户输入密码进行验证时,以与密码相同的方式对其尝试进行散列并验证散列结果是否匹配。
以下是Php中的一个示例,但无论语言如何,概念都是相同的: How to store passwords in databases
修改强>
您可能希望在数据库级别查看加密。我假设你使用SQLServer: http://msdn.microsoft.com/en-us/library/cc278098.aspx
Oracle具有类似的加密技术,使用该表的应用程序不知道加密。如果您将此服务与服务之间的加密连接配对,则应该完成您的服务。
答案 2 :(得分:0)
当对密码进行散列处理时,反编译的源代码不会给黑客任何破解密码的机会。
答案 3 :(得分:0)
所以你有一个需要加密/解密数据的应用程序,但是不要求用户输入密码来使用它?首先,这听起来像是一个安全漏洞 - 黑客不需要获取密钥或密码 - 他们只需要获取应用程序。
为了安全地执行此操作,不将密钥存储在应用程序代码中,您必须拥有某些来自用户的密码,您可以使用该密码来加密/解密用于以下的“真实密钥”加密和解密实际数据。
如果您使用服务访问数据,并且未输入密码,则可以从计算机信息生成唯一字符串,并将其用作加密密钥的密码类型。
要在多台计算机上执行此操作,每台计算机都会根据计算机信息生成自己的“密码”。此密码将用于生成密钥(该机器唯一),然后该密钥将用于加密共享密钥(用于加密实际数据)。此信息将存储在具有两列的简单表中的数据库中:MachineID和EncryptedSharedKey。
启动时,服务将检查计算机信息,生成密码,使用该密码生成密钥,并使用该密钥从数据库表中解密共享密钥。然后它就可以使用该共享密钥来加密/解密数据。
当您使用该服务设置新计算机时,您将拥有一个单独的程序,该程序将从文本文件中读取共享密钥,生成计算机密钥,在表中创建具有计算机ID和加密共享密钥的行,然后删除程序和文本文件,其中包含未加密的共享密钥。
这对于将程序复制到另一台计算机的人来说是相当安全的,但实际上只是依赖于默默无闻。如果有人弄清楚如何生成机器密钥,并且可以访问其中一台带有服务的机器,他们可以使用受感染机器的信息自行生成机器密钥。