我应该如何阻止用户修改我的数据文件

本文关键字:我的 数据 文件 修改 用户 何阻止 我应该 | 更新日期: 2023-09-27 17:56:44

我正在做一个项目,该项目将取代我们制造车间的遗留软件。我担心的一个问题是,目前,配置文件、脚本缓存等都是纯文本,存储在用户正在使用的系统上。很多这些东西将被推掉以限制访问网络位置,但像配置文件这样的东西仍然是本地的。用户认为他们知道自己在用系统做什么,并修改配置文件已经是一个问题。我不希望这种情况在新软件中再发生。我应该如何防止这种情况?加密?使用数据库查找进行某种签名/校验和?C#/.NET 提供了哪些类型的功能来帮助我解决这个问题?

更新:只是为了解决评论中提出的一些问题,制造车间的每个用户都有对他们正在处理的系统具有管理员访问权限。这不太可能很快改变,因为大多数安全性来自限制对网络上的文件夹、Web 服务和数据库的访问。我同意,权限是理想的,但我必须在提供的环境中工作。我计划在与IS的会议上提出它,看看这是否有可能,但现在假设这将在用户具有完全访问权限的系统上。

我应该如何阻止用户修改我的数据文件

这不是 C# 编码问题,而是系统配置问题。 设置计算机,使用户具有普通(非管理员)帐户。 设置你担心的配置文件的文件权限,以便任何人(包括以当前用户身份运行的应用)都可以读取配置文件,但只有管理员可以编写配置文件。 最后,不要向用户提供管理员密码。;>

如果你的应用还需要能够编写配置文件,则必须添加代码以在应用中转换为管理员模式,最好仅在写入操作周围。

为了防止普通最终用户手动修改配置文件,您可以简单地使用其内容的 SHA 与一些只有程序知道的秘密因素连接起来对配置文件进行签名。这显然不是一个真实或完美的秘密,但它足以防止最终用户的简单篡改。

基本上(伪代码):

function isValidConfig(configPath, signaturePath) {
  return readFile(signaturePath) == SHA(readFile(configPath) + secret)
}
function writeConfig(contents, configPath, signaturePath) {
  writeFile(configPath, contents)
  writeFile(signaturePath, SHA(contents + secret))
}

如果不反编译程序,他们将无法篡改配置。我假设您的制造车间没有 l33t crax0rs...

对于数字签名来说,这似乎是一个很好的工作。数字签名将提供数据的完整性和身份验证。这意味着数字签名将检测数据(配置文件)是否已更改,以及数据是否来自受信任的来源。数字签名是通过执行数据的哈希,然后使用公钥/私钥对的私钥加密哈希来创建的。应用程序将解密加密的哈希,计算数据的哈希,并将解密的哈希与计算的哈希进行比较。如果哈希匹配,则数据有效。如果它们不匹配,则数据已被更改。

.Net 在 DSACryptoServiceProvider.VerifyHash 中包含这些函数

当然,如果您不想经历创建公钥/私钥对的麻烦,您可以使用配置文件的简单哈希来确保它没有被更改。

真正重要的问题是;当应用程序检测到更改的配置文件时,您将执行什么操作?

您是否要退出应用程序,锁定某些功能,向您发送电子邮件,尝试获取配置文件的良好副本?这些操作称为完整性检查失败的惩罚。现在,您的应用程序没有对配置文件执行完整性检查,但是当您添加检查时,您需要确定失败的最佳操作过程。

一个选项是让您尽可能多地从配置文件移动到隔离存储,甚至更好地移动到数据库。 典型用户极不可能知道如何访问它们。

我会将文件保存在某种结构化存储中,无论是独立存储、稍微加密的 ZIP 文件还是我们的 SolFS 虚拟文件系统(也是加密的)。拥有一个文件的第二个好处是可以轻松复制它以进行备份。

我不是本地安全方面的专家,但也许您可以使用文件系统权限来阻止用户访问给定文件夹或文件。

然后,如果您的应用程序需要访问此文件,则必须使用有权修改文件的不同 Windows 帐户启动应用程序。