验证 Jar 签名在 Java 中不起作用
Verifying Jar signature doesn't work in Java
我有一个包含以下内容的签名 Jar zip:
- META-INF,包含 MANIFEST.MF、SERVER.RSA 和 SERVER.SF
的目录
- image.bin
之后,我通过向 image.bin 添加几个字符创建了一个篡改的 Jar 文件。我用
测试了它
jarsigner -verify jar.zip
给出了错误的错误
jarsigner: java.lang.SecurityException: SHA1 digest error for image.bin
这是意料之中的。
现在我需要在 Java 中以编程方式验证此 Jar zip,并且有一个示例 here。基本上它只是打开一个 Jar 文件,遍历条目并检查 SecuirtyException。但是,它没有给出任何 SecurityException。我想知道我在这里可能会错过什么。
我在 grepcode 上 read the source of jarsigner,对答案的以下修改似乎给我一致的结果:
import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
/** @see */
public class Verify {
public static void main(String[] args) throws IOException {
System.out.println(verify(new JarFile(args[0])));
}
private static boolean verify(JarFile jar) throws IOException {
Enumeration<JarEntry> entries = jar.entries();
while (entries.hasMoreElements()) {
JarEntry entry = entries.nextElement();
InputStream is = null;
byte buffer[] = new byte[8192];
try {
is = jar.getInputStream(entry);
int n;
while ((n = is.read(buffer, 0, buffer.length)) != -1) {
}
} catch (SecurityException se) {
return false;
} finally {
if (is != null) {
is.close();
}
}
}
return true;
}
}
即如果您阅读条目的内容,它将触发检查。
我有一个包含以下内容的签名 Jar zip:
- META-INF,包含 MANIFEST.MF、SERVER.RSA 和 SERVER.SF 的目录
- image.bin
之后,我通过向 image.bin 添加几个字符创建了一个篡改的 Jar 文件。我用
测试了它jarsigner -verify jar.zip
给出了错误的错误
jarsigner: java.lang.SecurityException: SHA1 digest error for image.bin
这是意料之中的。
现在我需要在 Java 中以编程方式验证此 Jar zip,并且有一个示例 here。基本上它只是打开一个 Jar 文件,遍历条目并检查 SecuirtyException。但是,它没有给出任何 SecurityException。我想知道我在这里可能会错过什么。
我在 grepcode 上 read the source of jarsigner,对答案的以下修改似乎给我一致的结果:
import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
/** @see */
public class Verify {
public static void main(String[] args) throws IOException {
System.out.println(verify(new JarFile(args[0])));
}
private static boolean verify(JarFile jar) throws IOException {
Enumeration<JarEntry> entries = jar.entries();
while (entries.hasMoreElements()) {
JarEntry entry = entries.nextElement();
InputStream is = null;
byte buffer[] = new byte[8192];
try {
is = jar.getInputStream(entry);
int n;
while ((n = is.read(buffer, 0, buffer.length)) != -1) {
}
} catch (SecurityException se) {
return false;
} finally {
if (is != null) {
is.close();
}
}
}
return true;
}
}
即如果您阅读条目的内容,它将触发检查。