我有一个程序,其中数据库的密码由远程用户设置。该程序将用户名和密码保存到 xml 文件中的加密字符串中,否则该文件应该是人类可读的。现在,这工作正常,我使用带有密钥的 C# DES 加密,它被加密和解密。现在,问题是任何人都可以使用反射器来查看密钥。即使进行了混淆,密钥也应该很明显。那么,如何处理呢?现在,我不需要它来保证 NSA 的安全,但我真的很想防止任何人偷看。谢谢。
编辑:感谢到目前为止的所有建议,关于这类事情的信息并不是很普遍,我非常感谢一般提示和具体答案。
我有一个程序,其中数据库的密码由远程用户设置。该程序将用户名和密码保存到 xml 文件中的加密字符串中,否则该文件应该是人类可读的。现在,这工作正常,我使用带有密钥的 C# DES 加密,它被加密和解密。现在,问题是任何人都可以使用反射器来查看密钥。即使进行了混淆,密钥也应该很明显。那么,如何处理呢?现在,我不需要它来保证 NSA 的安全,但我真的很想防止任何人偷看。谢谢。
编辑:感谢到目前为止的所有建议,关于这类事情的信息并不是很普遍,我非常感谢一般提示和具体答案。
尝试使用 DPAPI(System.Security.ProtectedData 类)。这可以使用用户或计算机凭据保护您的加密数据。因此,只有访问数据的用户帐户(用户凭据)或可以登录机器的用户(机器凭据)才能解密您的数据。
这不是关于reector的问题。这是关于密钥管理的。DES 和任何其他加密方案都依赖于定期更改密钥。硬编码代码中的密钥显然违反了这一点。为了解决这个问题,您应该研究密钥管理。
编辑:详细说明一下:根据您的设置,您可以将散列密码存储在文件系统中并依赖文件系统/用户安全性或在数据库中依赖数据库权限。
你不应该使用嵌入在你的应用程序中的秘密来加密你的密码,那是你麻烦的根源。无论您的加密有多强,密钥都清楚地暴露在您的代码中。
您应该向您的用户询问凭据,将 db 用户/名称和密码存储在 app.config 中的普通配置部分中,并依靠 DPAPI 支持的DpapiProtectedConfigurationProvider类为您加密和解密该部分,使用机器密钥或用户特定的密钥。有关如何执行此操作的完整示例,请参阅我提供的链接。
不幸的是,从来没有一种 100% 安全的方式来做到这一点。您可以混淆代码,将非托管代码用于秘密区域,但由于您的应用程序能够再次读取密码,因此任何付出足够努力的攻击者都可以。
您根本不应该存储加密的密码。您应该使用单向哈希函数将其存储为哈希值。看:
我们也有类似的情况。我们最终将密钥放入文件中,并让用户输入某种密码(或使用散列的密钥)才能读取文件。让用户输入更多信息很痛苦,但它从程序中删除了密钥。