是您的文件和您的程序可以修改它。在这种情况下,有一个简单的解决方案。 (如果您有能力将日志文件放入单独的文件夹中)
注意:
您可以将所有日志文件放入单独的文件夹中。例如,在我的应用程序中,我们有很多 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:我们为监控文件夹而创建的进程。
Inpector 看到文件夹中的更改。向 Suspect A 询问他是否对其进行了任何更改。
如果是这样,
change is taken as VALID.
如果没有
clear indication that change is done by *Suspect X*. So NOT VALID!
File is certified to be TAMPERED.
除此之外,以下是一些可能(或可能不会:))帮助您的技术!
存储应用程序关闭文件时的时间戳以及文件大小。
下次打开文件时,检查该时间的最后修改时间及其大小。如果两者相同,则表示文件没有被篡改。
将日志写入文件后,将文件权限更改为只读。在某些程序或有人想要篡改它时,他们试图更改只读属性。此操作更改为文件修改的日期/时间。
仅将加密数据写入您的日志文件。如果有人篡改,当我们解密数据时,可能会发现一些文本没有正确解密。
使用压缩和解压缩机制(压缩可以帮助您使用密码保护文件)
每种方式都可能有其优点和缺点。根据您的需要加强逻辑。您甚至可以尝试结合所提出的技术。