相似但不相同:
- How to securely store database connection details
- Securely connecting to database within a application
大家好,我有一个连接到数据库服务器的 C# WinForms 应用程序。数据库连接字符串,包括通用用户/密码,放置在 NHibernate 配置文件中,该文件位于与 exe 文件相同的目录中。
现在我有这个问题:运行应用程序的用户不应该知道普通数据库用户的用户名/密码,因为我不想让他直接在数据库中翻找。
或者,我可以对连接字符串进行硬编码,这很糟糕,因为如果数据库被移动或者他想在开发/测试/生产环境之间切换,管理员必须能够更改它。
这么久我发现了三种可能性:
第一个引用问题通常通过使文件仅对运行应用程序的用户可读来回答。
但这对我来说还不够(运行应用程序的用户是一个人。数据库用户/密码是通用的,甚至不应该被这个人访问。)
第一个答案还建议在将连接数据写入文件之前对其进行加密。
使用这种方法,管理员无法再配置连接字符串,因为他无法手动加密它。
第二个引用问题为这种情况提供了一种方法,但它看起来非常复杂。
我想问你的问题:
这是一个非常普遍的问题,所以没有任何一般的“操作方法”方式,某种程度上是“设计模式”吗?
.NET 的配置基础设施是否有一些支持?
(可选,可能超出范围)我可以轻松地将它与 NHibernate 配置机制结合起来吗?
更新:
对第一个答案的回应:我想直接连接到数据库而不是不使用网络服务有几个原因:
- (N)Hibernate 只能用于数据库,不能用于网络服务(我说得对吗?)
- 我们计划提供离线功能,即如果数据库或网络出现故障,用户可以继续工作。为了管理这个,我正在考虑拥有一个本地的进程内数据库,例如SQL Server Compact,并在服务器数据库再次启动时使用 MS Sync 框架将其与服务器数据库同步。
考虑到这一点,您有任何进一步的想法吗?
最佳答案
首先,让不受信任的用户连接到数据库通常不是一个好主意。很多事情都可能出错。在两者之间放置一个网络服务。
如果您绝对必须这样做,那么即使他们获得了用户名和密码也没有关系。限制他们在数据库中的权限,以便他们只能执行一些具有内置安全检查的存储过程。
无论您做什么,都不能将特权用户的用户名/密码提供给不受信任的人。这只是自找麻烦。无论您如何尝试将您的凭据隐藏在二进制文件或诸如此类的加密字符串中,总有办法找到它们。当然,是否有人真的会这样做取决于您的数据有多有趣,但默默地希望拥有调试器的人不会让您一个人呆着并不是一个很好的安全措施。
关于c# - 如何安全地配置数据库连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2966857/