关于这个话题已经有很多SO帖子,但我想再问一遍,因为有些问题已经在2 - 3年前了。
建议流程列表
大多数答案建议访问App.config文件,然后创建连接字符串。虽然它可以加密,但并不完全安全。
为连接创建Web服务,然后所有sql进程都在服务中
创建3层应用程序?
说实话,我只是稍微了解了第一个,而我对另外两个是新手。所以我的问题是什么是最安全和易于实施的?
我计划构建的项目背景:不同的人将拥有桌面应用程序,他们可以登录并重定向到网站。这意味着网站已有现有数据库,但我需要创建一个桌面应用程序,以便他们可以登录。如果已有网站,您会问我为什么需要创建桌面应用程序?然后它是故事的另一面:)希望有人可以给我见解。
答案 0 :(得分:1)
如果您确实需要它是安全的,那么即使是以加密形式,最终用户也无法访问连接字符串。调试甚至反向编译.NET代码并不困难。混淆可以帮助解决这个问题,但优良作法是将任何编译成最终用户可以访问的代码视为可读的代码,这意味着如果您的代码可以解密它,那么具有正确性的足够精明的最终用户工具也可以。实际上,这意味着您需要某种中介,例如Web服务,以确保其安全。 Web服务可以完全保持在您的控制范围内,连接字符串也可以。如果您将Web服务作为API提供给外部各方,那么这就是您使用的相同原则(并且如同您一样编写它并不是一个坏主意)。
编写Web服务的不足之处在于它非常繁琐,并且可能很难维护诸如更改跟踪之类的内容(我认为EF可能有一些解决方案,但我还没看过它们) 。这就是为什么现在很多人都在编写基于Web的应用程序而不是Windows Forms的原因之一(我建议你很好地考虑是否真的需要Windows Forms,或者你是否可以基于web进行大部分工作而且只有一小部分部分在Windows窗体中)。
如果您想要妥协并且不想在配置文件中向最终用户提供连接字符串,您可以使用Web服务来验证用户(或至少您的应用程序)是否为正版然后提供一个永远不会存储到磁盘的加密连接字符串。这并不能阻止应用程序被反编译以确定如何获取它,但这会让它变得更加困难。在特定情况下,您必须根据自己的判断来确定问题的安全性。