如何检查Java二进制文件(WAR / JAR)是否来自给定的源代码

时间:2018-10-10 12:36:19

标签: java

是否可以检查给定的Java二进制文件是否已使用给定的源代码进行编译。

当前,我有一个由供应商构建的项目(WAR文件)。这个项目的源代码将在几个月后发布,但是我的上司问我如何知道我们在生产中部署的WAR文件是否由将来将提供给我们的源代码生成。

供应商建议使用pkgdiff,但我不确定这是否检查方法的实现,而不仅仅是方法签名。

任何人都可以建议任何方法或工具以确保给定的源代码是用于制作二进制文件(Java WAR文件)的方法或工具

我也读过这个问题How to check if binaries are built from particular sources是接受的答案是100%确定的唯一真实选择吗?

谢谢。

1 个答案:

答案 0 :(得分:0)

尝试解压缩war文件并使用javap工具,比较每对.class文件输出的MD5校验和

javap -sysinfo orig/src/com/example/ClassA.class local/src/com/example/ClassA.class | grep MD5
MD5 checksum abd302fa751dd9a6e86b18674397140a
MD5 checksum abd302fa751dd9a6e86b18674397140a

已编译代码的校验和应该相同。 使用shell脚本,您可以执行以下操作:

javap -sysinfo ../ClassA.class ClassA.class | \
gawk 'BEGIN{ RS="^[}]$"; FS="\n" } { if(NR == 1){ md1=$3; cn=$1} }; END{ if($3 == md1){print "OK!",cn,md1,$3} else{ print "Failed",cn,md1,$3 }}'

结果:

OK! Classfile /home/luis/tmp/ClassA.class   MD5 checksum abd302fa751dd9a6e86b18674397140a   MD5 checksum abd302fa751dd9a6e86b18674397140a

或者登录失败:

Failed Classfile /home/luis/tmp/ClassA.class   MD5 checksum abd302fa751dd9a6e86b18674397140a   MD5 checksum abd302fa751dd9a6e86b18674397140a