解决  如何与最终用户共享.exe文件?

匿名的

活跃成员
已加入
2020年9月29日
留言内容
38
编程经验
Beginner
我知道您必须右键单击该解决方案,然后转到bin文件夹,从中可以复制.exe,dll和配置文件并将其共享给最终用户。问题是我将数据库连接代码存储在也具有数据库用户名和密码的appconfig文件中。因此,如果我将appconfig文件共享给最终用户,它将是不安全的,因为任何未经授权的人都可以访问数据库并执行任何操作。另外,任何用户都可以使用记事本打开appconfig文件,轻松修改它。还有其他方法可以实现吗?
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,533
地点
弗吉尼亚州切萨皮克
编程经验
10+
就像可以加密ASP.NET应用程序中的web.config的方式一样,您也可以加密app.config。加密对于正在运行的代码是透明的,因此您无需更改代码。但是,您需要跳过一些步骤才能执行此加密,因为SDK中没有内置工具可以为台式机应用程序执行此加密,这与ASP.NET应用程序不同,后者具有regiis.exe,让您进行加密。建立自己的工具来做到这一点并不困难。只是不方便。

这样做的好处是,这是执行所需操作的最安全的方法,因为每个加密版本都是针对每台计算机/每个用户特定的(除非有人非法克隆了计算机)。需要创建自己的工具的缺点是,您必须在安装时或首次运行时执行加密。因此,您的机密仍然需要在不受保护的情况下传递给用户,直到您有机会保护它为止。

无论如何,为什么桌面应用程序直接访问(共享)数据库?如果需要保护数据库,则将Web服务放在数据库前面,并使您的应用程序针对Web服务进行身份验证,然后将其查询发送到Web服务。然后,那时存储在计算机上的唯一机密就是登录到Web服务所需的每个用户的机密。每个用户应具有自己的凭据以进行审核。

然后,用户有责任在自己的计算机上确保其凭据的安全。您可以通过使用Windows内置的DPAPI(更安全的路由)对app.config中的凭据进行即时加密和解密来帮助他们,或者仅使用.NET Framework内置的一些对称加密。对于对称加密,问题就变成了如何保护用于加密的密钥。
 

匿名的

活跃成员
已加入
2020年9月29日
留言内容
38
编程经验
Beginner
就像可以加密ASP.NET应用程序中的web.config的方式一样,您也可以加密app.config。加密对于正在运行的代码是透明的,因此您无需更改代码。但是,您需要跳过一些步骤才能执行此加密,因为SDK中没有内置工具可以为台式机应用程序执行此加密,这与ASP.NET应用程序不同,后者具有regiis.exe,让您进行加密。建立自己的工具来做到这一点并不困难。只是不方便。

这样做的好处是,这是执行所需操作的最安全的方法,因为每个加密版本都是针对每台计算机/每个用户特定的(除非有人非法克隆了计算机)。需要创建自己的工具的缺点是,您必须在安装时或首次运行时执行加密。因此,您的机密仍然需要在不受保护的情况下传递给用户,直到您有机会保护它为止。

无论如何,为什么桌面应用程序直接访问(共享)数据库?如果需要保护数据库,则将Web服务放在数据库前面,并使您的应用程序针对Web服务进行身份验证,然后将其查询发送到Web服务。然后,那时存储在计算机上的唯一机密就是登录到Web服务所需的每个用户的机密。每个用户应具有自己的凭据以进行审核。

然后,用户有责任在自己的计算机上确保其凭据的安全。您可以通过使用Windows内置的DPAPI(更安全的路由)对app.config中的凭据进行即时加密和解密来帮助他们,或者仅使用.NET Framework内置的一些对称加密。对于对称加密,问题就变成了如何保护用于加密的密钥。
实际上,我无法控制数据库,并且当前客户没有任何Web服务。我的桌面应用程序正在更新数据库。我认为我可以做的一个选择是将连接字符串存储在类文件中,而不是存储在appconfig文件中,但是我的appconfig文件仍将包含日志文件标签和应用程序正在使用的其他标签。当我共享.exe时,我还将共享dll和配置文件。任何用户都有可能打开配置文件,对其进行更改并可能使应用程序崩溃。我还可以通过其他方式共享.exe吗?
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,533
地点
弗吉尼亚州切萨皮克
编程经验
10+
您试图防止什么:更改连接字符串,或防止用户看到连接字符串?

如果您只需要防止用户更改连接字符串,则只需将该字符串硬编码到您的代码中即可(尽管这不是最佳实践)。

如果要阻止用户查看和更改连接字符串,则需要以某种方式对连接字符串进行加密。它可以像ROT13,XOR一样简单,也可以更安全。

根据您使用的代码混淆器的类型,您可能会将硬编码的连接字符串存储在代码中,从而使用户很难(但并非不可能)看到和更改连接字符串。
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,533
地点
弗吉尼亚州切萨皮克
编程经验
10+
实际上,我无法控制数据库,并且当前客户没有任何Web服务。
我希望您的客户的数据库仅对他的局域网开放,而不会裸露在Internet上。
 

匿名的

活跃成员
已加入
2020年9月29日
留言内容
38
编程经验
Beginner
您试图防止什么:更改连接字符串,或防止用户看到连接字符串?

如果您只需要防止用户更改连接字符串,则只需将该字符串硬编码到您的代码中即可(尽管这不是最佳实践)。

如果要阻止用户查看和更改连接字符串,则需要以某种方式对连接字符串进行加密。它可以像ROT13,XOR一样简单,也可以更安全。

根据您使用的代码混淆器的类型,您可能会将硬编码的连接字符串存储在代码中,从而使用户很难(但并非不可能)看到和更改连接字符串。
是的,我会将连接字符串集成到代码中,因为它们会将应用程序分发给最终用户。如果我将其保存在配置文件中,那么任何最终用户都可能会看到所有连接信息,然后可以访问数据库进行任何更改!
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,533
地点
弗吉尼亚州切萨皮克
编程经验
10+
由于您是在LAN中工作并且大概是通过LAN进行分发,因此请查看ClickOnce部署。使用ClickOnce部署的应用程序,文件被埋在一个相对晦涩的目录中,用户必须积极地进行挖掘。
 
最佳 底部