我们的应用程序使用ClickOnce进行用户对其计算机的无管理部署。 该应用程序具有包含敏感数据的SqlServerCE数据库。要求是在部署时更改db密码,之后每20天更改一次(可配置)。 我们正在处理db密码更改,connstring更改和加密app.config文件的connString部分。
问题在于后续的ClickOnce部署。如果新部署的数据库与初始部署不同(清单中的哈希值已更改),则没有问题。新数据库替换旧数据库,并具有立即更新的初始默认密码。
当新部署的数据库与初始部署相同时(清单中的哈希值相同)存在问题。 ClickOnce将旧数据库滚动到新部署中,但应用程序不再能够访问密码。它位于旧的app.config文件中,并且不会前滚。你会认为至少连接字符串部分会在db出现时向前滚动,但我想这太过要求了。
好吧,不是问题。我们添加了将当前密码复制到user.config文件的代码。现在在部署时,如果应用程序无法打开数据库,它将从user.config中获取密码并更新app.config中的connstrings。 ClickOnce似乎自动复制旧user.config的内容并创建新的user.config,而app不需要执行调用settings.default.upgrade()和.Save()等操作。
但如果user.config已加密,则此方法无效。似乎ClickOnce尝试将旧的u.config文件中的数据复制到新文件但由于加密而失败。因此它只包含在app.config的userSettings中部署的任何数据。
是否有任何机制可以访问旧的user.config文件,解密并获取它包含的数据? ClickOnce数据文件夹集中都提供了旧的和新的user.config,但我不想编写尝试手动查找旧文件的代码。
ClickOnce在本地数据的安全性方面是一种野兽。它没有帮助。如果我无法使user.config工作,我将不得不将文件放在ClickOnce之外的一些用户可访问区域,并从那里管理密码数据。当然会加密内容。