请教JAVA高手,我要替换一幅JAR文件里的GIF图片文件,关于JAVA的签名检验机制问题,分可以再加

cql0007 2003-08-20 03:09:48
我用了一个别的人JAR包,用的时候一切都正常.不过反编译的时候有很多CLASS反编译的不完整。在JAR里面用了一张图片,是GIF格式的。用WINRAR打开这个包可以看到那张图片的文件。
我现在想把这个图片换掉,换成另外一幅图片。可一换就出错(直接在WINRAR里换)。以前我这样做过都没问题的。
后来我解开后重新用JAR命令打包,之后也不对。

然后我发现在那个JAR文件里,有个meta-inf的目录,里面有三个文件,一个是.dsa,一个是.mf,一个是.sf。在.mf和.sf文件中,他有关于每个CLASS和图片文件的摘要:
Name: aa.class
SHA1-Digest: WJHADh2lNplBpU7Zt0g9vfU1rUY=
Name: c.gif
SHA1-Digest: Us08oNSFR4LIB6ELt7Hsk7jB1U8=
后来一查资料才知这是JAVA中的签名检验的问题,会检验每个JAR包里的文件,说是一用JAR命令就会产生这些,可我用JAR命令时产生的meta-inf目录中只有一个.mf的文件,而且只有如下内容:
Manifest-Version: 1.0
Created-By: 1.4.0 (Sun Microsystems Inc.)
不产生上面的那些信息了,请问有没有什么办法让我替换掉那JAR包中的GIF图片而让这个包不出错了?

出错的异常开始就是:SHA1-Digest: **********.开始两个单词和那个.mf文件中的一样的.
...全文
248 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
cql0007 2003-08-21
  • 打赏
  • 举报
回复
多谢楼上几位老兄,我现在就照着javahui的方法试一试,有问题再来麻烦各位了.
javahui 2003-08-21
  • 打赏
  • 举报
回复
对啊。就是说原来的签名已经无效,你不可能原来的签名了。否则就是伪造签名,哪里那么容易。
TomClus8888 2003-08-21
  • 打赏
  • 举报
回复
>我的图片文件的名字一样,大小一样,尺寸一下,他是根据什么来判断我已经是换了一幅图
>片而让我执行时出错了?
签名算法需要计算包中全部文件的所有字节才得出结果的,并不是简单的判断你所指的内容。
整套机制确保在执行包之前重新按照同样的算法进行字节校验,并将校验结果与签名
文件中的内容比较,相同则说明没有被串改,否则拒绝承认。
楼上的提供的办法其实是教你取出资源重新组合后用你的帐号来签名,
风险责任就从原发布者转移到你头上。
如果能这样就饶过签名机制,那要签名干什么?
TomClus8888 2003-08-21
  • 打赏
  • 举报
回复
>我的图片文件的名字一样,大小一样,尺寸一下,他是根据什么来判断我已经是换了一幅图
>片而让我执行时出错了?
签名文件只是保存你发布时候的验证结果,至于当前的实际结果则需要重新计算的,并且要根据新计算的结果与签名文件中的内容进行比较才得出是否被更改的结论。
尽管你的文件名字大小尺寸都相同,但是实际的数据不一致,根据签名算法计算的验证结果不同是很自然的。
解决办法是要么去掉原验证,楼上的已经给你指明啦,要么是不要替换,呵呵。如果这么容易就让你替换,还要签名干啥?

javahui 2003-08-21
  • 打赏
  • 举报
回复
CER文件和SPC文件是原来的数字签名生成的文件,已经无效,所以叫你把meta-inf目录删除掉。

然后剩下的class和图片文件就当成是你自己的文件,重新和你的文件一起进行签名。

签名方法--下面是我以前写的一个文档:


用JDK1.4开发数字签名的Swing Applet
1) 写代码
我们准备开发一个既是APPLET又是APPLICATION的程序,使得程序既能在浏览器中运行,直接双击JAR文件也可以运行。
程序界面采用了SWING控件,使用JInternalFrame来展示通过文件选择框指定的GIF或JPG图片。
程序文件:Jtest.java, ExampleFileFilter.java。
程序编译完成后,假定所有的class文件位于d:\myapplet下面。

2)生成jar文件
创建一个manifest.mf文件位于d:\myapplet下面,文件内容:
Manifest-Version: 1.0
Main-Class: Jtest
Created-By: 1.4.0-beta2 (Sun Microsystems Inc.)
执行命令:jar cvfm manifest.mf Jtest.jar *.class
则生成Jtest.jar文件,此时双击该文件即能以application的形式运行。

3)准备HTML文件
创建一个HTML文件Jtest.htm, 位于d:\myapplet下面,文件内容:
<HTML>
<HEAD>
</HEAD>
<BODY >
<CENTER>
<APPLET code= "Jtest.class" codebase= "." archive ="Jtest.jar" width= 0 height="0">
</APPLET>
</CENTER>
</BODY>
</HTML>
然后需要使用JDK1.4附带的HtmlConverter.exe转换Jtest.htm,使得浏览器能自动下载SUN的JRE1.4。
执行命令:htmlconverter Jtest.htm,生成的Jtest.htm自动包含了下载插件的代码。

4) 数字签名
首先是生成公/私密钥对:
keytool –genkey –alias yourname –keypass yourpassword
其中的yourname为密钥的别名,yourpassword为密码,按照提示输入签名信息。然后执行:

如果需要导出证书,则执行命令:
keytool –export –alias yourname –file yourname.cer
生成的yourname.cer即为证书文件。不过签名APPLET可以不需要这一步。

然后就是对JAR文件进行签名:
jarsigner Jtest.jar yourname
需要输入你在上面步骤中提供的密码。

至此签名已经成功。无论是直接打开Jtest.htm文件还是通过服务器下载Jtest.htm和Jtest.jar执行applet,首先会弹出一个提示框,如果用户点接受,则APPLET可以访问本地文件系统以及做其它事情,如果点拒绝则不能访问本地文件系统。当然,如果点总是接受,则以后运行同一个APPLET的时候不会出现提示,自动拥有权限。
cql0007 2003-08-21
  • 打赏
  • 举报
回复
非常感谢javahui老兄提供的方法,照着你的方法我重新签名了APPLET,而且改了图片后可以运行了.
不过小弟还有几个疑惑:
1、这种数字签名在JAVA的类文件里面不能管理它吗?也就是在包里面读它,一觉得它变了就不执行了,不然别人直接重新签名就可以了,好象这样的保护措施没什么很大的用啊?

2、那个.cer文件现在确实是可要可不要。但我原来的那个包它有两个文件,一个是cer,一个是spc的。为什么现在只有一个了,而且可以不要的。

3、数字签名是不是只是解决让客户端信任这个程序的问题?如果是,我只是用了签名的命,别的什么都没做,怎么就可以实现这个功能了?
我是第一次接触这方面的知识,还望各位老兄指点指点,再次感谢!
cql0007 2003-08-20
  • 打赏
  • 举报
回复
1、没错,我的JAR是用在APPLET中的。

2、请问 javahui兄,那个数字签名读的是文件的什么?我的图片文件的名字一样,大小一样,尺寸一下,他是根据什么来判断我已经是换了一幅图片而让我执行时出错了?
还有,我的那个JAR的运行一定要有数字签名的,如果去掉那个目录,也是出错?如果重新签名,是不是那个CER文件和SPC文件也要重做啊?我的是用在APPLET中,在IE中看的时候,首先会弹这个数字签名出来的。

非常感谢,我找了好久都没找到什么资料
javahui 2003-08-20
  • 打赏
  • 举报
回复
你解开以后替换图片再重新打包之前把生成的meta-inf目录删除掉。因为它已经没有用了。

至于签名本身对里面的CLASS文件和图片文件是不影响的。

然后需要的话对JAR重新签名。
nztech 2003-08-20
  • 打赏
  • 举报
回复
请问一下,这个jar是在applet下使用的吗?

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧