C# 如何在C中安全地存储加密密钥#

C# 如何在C中安全地存储加密密钥#,c#,.net,asp.net-mvc,security,encryption,C#,.net,Asp.net Mvc,Security,Encryption,我有以下问题: 在我的ASP.NET MVC应用程序中,我想在数据库中存储一些键/值设置。 某些密钥/值设置包含密码,我希望对其进行加密以确保其安全 我无法散列密码,因为我需要一些密码在远程SMTP服务器上进行身份验证 在MSDN上,我发现了一个关于使用“受保护的配置提供程序”保护配置设置的问题,但我不想将该设置存储在我的web.config文件中 我曾考虑使用DpapiProtectedConfigurationProvider,它使用一些特定于机器和用户的属性作为加密密钥,但该提供程序仅用于

我有以下问题: 在我的ASP.NET MVC应用程序中,我想在数据库中存储一些键/值设置。 某些密钥/值设置包含密码,我希望对其进行加密以确保其安全

我无法散列密码,因为我需要一些密码在远程SMTP服务器上进行身份验证

在MSDN上,我发现了一个关于使用“受保护的配置提供程序”保护配置设置的问题,但我不想将该设置存储在我的web.config文件中

我曾考虑使用DpapiProtectedConfigurationProvider,它使用一些特定于机器和用户的属性作为加密密钥,但该提供程序仅用于XML配置节点

另一个MSDN是关于ProtectedData类的,但是这个方法真的安全吗

那么,在C应用程序中存储密码的最佳方法是什么

我还阅读了以下其他问题,但没有找到解决方案: ,


问候语

一种可能是查询数据库中的加密密钥(保存在单独的表中),并使用该密钥对所需的密钥值进行加密/解密,然后使用单独的查询以加密形式从数据库中检索密钥值

当然,这意味着您将在数据库中存储加密密钥值和加密密钥,并且您不会在应用程序代码中的任何位置存储加密密钥。您还应该使用proc调用来检索加密密钥,而不是允许直接访问存储该密钥的表

此技术假设您正在使用其他方法建立数据库连接,即数据库连接密码本身在应用程序中以不同的方式进行保护


正如@Blam所述,您必须将加密密钥存储在某个地方,要么存储在应用程序中,要么存储在应用程序可访问的文件中,要么存储在数据库中。

如果您的进程需要能够在无人参与的情况下解密数据,而您不能使用Dpapi,那么您就不走运了,没有任何选项是真正安全的。还有其他可能的选项吗?为什么您反对在web.config中存储加密/解密密钥?如果要存储加密的数据并需要对其进行解密,则需要将解密密钥存储在某个位置。是的,但我希望将密钥存储在安全位置,并且还需要使用加密方法保护web.config。我不想使用多个配置位置,因为我想将所有数据和配置相关的内容存储在一个中心位置(例如数据库)。您所说的就是密钥管理。可以说这是密码学中最困难的一个方面。有第三方软件提供商专门从事这方面的工作,但如果您想自己尝试解决这一问题,我可以向您指出我刚才给出的答案:好的,非常感谢您的回答,所以我只需要保护数据库连接字符串的配置部分?是的。如果不能对整个内容进行加密,则必须至少保护连接字符串的密码部分。