当前位置:  技术问答>java相关

Applet的权限问题

    来源: 互联网  发布时间:2015-03-04

    本文导语:  包含Applet的HTML文档就在本地机器上的,如何获得全部权限? 在JRE下好像有个Policy文件可以指派权限,但是我不想让用户去编辑这个文件 在Internet上情况又如何呢? 能不能自己给代码签个名,在浏览带APPLET的网页时...

包含Applet的HTML文档就在本地机器上的,如何获得全部权限?
在JRE下好像有个Policy文件可以指派权限,但是我不想让用户去编辑这个文件
在Internet上情况又如何呢?

能不能自己给代码签个名,在浏览带APPLET的网页时让用户选择是否信任呢?


|
 

用JAVA做数字签名

 

康帕斯(中国)国际信息服务有限公司 马文骞

 

数字签名常被用来校验软件及软件制造者,以保证软件代码没有被任何方式

玷污。

或者通俗地讲,使用数字签名可以确保软件的“清洁”和“正宗”,即软件

从其制造者或出版商处直到最终用户手中这段时间里未被他人篡改过。

本文在对数字签名的有关概念进行简单回顾后,给出了用JAVA来创建和使用

数字签名的具体方法。

一、数字签名及其功能

数字签名算法(DSA) 是“公共密钥加密算法”中的一种,因此让我们从

“私有密钥/公共密钥”开始进行简单回顾。

1. 私有密钥加密及其局限性

私有密钥加密系统使用唯一的密钥(即私有密钥)进行加密和解密。该密钥

必须为发送者和接收者所共享。即,若甲要向乙发一个加密邮件,甲需用一密钥

将信息加密;乙收到邮件后,须用同样的密钥将信息解密。

该方法显然有非常严重的缺点。例如,接收双方必须拥有同样的密钥,这要

求一定要有一种安全的协议来保证密钥传送的可靠;第二,有紧急的加密消息需

要发送时,可能因接收方没有密钥而不能完成传送;第三,若要将消息发给许多

不同的团体,就需要与各个团体对应,维护许多不同的密钥。

为克服私有密钥加密系统的这些弱点,人们引进了公共密钥加密系统。

2. 公共密钥加密

公共密钥加密不需要一条信息的发送者和接收者知道对方的密钥,就能访问

该加密信息。

公共密钥加密系统使用密钥对(公共密钥和私有密钥)来加密和解密信息。

其加密思想也非常简单:用公共密钥加密的信息只能用与之对应的私有密钥解开;

而用私有密钥加密的信息,任何拥有与之对应的公共密钥的人均可解开。因此,私

有密钥总为个人保管而无须外传,公共密钥则可授权给他人使用而不会破坏安全

性,公共密钥和私有密钥之间永远存在着一对一的关系。具体地讲即:

第一,若信息是用接收方的公共密钥加密的,则只有应该收到此消息的人

才能对之解密(即只有拥有与该公共密钥对应的私有密钥的人才可解密)。例如,

甲要向乙发一个加密邮件,甲必须用乙的公共密钥加密信息后再传给乙。

第二,若信息是用发送方的私有密钥加密的,则任何拥有发送方公共密钥的

接收者都可以对信息进行解密,从而确定该信息确实是来自该发送者,并且信息

内容未遭到任何无意或恶意的破坏。

上述第二点正是数字签名的含义。

3. 数字签名的功能

一个数字签名是一个定长的二进制数字流,其内容附着于被签名的数据之上。

它可以和任何种类的数字数据一起使用,除最普通的代码软件外。还可用在口令、

电子邮件及电子文档中。数字签名的主要功能为:防止原始文档被污染或变更;

防止别有用心者使用他人名字散布欺骗性消息;以及,提供谁是文件原作者的证

据,等等。

二、用JAVA创建及使用数字签名

除了上面提到的功能外,用JAVA做数字签名还有更现实的意义。最常见的是:

应用数字签名可以突破浏览器在安全性方面的某些限制。例如,你的浏览器一般

会拒绝网上的JAVA程序读写你本地硬盘的文件或获取你的本地信息(如你的用户

名称等),哪怕你确认该JAVA程序是“可靠的”(其实你不可能完全确认来自网

上的某个程序真的是“可靠的”)。若你确要运行该JAVA程序,你必须关闭浏览

器的安全检查功能,但这无异于将本地系统置为“不设防的城池”。使用数字签

名可完美地解决这个问题:当浏览器“感觉”到你使用的是签名后的JAVA小程序后,

它会自动搜索与之匹配的数字签名并进行校验,若成功则浏览器认定该JAVA小程序

是“值得信任的”,于是放行。这样,既保证了安全性,又可以让真正“可信的”的JAVA程序拥有许多特权(见下述JAVA程序)。

在 JDK1.1 中,与数字签名有关的工作是由工具程序 javakey 来完成的。

javakey 是 Sun 提供的一个命令行工具,用来为存档文件(jar 文件)生成数

字签名并管理密钥数据库。

下面我们将通过一个具体例子来看一看创建和使用数字签名的步骤,有关概

念和解释将在例子中给出。

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 ", 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)。



 Java Security Example: MyApp

 Java Security Example: My Application 









Here's the source. 



/* 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 的内容如下:



 Java Security Example: MyApp,signed

 Java Security Example: The Signed Application 









Here's the source. 



/* End of signMyApp.html */

现在,我们终于看到了期待已久的结果:浏览器打出了“Your Name has

been written to file ”;而文件“Test.Txt”确实被创建,并且

其内容正是用户登录 Win95/98 时的名字:

Y o u r N a m e : M a w e n q i a n 


    
 
 

您可能感兴趣的文章:

  • APPLET在运行的时候有权限限制吗,如果有应该怎样接触?
  • php iis7站长之家
  • @@@@@applet如何更改本地访问权限??
  • applet的权限问题,请高手帮忙
  • 关于applet的打印问题,用administrator权限仍然无法打印。(内详)
  • Applet问题,applet在tomcat+apache环境下是否支持FileDialog类,急,急 !!!!快来抢分呀!!!!
  • applet与jsp通讯问题:applet为何不能正确显示网页?
  • applet在jbuilder环境下没问题,用ie调用出applet can't be instantiated,什么原因呢?
  • 最简单的applet问题
  • 我用JBuilder写了一个applet,在IE中能正常显示。奇怪的是我再给该applet加一个控件(awt的label),编译运行没有问题,可是在IE中没有显示后来加的那个label。请各位高手指教!!!
  • 关于jbuilder中的applet问题??20分
  • 一定给分!!!applet的问题
  • 关于APPLET执行问题!
  • 还是applet的socket的问题,请多指教。
  • 关于APPLET参数的的问题
  • 关于applet的一个问题!
  • applet小问题,我却不能搞定
  • 代码中嵌入<APPLET>标记的问题
  • Applet嵌入网页问题
  • 一个Applet的问题
  • applet密码验证的问题?
  • 关于applet与servlet交互访问数据库的问题?
  • applet发布的问题,高人看过来
  • applet插入jsp后出现了问题.
  • 关于在applet中使用窗口的问题:
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • java命名空间java.applet类applet的类成员方法: applet定义及介绍
  • 如何让Applet里的控件随着Applet大小改变而一直占满整个Applet呢?
  • java命名空间java.applet类applet.accessibleapplet的类成员方法: applet.accessibleapplet定义及介绍
  • 对applet坐数字签名后,如果重新用jar对applet打包,需要重新做applet数字签名吗?
  • java命名空间java.applet类applet的类成员方法: getappletcontext定义及介绍
  • 为什么我的applet编译完,之后除了applet1.class之外,还有一个applet$1.class?
  • java命名空间java.applet类applet的类成员方法: getappletinfo定义及介绍
  • 急,我想问一下调用一个对话框的命令语句,比方说我已建立了一个Applet2,接下来该如何在Applet1中点击一个按钮来打开这个Applet2.谢谢
  • java命名空间java.applet类applet的类成员方法: isactive定义及介绍
  • 如何让IE认识applet所带的数字签名,而不是让证书仓库认识这个带数字签名的applet,就是说不装jdk也可以在IE里面使用带有签名的applet,详情请进
  • java命名空间java.applet类applet的类成员方法: stop定义及介绍
  • 请问application (or applet)如何实现对applet 小程序的调用??
  • java.applet类applet的类成员方法: getcodebase定义及介绍
  • 请问能在浏览器调入APPLET后,在APPLET内部改变其自身的大小嘛?
  • java命名空间java.applet类applet的类成员方法: init定义及介绍
  • applet 如何启动新的 applet
  • java命名空间java.applet类applet的类成员方法: destroy定义及介绍
  • 如何把applet窗口里的Java Applet Window去掉?
  • java命名空间java.applet类applet的类成员方法: getparameterinfo定义及介绍
  • Applet对本地资源是不能访问的,那如果我要用Applet做打印设计,那如何是好呢??
  • java命名空间java.applet类applet的类成员方法: getdocumentbase定义及介绍
  • Applet中的ArrayList怎么传到javascript中,反之,js中的数组如何传入APPLET中?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3