下面我们将通过一个具体例子来看一看创建和使用数字签名的步骤,有关概
念和解释将在例子中给出。
1. Java 程序及数字签名的创建 (加密方或签字者应执行的步骤)
下面的JAVA小程序非常简单,它的主要功能为:获取 Win95/98系统当前登录
用户的名称字符串,然后将之写入本地硬盘当前目录的 Test.Txt 文件上。
import java.awt.*;
import java.io.*;
import java.lang.*;
import java.applet.*;
public class MyApp extends Applet {
DataOutputStream out_file;
public void paint(Graphics g) {
try {
String YourName = System.getProperty("user.name");
out_file = new DataOutputStream(new FileOutputStream("Test.Txt"));
out_file.writeChars("Your Name: "+YourName+"\n");
out_file.close();
g.drawString("Your Name has been written to file <Test.Txt>", 20, 20);
}
catch (IOException e) {
g.drawString("File i/o error", 12, 12);
}
catch (SecurityException se) {
g.drawString("You can NOT write to disk or get User Name.", 12, 12);
}
}
}
// End of MyApp.java
将 MyApp.java 编译为 MyApp.class 后,用下面的 MyApp.html 送往浏览器
(命令为 appletviewer MyApp.html)。
<html>
<title> Java Security Example: MyApp</title>
<h1> Java Security Example: My Application </h1>
<p>
<applet code=MyApp.class width=500 height=200>
</applet>
<p>
Here's the <a href=MyApp.java>source</a>. 
<p>
/* End of MyApp.html */
我们发现浏览器上显示的是“You can NOT write to disk or get User Name”。
这是因为获取用户名和写本地硬盘均是系统安全特性所禁止的。
下面我们创建一个数字签名,以便该程序的使用者无须变更浏览器的安全检查
特性就能完成程序功能(即:读用户名,写入文件)。
第一步:创建一个实体,并将之设为“可信的”。
javakey -cs Kompass true
此处的实体是指签字者(个人、公司或组织),这里假定为“Kompass”。参
数“-cs”告诉 javakey创建一个签字者并将之放入数据库中(不带参数运行javakey
 
将得到详细帮助信息)。可选参数“true”表示签字者“Kompass”是“可信
的”(缺省值是“不可信”)。
第二步:生成密钥对(公共密钥和私有密钥)并输出至文件(可选)。
javakey -gk Kompass DSA 512 Kompass_pub Kompass_priv
其中“DSA”是加密算法的名字,“512”是密钥的长度,“Kompass_pub”、
“Kompass_priv”分别是两个密钥输出文件的名字。
第三步:生成一个许可证(certificate)。
javakey -gc cert_directive_Kompass
这里的许可证即为可以交给接收方的数字签名。
上面的参数“cert_directive_Kompass”并不是输出文件名,而是一个缺省
参数配置文件名。通俗地讲,它象是一个“.ini”文件,javakey 根据该文件的
内容决定如何生成一个许可证。因此,签字者在执行本步骤之前必须用文本编辑
器先生成这个配置文件(学名叫指示文件--directive file)。
以下给出文件 cert_directive_Kompass 的内容:
issuer.name=Kompass
issuer.cert=1
subject.name=Kompass
subject.real.name=Kompass
subject.org.unit=JavaSoft 
subject.org=Sun MicroSystems
subject.country=US
start.date=31 May 1999
end.date=30 May 2012
serial.number=1001
out.file=Kompass.key
/* End of cert_directive_Kompass */
从上面最后一行可以看出,输出文件的名字被定义为“Kompass.key”,即:
数字签名“Kompass.key”连同签字后的文件将一同被发给接收者。
上述文件包括的其它信息主要有:发行者信息(issuer)、主题信息
(subject)、许可证信息(有效期限及序列号)等。
第四步:创建存档文件( jar 文件)。
jar cf signMyApp.jar MyApp.class MyApp.html
这里需要说明的是,jar是 Sun提供的另一个命令行工具,用于生成和维护
存档文件( .jar 文件)。 jar是一个打包工具,它可将JAVA小程序连同有关的
声音、图像、动画等文件一起打包成一个文件以便于JAVA产品的发布和传输。与
WinZip等工具一样, jar在打包时也能对文件进行压缩。有关 jar的详细信息可
参阅 Sun的有关资料。
上述命令的功能是将文件“MyApp.class”与“MyApp.html”打包为存档文件
“signMyApp.jar”。
之所以需要本步操作,是因为 javakey只能对存档文件进行签名。
第五步:对存档文件进行签名。
javakey -gs sign_directive_Kompass signMyApp.jar
与上面第三步一样,“sign_directive_Kompass”也是一个配置文件(指示
文件),用来告诉 javakey如何对文件进行签字。“sign_directive_Kompass”
的内容如下:
signer=Kompass
cert=1
chain=0
signature.file=KpsSig
/* End of sign_directive_Kompass */
第六步:更改文件名。
ren signMyApp.jar.sig signMyApp.jar
我们注意到上面第五步的配置文件中未指定输出文件名。这种情况下 javakey
 
在被签文件的名字后面加上“.sig”作为输出文件名。
若要指定输出文件,应在“sign_directive_Kompass”中加入一行:
out.file=signMyApp.jar
至此,我们完成了数字签名的工作。将“Kompass.key”(数字签名)和
“signMyApp.jar”(签名后的文件)传给使用者即可。
2. 数字签名的使用 (解密方或使用者应执行的步骤)
第一步:得到许可证(即数字签名 -- Kompass.key)和签名后的文件。
第二步:创建签名者实体,并将之设为“可信的”。
javakey -c Kompass true
第三步:将许可证倒入数据库。
javakey -ic Kompass Kompass.key
最后一步:运行JAVA程序。
appletviewer signMyApp.html
我们注意到这里的“.html”不是上面给出的“MyApp.html”。其实这二者
的差别很小,“signMyApp.html”只是多了一个参数:
archive="signMyApp.jar"
它告诉浏览器所有有用的文件(这里的 MyApp.class)均在存档文件中而不
在其它地方。
signMyApp.html 的内容如下:
<html>
<title> Java Security Example: MyApp,signed</title>
<h1> Java Security Example: The Signed Application </h1>
<p>
<applet code=MyApp.class archive="signMyApp.jar" width=500 height=200>
</applet>
<p>
Here's the <a href=MyApp.java>source</a>. 
<p>
/* End of signMyApp.html */
现在,我们终于看到了期待已久的结果:浏览器打出了“Your Name has
been written to file <Test.Txt>”;而文件“Test.Txt”确实被创建,并且
其内容正是用户登录 Win95/98 时的名字:
Y o u r N a m e : M a w e n q i a n 

解决方案 »

  1.   

    TO:jvlover
    javakey是一个文件吗?
    我得机器上Jdk没带这个文件那儿可以找到
      

  2.   

    不是的
    JAVAKEY要自己来创建的
    你可以看看上面的说明,其实我也没有试过,不过WIN2000的ADMINISTRATOR用户是不用数字签名的,呵呵
    别的就不知道了!
    其实我也不太懂,
    只是抛砖引玉!
      

  3.   

    to :andiyany
    javakey 是的个与数字签名有关的工具程序 。
    javakey 是 Sun 提供的一个命令行工具,用来为*.jar生成数
    字签名并管理密钥数据库。
      

  4.   

    to :andiyany
    javakey 是的个与数字签名有关的工具程序 。
    javakey 是 Sun 提供的一个命令行工具,用来为*.jar生成数
    字签名并管理密钥数据库。
      

  5.   

    我kao,大家见这里,这是互联网上最热的java数字签名的文章
    http://www.suitable.com/CodeSigningCodeExp.shtml#top