3

我们的应用程序使用 ClickOnce 由用户在他们的计算机上进行无管理员部署。该应用程序有一个包含敏感数据的 SqlServerCE 数据库。要求是在部署时以及之后每 20 天更改一次数据库密码(可配置)。我们正在处理 db 密码更改、connstring 更改和加密 app.config 文件的 connString 部分 ok。

问题在于后续的 ClickOnce 部署。如果新部署的数据库与初始部署不同(manifest 中的 hash 值发生了变化),则没有问题。新数据库替换旧数据库并具有立即更新的初始默认密码。

当新部署的数据库与初始部署相同(manifest 中的哈希值相同)时,就会出现问题。ClickOnce 将旧数据库滚动到新部署中,但应用程序不再有权访问密码。它在旧的 app.config 文件中,并且不会前滚。您会认为,当 db 存在时,至少连接字符串部分会前滚,但我想这要求太多了。

所以好吧,不是问题。我们添加了将当前密码复制到 user.config 文件中的代码。现在在部署时,如果应用程序无法打开数据库,它会从 user.config 中获取密码并更新 app.config 中的连接字符串。ClickOnce 似乎会自动复制旧 user.config 的内容并创建新的 user.config,而无需应用程序执行诸如调用 settings.default.upgrade() 和 .Save() 之类的操作。

但如果 user.config 被加密,这将不起作用。似乎 ClickOnce 尝试将数据从旧的 u.config 文件复制到新文件,但由于加密而失败。因此它只包含在 app.config 的 userSettings 中部署的任何数据。

是否有任何机制可以访问旧的 user.config 文件、解密和获取其中包含的数据?旧的和新的 user.config 在 ClickOnce 数据文件夹集中都可用,但我不想编写试图手动定位旧文件的代码。

就本地数据的安全性而言,ClickOnce 是一头野兽。它只是没有帮助。如果我无法让 user.config 工作,我将不得不在 ClickOnce 无法控制的某个用户可访问区域中放置一个文件,并从那里管理密码数据。内容当然会被加密。

4

0 回答 0