2010-06-01 141 views
9

我想验证由我的客户现场运行的程序创建的文本日志文件是否已被篡改。你如何建议我去做这件事?我在这里搜索了一堆和谷歌,但无法找到我的答案。谢谢!用C++签名/认证文本文件的最简单方法是什么?

编辑:在阅读所有建议到目前为止,这里是我的想法。我想保持简单,并且由于客户不是那种电脑爱好者,我认为在二进制文件中嵌入salt是安全的。我将继续使用关键字“salt checksum hash”等来寻找一个简单的解决方案,并在找到之后回到这里。

+0

为什么这有“gpgpu”标签? GPGPU通常代表图形处理单元上的通用计算。这是一个错字吗? – 2010-09-24 01:16:59

回答

1

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

当然,如果您只保护运动中的数据,事情会变得更容易。

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

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

+0

我可以将私钥嵌入二进制文件吗? 我确信这已经完成,并且有一个已知的简单过程来做到这一点。我只是无法在谷歌或这里找到它:( – user355008 2010-06-01 03:26:33

+0

通过在十六进制编辑器中查看二进制文件来查找关键字可能很简单 – egrunin 2010-06-01 04:35:02

+1

@ user355008:将某个关键字嵌入到某个东西中将无济于事。 – dreamlax 2010-06-01 07:38:30

1

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

+2

这将如何防止攻击者重新计算校验和? – WhirlWind 2010-06-01 02:43:09

+1

在你分享的wiki页面上,他说:“Adler-32校验和可以很容易伪造,因此不安全保护免受故意修改“,所以我不认为这会起作用,谢谢 – user355008 2010-06-01 03:22:57

+2

我不知道所需的安全级别,所以我写了”像adler-32之类的东西“,甚至可以使用adler-32 ,md5 128位或sha1哈希方法与salting,通过将自己的密钥添加到要加密的字符串。因此,将很难有人重新计算正确的校验和 – 2010-06-01 05:21:14

5

强制性序言:这里有多少利害关系?你必须假设篡改将是可能的,但如果你花费足够的时间和金钱,你可以使它变得非常困难。所以:你有多值得?

这就是说:

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

0

这是您的文件和允许修改它的程序。在这种情况下,有一个简单的解决方案。 (如果你能负担得起把你的日志文件到一个单独的文件夹)

注: 您可以放入一个单独的文件夹中的所有日志文件。例如,在我的应用程序中,我们有很多DLL,每个DLL都有自己的日志文件,而且课程应用程序有它自己的。

所以有在后台运行一个单独的进程,监视文件夹的任何更改的通知像文件大小

  • 变化
  • 试图重命名文件或文件夹
  • 删除文件 等...

根据此通知,您可以证明文件是否已更改! (当你和其他人可能会猜测,甚至是你的过程&的dll会改变这些文件也可能导致通知。你需要这个动作巧妙地同步。这就是它)

窗口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) 

如何让它工作?

嫌疑人:我们的过程

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

督察:我们创建监视的文件夹的过程。

Inpector看到该文件夹​​中的变化。与查询怀疑他一个是否做任何改变它。

如果是这样,

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. 使用压缩和非压缩机构(压缩可以帮助您使用密码保护的文件)

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

+1

对于第1点和第2点:很容易设置文件的修改时间,并更改文件的内容而不更改其长度。对于第3点和第4点:您必须明白,如果您的应用程序可以执行这些任务,那么用户也可以(仅仅通过模仿应用程序的功能)。 – dreamlax 2010-06-01 07:42:49

+0

@dreamlax:所有这些点只是为了给预期的用户提供一些洞察。我知道它全部都有环形孔。主要关注点是在这些愚蠢的数据上面提供的数据(如果你这样看的话)! – AKN 2010-06-01 08:49:53

1

这真的取决于你想要达到的目的,什么是利害关系和什么样的约束。

从根本上说:你所要求的只是普通的不能(单独)。

现在,这是一个让试图修改文件的人的生活变得复杂的问题,因此修改它比修改它们所能获得的更多。当然,这意味着黑客在你的保护措施中唯一目标的动机将不会被阻止太多...

假设它应该在独立的计算机上工作(没有网络),正如我所说,不可能。无论您使用哪种流程,无论使用哪种密钥/算法,这最终都会嵌入到二进制文件中,而二进制文件则暴露于对黑客的审查中。可以对它进行反汇编,可以用十六进制阅读器进行检查,也可以用不同的输入来检测它,插入一个调试器等等。你唯一的选择是通过分解逻辑来使调试/检查变得很痛苦,使用调试检测来改变路径,以及如果你使用自修改代码非常好。这并不意味着篡改这个过程将变得不可能,它只是意味着它应该变得足够困难,以至于任何攻击者都会放弃。

如果您有一个可供您使用的网络,您可以在远处(在您的控制之下)驱动器上存储散列,然后比较散列。 2个难点在这里:

  • 存储(?如何确保它是您的二进制)
  • 检索(如何确保你所谈论到正确的服务器?)

和当然,在这两个如果你需要安全,你需要咨询真正的专家,不要依赖一些奇怪的人(比如我自己)在论坛上发言。我们是业余爱好者。

相关问题