【问题标题】:How to check if Java binaries (WAR/JAR) are from the given source code如何检查 Java 二进制文件 (WAR/JAR) 是否来自给定的源代码
【发布时间】:2018-10-11 10:57:47
【问题描述】:

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

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

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

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

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

谢谢。

【问题讨论】:

  • 您是否考虑过让他们只提供源代码,然后您自己编译/部署?
  • 你的意思是说你在生产中部署了一些东西,而它不是一个固定(发布)的版本???
  • 你试过JD-GUI吗? jd.benow.ca
  • @Brian 嗨,感谢您的评论,很遗憾,目前还不可能,因为他们正在重新协商付款条件,并且在协商完成之前不会发布源代码。
  • 总是可以散列你当前的战争,然后当源发布时,编译新的源并散列它。如果两个哈希值匹配,您就有了他们的版本

标签: java


【解决方案1】:

尝试解压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

【讨论】:

    猜你喜欢
    • 2012-11-01
    • 2015-11-08
    • 2012-12-31
    • 1970-01-01
    • 2011-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    相关资源
    最近更新 更多