我要分析一个小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/