验证Jar签名在Java中不起作用

时间:2016-09-05 06:19:04

标签: java jar jar-signing

我有一个签名的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。我想知道我可能会错过这里。

1 个答案:

答案 0 :(得分:2)

我在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 http://stackoverflow.com/questions/5587656 */
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;
    }
}

即。如果您阅读条目的内容,它将触发检查。