gpt4 book ai didi

java - 验证 Jar 签名

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:16:33 25 4
gpt4 key购买 nike

我正在尝试以编程方式验证 jar 文件是否未被明显篡改。我有 2 个用例要防止。1)现有类的修改2)在jar中添加新类

我使用 jarsigner 对 jar 进行了签名。当我使用 jarsigner 验证上述任一情况时,它的工作方式与我预期的一样。

当我尝试使用中的示例以编程方式执行此操作时 How to verify a jar signed with jarsigner programmatically要么 How to verify signature on self signed jar?但是,我没有得到任何 SecurityExceptions ......或与此相关的任何异常。

不确定我做错了什么,因为这些片段似乎对其他人有用。有任何想法吗?这是 JDK 1.6 顺便说一句。

编辑:按照下面的要求,代码示例...提供您自己修改的 jar :)



 JarFile myJar;

尝试
{
//在这里插入jar的完整路径
字符串库路径 = ""
身材 = 新的 JarFile(libPath,真);

//现在真的不需要这个但是用它来检查 SHA1 哈希

InputStream = myJar.getInputStream(myJar.getEntry("META-INF/MANIFEST.MF"));
list 人 = myJar.getManifest();
is.close();

验证 jar (我的 jar );

}
catch (IOException IOE)
{
throw new Exception("无法加载 jar 文件", ioe);
}


private void verifyJar(JarFile jar) 抛出异常
{
枚举 entries = jar.entries();
while (entries.hasMoreElements())
{
java.util.jar.JarEntry entry = entries.nextElement();

尝试
{
jar.getInputStream(入口);

//还尝试实际从流中创建一个变量,以防它在验证之前丢弃它
//InputStream = jar.getInputStream(entry);
//is.close();
}
catch (SecurityException se)
{
/* 错误的签名 */
throw new Exception("签名验证失败", se);
}
catch (IOException IOE)
{
throw new Exception("无法加载 jar 文件条目", ioe);
}
}
}

最佳答案

使用下面的示例,我获得了正确签名的 JAR (true) 和更改的 JAR (false) 的预期结果。触发测试效果的一种简单方法是更改​​ META-INF/MANIFEST.MF 中列出的摘要之一。

请注意,此方法会忽略 list 中列出的条目。使用 jarsigner -verify 报告,“此 jar 包含未经完整性检查的未签名条目。”完全读取流后,entry.getCodeSigners() 可用于确定条目是否有任何签名者。

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();
try {
byte[] buffer = new byte[8192];
InputStream is = jar.getInputStream(entry);
while ((is.read(buffer, 0, buffer.length)) != -1) {
// We just read. This will throw a SecurityException
// if a signature/digest check fails.
}
} catch (SecurityException se) {
return false;
}
}
return true;
}
}

注意:对于 JDK 8,仅获取输入流是不够的。如 jarsigner ,也必须从中读取流。在上面的代码中,一个循环改编自 jar signer source获取输入流后添加。

关于java - 验证 Jar 签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5587656/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com