您的位置:首页 > 编程语言 > Java开发

在java中如何实现jar包的代码签名?

2012-12-27 14:50 447 查看
这一节,以实践为主,在跟着我做相应的操作之前,我希望你已经能够理解笔记七所提到的概念,至少你应该对于笔记七的那个大图有所了解。

好了!对于习惯用ecplise的朋友今天不得不逼迫你把jdk的环境搭建出来!下面让我们动手来实践一下对jar进行签名吧!

第一步,首先配置jdk的环境变量,如果你的电脑已经配置了,那直接跳过这一步

path=%JAVA_HOME%/bin

JAVA_HOME=C:/Java/jdk1.6.0_01

CLASSPATH=.;%JAVA_HOME%/lib/dt.jar;%JAVA_HOME%/lib/tools.jar

配置要这几个jdk的环境参数,好了,配完了,试着在cmd里跑一下java,javac,看看命令是否生效,如果配置成功执行第二步。

第二步,来写几个简单的类,简单的才是大家的。你完全可以直接copy我的代码,部分看不懂,忽略它,做实验而已,对那个jar文件签名不是签,这个例子的代码逻辑是后面才用到的,不用读

第一个类Doer

package com.yfq.test;

public abstract interface Doer {

void doYourThing();

}

第二个类

package com.yfq.test.friend;

import java.security.AccessController;

import java.security.PrivilegedAction;

import com.yfq.test.Doer;

public class Friend implements Doer{

private Doer next;

private boolean direct;

public Friend(Doer next,boolean direct){

this.next=next;

this.direct=direct;

}

@Override

public void doYourThing() {

System.out.println("Im a Friend");

if (direct) {

next.doYourThing();

} else {

AccessController.doPrivileged(new PrivilegedAction() {

@Override

public Object run() {

next.doYourThing();

return null;

}

});

}

}

}

第三个类

package com.yfq.test.stranger;

import java.security.AccessController;

import java.security.PrivilegedAction;

import com.yfq.test.Doer;

public class Stranger implements Doer {

private Doer next;

private boolean direct;

public Stranger(Doer next, boolean direct) {

this.next = next;

this.direct = direct;

}

@Override

public void doYourThing() {

System.out.println("Im a Stranger");

if (direct) {

next.doYourThing();

} else {

AccessController.doPrivileged(new PrivilegedAction() {

@Override

public Object run() {

next.doYourThing();

return null;

}

});

}

}

}

好了,编译一下,用强大的ecplise来编译,项目-右键-Build Project(工具是拿来用的,不要浪费这些强大的功能!)

第三步,打jar包,用ecplise就可以了就有导出jar包的功能,我还是那句老话,有工具不用,不是牛,是蠢。

步骤一,项目-右键-Export-java-JAR file-next

步骤二,展开目录清单-分别对com.yfq.tes.friend和com.yfq.test.stranger打包(friend.jar,stranger.jar),放到哪里就随便你了,只要你记得就好,我这里假设是放在d盘的根目录下

第四步,用java的keytool生成密钥对,用java的jarsigner做签名(记得笔记七我们说过对hash摘要的加密是非对称加密的吗?这里就需要两把不同的钥匙啦),一步步跟我来。

步骤一,cmd窗口,进入到存放friend.jar和stranger.jar的目录下,假设我的jar文件放在d盘下,直接输入盘符d:就可以了。

步骤二,在cmd窗口中输入keytool -genkey -alias friend -keypass friend4life -validity 10000 -keystore ijvmkeys

生成第一个密钥对,这个密钥对的别名是 friend,查看密钥对所需要的密码是friend4file,密钥对的过期时间是10000天,密钥对存储的文件名ijvmkeys

而查看ijvmkeys的密码我们设置为ijvm2ed





步骤三,在cmd窗口输入,keytool -genkey -alias stranger -keypass stranger4life -validity 10000 -keystore ijvmkeys

按照步骤2的截图,一步一步输入吧,这个步骤是生成别名为stranger的密钥对。

好了密钥对生成结束,看看你的jar文件目录下有没有多出一个文件ijvmkeys,是滴,这里生成了一个用于存放密钥对的文件。

步骤四,对jar进行摘要并对hash摘要进行加密生成签名,放置到jar文件结构的尾部

在cmd窗口输入

jarsigner -keystore ijvmkeys -storepass ijvm2ed -keypass firend4file friend.jar friend

jarsigner -keystore ijvmkeys -storepass ijvm2ed -keypass stranger4file stranger.jar stranger

步骤五,查看生成的密钥文件,在cmd窗口输入keytool -list -v -keystore ijvmkeys -storepass ijvm2ed





查看上面最后一个截图,我们来验证一下在笔记七里说过的话。

1.我们说过hash摘要是一个128的值,对不对呢,看证书指纹那一行,md5:…

你数一数总共有几个十六进制数,32个,一个十六进制数用4个位可以表示完,那么总共是几位,32*4=128,但是后面还有一个sha1的,怎么回事他貌似不止128位,是滴,散列函数多种多样,到底用那个散列函数,md5还是sha1这个就看你喜欢,而要使用哪个散列函数是可以指定的,keytool的参数-keyalg "DSA",这个参数就是用来指定用什么散列算法的,默认的就是DSA,普通的128位散列数已经是安全的了。

2.在 笔记七中,记不记得最下面那个图,有一个认证机构会对解密签名(被加密的hash摘要)的公钥做认证(也就是加密公钥),并发布证书,我们这里没有认证机构,你有没有这个疑问?

keytool程序在生成密钥时,总是会生成一个自签名证书(自签名是指:如果附近没有认证机构,可以用私钥对公钥签名,生成一个自签名证书)

本文出自 “网络侠客” 博客,请务必保留此出处http://jaiaiifh.blog.51cto.com/5069434/1102110
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: