9

我想验证在我的客户站点上运行的程序创建的文本日志文件是否已被篡改。你建议我怎么做?我在这里和谷歌搜索了一堆,但找不到我的答案。谢谢!

编辑:在阅读了到目前为止的所有建议之后,这是我的想法。我想保持简单,并且由于客户不是那么精通计算机,我认为将盐嵌入二进制文件是安全的。我将继续使用关键字“salt checksum hash”等搜索一个简单的解决方案,并在找到后发回此处。

4

5 回答 5

5

强制性序言:这里有多少风险?您必须假设篡改是可能的,但如果您花费足够的时间和金钱,您可能会使其变得非常困难。那么:它对你来说值多少钱?

那说:

由于是您编写文件的代码,因此您可以将其加密写出。如果您需要它是人类可读的,您可以保留第二个加密副本,或仅包含散列的第二个文件,或为每个条目编写一个散列值。(当然,哈希必须包含一个“秘密”密钥。)如果这样做风险太大,请考虑将哈希或校验和或日志本身传输到其他服务器。等等。

于 2010-06-01T04:33:31.767 回答
1

这实际上取决于您要实现的目标,面临的风险以及限制因素。

从根本上说:你所要求的完全是不可能的(孤立地)。

现在,这是一个让试图修改文件的人的生活变得复杂的问题,这样他们修改文件的成本就会超过他们通过修改所能获得的收益。当然,这意味着以破解您的保护措施为唯一目标的黑客不会被吓倒......

假设它应该在独立计算机(无网络)上工作,正如我所说,这是不可能的。无论您使用什么过程,无论密钥/算法是什么,它最终都嵌入在二进制文件中,暴露在潜在黑客的审查之下。可以分解它,可以用十六进制阅读器检查它,可以用不同的输入探测它,插入调试器等......因此,您唯一的选择是通过分解逻辑来使调试/检查变得痛苦,使用调试检测来改变路径,如果你非常擅长使用自修改代码。这并不意味着不可能篡改这个过程,它仅仅意味着它应该变得足够困难,任何攻击者都会放弃。

如果您有网络可供使用,您可以将哈希存储在远程(在您的控制下)驱动器上,然后比较哈希。这里有2个困难:

  • 存储(如何确保它是您的二进制文件?)
  • 检索(如何确保您正在与正确的服务器通话?)

当然,在这两种情况下,都要小心中间综合症的男人......

最后一点建议:如果你需要安全,你需要咨询真正的专家,不要依赖一些奇怪的人(比如我自己)在论坛上说话。我们是业余爱好者。

于 2010-06-01T06:49:12.543 回答
1

这是一件非常困难的事情,除非您能以某种方式保护用于签署数据的密钥对。对数据进行签名需要私钥,如果该密钥在机器上,人们可以简单地更改数据或创建新数据,并使用该私钥对数据进行签名。您可以将私钥保存在“安全”机器上,但是如何保证数据在离开原始机器之前没有被篡改?

当然,如果您只保护动态数据,事情会变得容易得多。

如果您可以保护私钥,签名数据很容易。

一旦您制定了确保安全性的更高级别的理论,请查看GPGME进行签名。

于 2010-06-01T02:10:38.210 回答
1

您可以使用诸如adler-32 之类的算法将校验和作为每个文件行的前缀。如果您不想将二进制代码放在日志文件中,请使用 encode64 方法将校验和转换为非二进制数据。因此,您可以只丢弃已被篡改的行。

于 2010-06-01T02:34:19.447 回答
0

这是您的文件和您的程序,可以修改它。在这种情况下,有一个简单的解决方案。(如果您有能力将日志文件放入单独的文件夹中)

注意: 您可以将所有日志文件放入单独的文件夹中。例如,在我的应用程序中,我们有很多 DLL,每个 DLL 都有自己的日志文件,当然应用程序也有自己的。

因此,在后台运行一个单独的进程并监视文件夹中的任何更改通知,例如

  • 文件大小变化
  • 尝试重命名文件或文件夹
  • 删除文件等...

根据此通知,您可以证明文件是否已更改!(正如您和其他人可能猜测的那样,即使您的进程和 dll 也会更改这些文件,这也可能导致通知。您需要巧妙地同步此操作。就是这样)

Window API 来监视下面给出的文件夹:

HANDLE FindFirstChangeNotification(
LPCTSTR lpPathName,
BOOL bWatchSubtree,
DWORD dwNotifyFilter
);

lpPathName: 
Path to the log directory.

bWatchSubtree:
Watch subfolder or not (0 or 1)

dwNotifyFilter:
Filter conditions that satisfy a change notification wait. This parameter can be one or more of the following values. 
FILE_NOTIFY_CHANGE_FILE_NAME
FILE_NOTIFY_CHANGE_DIR_NAME
FILE_NOTIFY_CHANGE_SIZE
FILE_NOTIFY_CHANGE_SECURITY
etc... 
(Check MSDN)

如何让它发挥作用?

嫌疑人A:我们的过程

嫌疑人X:其他进程或用户

Inspector:我们为监视文件夹而创建的进程。

检查员看到文件夹中的更改。向嫌疑人 A询问他是否对其进行了任何更改。

如果是这样,

change is taken as VALID.

如果不

clear indication that change is done by *Suspect X*. So NOT VALID! 
File is certified to be TAMPERED.

除此之外,以下是一些可能(或可能不会:))帮助您的技术!

  1. 每当应用程序关闭文件时存储时间戳以及文件大小。下次打开文件时,检查该时间的最后修改时间及其大小。如果两者相同,则表示文件仍未被篡改。

  2. 将日志写入文件后,将文件权限更改为只读。在某些程序或有人想要篡改它时,他们试图更改只读属性。此操作更改为文件修改的日期/时间。

  3. 仅将加密数据写入您的日志文件。如果有人篡改它,当我们解密数据时,我们可能会发现一些文本没有正确解密。

  4. 使用压缩和解压缩机制(压缩可以帮助您使用密码保护文件)

每种方式可能都有自己的优点和缺点。根据您的需要加强逻辑。您甚至可以尝试结合所提出的技术。

于 2010-06-01T05:54:45.240 回答