【问题标题】:Easiest way to sign/certify text file in C++?在 C++ 中签名/认证文本文件的最简单方法是什么?
【发布时间】:2011-02-26 04:14:34
【问题描述】:

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

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

【问题讨论】:

  • 为什么会有“gpgpu”标签? GPGPU 通常代表图形处理单元上的通用计算。是不是笔误?

标签: c++ encryption certificate pgp


【解决方案1】:

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

也就是说:

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

【讨论】:

    【解决方案2】:

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

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

    如果您能保护私钥,签署数据很容易。

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

    【讨论】:

    • 我可以将私钥嵌入到二进制文件中吗?我确信这已经完成了,并且有一个已知的简单过程可以做到这一点。我只是在谷歌或这里找不到它:(
    • 在十六进制编辑器中查看二进制文件可能很容易找到密钥。
    • @user355008:在某物内嵌入密钥无济于事。如果您的应用可以通过某种方式看到密钥,那么用户也可以。
    【解决方案3】:

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

    【讨论】:

    • 这将如何防止攻击者重新计算校验和?
    • 从您分享的 wiki 页面上,它说“Adler-32 校验和可以很容易地伪造,因此对于防止故意修改是不安全的”。所以我认为这行不通。不过还是谢谢。
    • 我不知道所需的安全级别,所以我写了“像 adler-32 之类的”。您甚至可以通过将您自己的密钥添加到要加密的字符串中来使用 adler-32、md5 128 位或带有加盐的 sha1 散列方法。因此,有人很难重新计算正确的校验和。
    • 当然,问题的核心是:您如何向客户隐藏密钥和加盐过程,因为它被打包在二进制文件中,因此提交给可能的反汇编检查? :p
    • @Matthieu M.:礼貌地请他们不要看 :)
    【解决方案4】:

    这实际上取决于您要实现的目标、风险和限制。

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

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

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

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

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

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

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

    【讨论】:

      【解决方案5】:

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

      注意: 您可以将所有日志文件放入单独的文件夹中。例如,在我的应用程序中,我们有很多 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.
      

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

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

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

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

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

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

      【讨论】:

      • 对于第1点和第2点:很容易设置文件的修改时间,在不改变文件长度的情况下改变文件的内容。对于第 3 点和第 4 点:您必须了解,如果您的应用程序可以执行这些任务,那么用户也可以(只需模仿应用程序的操作)。
      • @dreamlax:提供所有这些要点只是为了给目标用户一些见解。我知道所有这些都有循环孔。主要关注的是在那些愚蠢的(如果你这样看的话)点之上提供的数据!
      猜你喜欢
      • 2012-09-30
      • 1970-01-01
      • 1970-01-01
      • 2022-01-26
      • 2013-07-06
      • 2021-04-13
      • 2014-05-16
      • 2014-01-28
      • 2010-09-23
      相关资源
      最近更新 更多