我要分析一个小java自检程序这里是示例

public class tamper {
      public static int checksum_self () throws Exception {
          File file = new File ("tamper.class");
          FileInputStream fr = new FileInputStream (file);
          int result;                   // Compute the checksum

          DigestInputStream sha = new DigestInputStream(fr, MessageDigest.getInstance("SHA"));
   byte[] digest = sha.getMessageDigest();

    int result = 12  // why???
    for(int i=0;i<=digest;i++)
     {
     result = (result + digest[i]) % 16 /// modulus 16 to have the 16 first bytes but why ??
    }

    return result;
      }

      public static boolean check1_for_tampering () throws Exception {
            return checksum_self () != 10;
      }

      public static void main (String args[]) throws Exception {
          if (check1_for_tampering ()) {
            System.exit (-1);
          }

      }
}
但我真的不明白为什么要做一个 mod 16 并把 result = 12 ?

最佳答案

可能是因为没有模数就很难嵌入校验和。假设您已经编写了程序。您可以一次编写所有内容,但要获得正确的校验和,您必须进行实验。

让我们假设您编写校验和模 4。一开始您将值与 0 进行比较。您运行程序,但它检测到它被篡改。为什么?因为在编写完整的源代码之前,您不知道校验和。并且由于校验和值嵌入其中,源代码的每次更改都会更改校验和。

所以这就像一条狗追着自己的尾部。或者一条蛇吃自己的尾部。从技术上讲,这是一种带有反馈回路的动态系统的情况。好了,类比就够了。

让它发挥作用的唯一方法是实验。从校验和等于零开始并编译。它很可能会识别出它被篡改(不正确),因为您有大约 1/4 的概率(因为任何取模 4 的值都可以有 4 个值)来正确猜测。接下来将值更改为 1。如果它不起作用,则更改为 2,最后更改为 3。

其中之一可以匹配,但具有较低的模值会降低检测到篡改的可能性。所以值 16 基本上是一个折衷。您希望将模值保持在尽可能低的水平,以便进行合理的少量猜测。另一方面,您希望算法通过具有高模值来完全防篡改。

关于Java自校验程序(自动校验),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4587835/

10-11 11:00