- 浏览: 1207015 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (718)
- HTML (13)
- JS基础 (23)
- JS应用 (40)
- AJAX (6)
- JSP相关 (12)
- JAVA基础 (52)
- JAVA应用 (74)
- APPLET (11)
- SWING\RCP (2)
- JAVA反射 (6)
- 设计模式 (26)
- 数据库设计 (20)
- Struts (35)
- Struts2 (12)
- Spring (22)
- Hibernate (45)
- Ibatis (18)
- mybatis (3)
- SSH (8)
- UML (5)
- WebService (3)
- XML (16)
- Log4j (7)
- WEB容器 (26)
- 数据结构 (36)
- Linux (34)
- Ruby on Rails (1)
- 其它技术 (27)
- IDE配置 (15)
- 项目实战 (2)
- Oracle (69)
- JAVA报表 (7)
- Android学习 (2)
- 博客链接 (1)
- 网络基础 (1)
- WEB集群 (1)
- .Net开发 (11)
- PB (4)
- 系统构建 (15)
最新评论
-
jnjeC:
牛逼啊哥们,讲得太好了
Maven仓库理解、如何引入本地包、Maven多种方式打可执行jar包 -
九尾狐的yi巴:
很好 感谢!
Itext中文处理(更新版) -
luweifeng1983:
有用的,重启一下嘛。
设置eclipse外部修改文件后自动刷新 -
Master-Gao:
设置了也不管用,怎么破呢?
设置eclipse外部修改文件后自动刷新 -
aigo_h:
锋子还有时间写博客,还是很闲哈!
Add directory entries问题
Java技术之所以在今天得到了如此广阔的应用,其中它的安全性是不能不提的。不同于其它技术(例如
Microsoft的ActiveX)中安全性作为附加设计和补丁,Java从设计之初便考虑到了安全性。因此Java的安全性是在语言层次实现的。
Java的安全性由下列三个方面保证:
1、 语言特性(包括数组的边界检查、类型转换、取消指针型变量)。
2、 资源访问控制(包括本地文件系统访问、Socket连接访问)。
3、 代码数字签名(通过数字签名来确认代码源以及代码是否完整)。
本文主要讨论结合后两种技术来实现超越Applet的安全限制。我们先来看一下这三个方面的具体实现。我们知道Java的原代码是先编译成为一种字节码
的中间代码,存放这种代码的文件就是.class的文件。真正执行的时候是将class文件装载到JVM(虚拟机)中,然后由JVM解释执行的。所以数组
的上下界检查及合法的类型转换是通过JVM得到保证的。
Java通过一个类装载器类(ClassLoader)将虚拟机代码文件(即
class文件)装载到JVM中,当完成装载后,一个被称做安全管理器(SecurityManager)的类开始运行,这就是上面描述的第二个方面的实
现。例如当一个Applet的class文件被缺省的类装载器装载到JVM中后,JVM会立即为它装载一个SecurityManager的子类
AppletSecurity,由这个管理器来验证操作。代码的所有动作(例如文件读写)都要先经过验证,只有被该安全管理器接受的动作才能完成,否则就
会抛出SecurityException异常。那么安全管理器类是怎么判断代码的权限的呢?这就是利用Policy文件。
对于
JDK1.0,权限被笼统的划分为两大块。一是拥有所有的权限,一个是仅拥有"沙箱"(sandBox)权限,这也是普通的Applet所拥有的权限。这
时本地文件读写或是与源主机(Orignal
Server)以外的主机连接都是被禁止的。这种划分的最大问题就是缺乏灵活性。例如我们希望一个Applet在用户信任的情况下能够对本地文件系统的某
个目录进行读写,但并不要通过Socket与其它主机连接。这是JDK1.0的权限划分就不能达到要求。JDK1.1后改进了权限的划分,引入了权限集
(PermissionSet)的概念。它细划了权限的放放面面,你可以有选择性的组合你需要的权限来达到特殊的要求。下图显示了这种划分:
图一中的BasicPermission还可以进一步细分为更多的细节权限,例如:AWTPermission、
RuntimePermission等等。Java通过一个后缀名为.policy的文件来组合这些权限。安装完JRE(Java Runtime
Environment)后有两个缺省的权限文件,它们是:
${java.home}/lib/security/java.policy
${user.home}/.java.policy
下面是一个java.policy文件的实例:
// Standard extensions get all permissions by default
grant codeBase "file:${java.home}/lib/ext/*" {
permission java.security.AllPermission;
};
// default permissions granted to all domains
grant {
// Allows any thread to stop itself using the java.lang.Thread.stop()
// method that takes no argument.
// Note that this permission is granted by default only to remain
// backwards compatible.
// It is strongly recommended that you either remove this permission
// from this policy file or further restrict it to code sources
// that you specify, because Thread.stop() is potentially unsafe.
// See "http://java.sun.com/notes" for more information.
permission java.lang.RuntimePermission "stopThread";
// allows anyone to listen on un-privileged ports
permission java.net.SocketPermission "localhost:1024-", "listen";
// "standard" properies that can be read by anyone
permission java.util.PropertyPermission "java.version", "read";
permission java.util.PropertyPermission "java.vendor", "read";
permission java.util.PropertyPermission "java.vendor.url", "read";
permission java.util.PropertyPermission "java.class.version", "read";
permission java.util.PropertyPermission "os.name", "read";
permission java.util.PropertyPermission "os.version", "read";
permission java.util.PropertyPermission "os.arch", "read";
permission java.util.PropertyPermission "file.separator", "read";
permission java.util.PropertyPermission "path.separator", "read";
permission java.util.PropertyPermission "line.separator", "read";
permission java.util.PropertyPermission "java.specification.version", "read";
permission java.util.PropertyPermission "java.specification.vendor", "read";
permission java.util.PropertyPermission "java.specification.name", "read";
permission java.util.PropertyPermission "java.vm.specification.version", "read";
permission java.util.PropertyPermission "java.vm.specification.vendor", "read";
permission java.util.PropertyPermission "java.vm.specification.name", "read";
permission java.util.PropertyPermission "java.vm.version", "read";
permission java.util.PropertyPermission "java.vm.vendor", "read";
permission java.util.PropertyPermission "java.vm.name", "read";
};
由上面的这个文件可以看出,所有policy文件的写法都是类似下面的格式:
grant codesource
{
permission_1;
permission_2;
}
其中permission_1代表一个具体的权限描述,这里我们只来看看关于文件权限的描述,其它的权限描述是类似的。
表1
写法
代表含义
file
一个指定的文件
directory/
一个指定的目录
dirctory/*
一个目录下的所有文件
dirctory/-
指定目录及子目录的所有文件
-
当前目录及子目录的所有文件
*
当前目录的所有文件
<<ALL FILES>>
整个文件系统
下面是几个具体的例子:
grant
{
permission java.io.FilePermission "<<ALL FILES>>" "read,write";
};
grant
{
permission java.io.FilePermission "<<${user.home/-} >>" "read,write,delete";
};
光有policy文件还是不够,客户无法判断现在执行的代码是否是由你发布的,也不能保证这个代码在传输的过程中有没有被人给恶意的破坏。所以还需要数字签名技术来保证这两方面。JDK中给我们提供了几个工具来完成这些工作。
结合这几种技术就可以达到本文的目的了,下面就是本文的目标代码,它是一个可以读取本地文件系统的Applet:
代码1
/-------------------------------------
package jcomponent;
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import java.io.*;
public class FileReaderApplet extends Applet {
boolean isStandalone = false;
TextField fileNameField;
TextArea fileArea;
file://Get a parameter value
public String getParameter(String key, String def) {
return isStandalone ? System.getProperty(key, def) :
(getParameter(key) != null ? getParameter(key) : def);
}
file://Construct the applet
public FileReaderApplet() {
}
file://Initialize the applet
public void init() {
try {
jbInit();
}
catch(Exception e) {
e.printStackTrace();
}
}
file://Component initialization
private void jbInit() throws Exception {
this.setSize(new Dimension(400,300));
this.setLayout(new BorderLayout());
Panel panel=new Panel();
Label label=new Label("File Name");
panel.add(label);
fileNameField=new TextField(25);
panel.add(fileNameField);
Button b=new Button("Open File");
b.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
loadFile(fileNameField.getText());
}
});
panel.add(b);
this.add(panel,BorderLayout.NORTH);
fileArea=new TextArea();
this.add(fileArea,BorderLayout.CENTER);
}
public void loadFile(String fileName){
try{
BufferedReader reader=new BufferedReader(new FileReader(fileName));
String context=new String();
while((context=reader.readLine())!=null){
fileArea.append(context+"/n");
}
reader.close();
}catch(IOException ie){
fileArea.append(ie.getMessage());
}catch(SecurityException se){
fileArea.append("because of security constraint ,it can not do that!");
}
}
file://Get Applet information
public String getAppletInfo() {
return "This is an applet can read and write the local file system";
}
}
如果你将这个代码嵌入网页中并执行它,当你试图打开一个本地文件时就会发生SecurityException。大家跟着我进行下面的步骤就可以最终拥
有读写文件的权限。在此之前你需要有以下的工具:JDK1.1以上、JRE、HTMLConvert。这些工具在SUN的Java站点上都有,而且也是免
费的。将它们分别安装好,我们将所有涉及的文件都放在c:/admin中。
步骤一:(打包class文件)
在命令行中执行以下的语句:jar -cvf MyApplet.jar class
注意这里的所有.class文件均是放在一个class的目录中的。本步骤执行完毕后,将在c:/admin中产生一个名为MyApplet.jar的文件。
步骤二:(在网页中嵌入Applet)
这个网页的名字叫做FileReaderApplet.html,下面是嵌入Applet部分的写法:
<APPLET
CODEBASE = "."
CODE = "jcomponent.FileReaderApplet.class"
ARCHIVE ="MyClass.jar"
NAME = "TestApplet"
WIDTH = 400
HEIGHT = 300
HSPACE = 0
VSPACE = 0
ALIGN = middle
>
</APPLET>
完成这个步骤后,这个Applet已经可以显示了。但是还不能读写本地的文件系统。
步骤三:(生成证书及签名)
请在命令行环境下执行以下的命令:
1、keytool -genkey -keystore pepper.store -alias pepper
这个命令用来产生一个密匙库,执行完毕后应该在c:/admin中产生一个pepper.store的文件,这里的pepper是我自己的名字,你可以对它进行修改。另外在执行命令的时候还有提示你输入密匙库的密码,这里你一定要记住,否则后面要用的时候无法输入。
2、keytool -export -keystore pepper.store -alias pepper -file pepper.cert
这个命令用来产生签名时所要用的证书,同样这里的pepper也可以换成你自己需要的名字。这个命令执行完后在c:/admin中产生一个pepper.cert的文件。
4、 jarsigner -keystore pepper.store MyApplet.jar pepper
这个命令用上面产生的证书将我们的jar文件进行了签名。
步骤四:(修改文件)
1、 在c:/admin中产生一个名为applet.policy的文件,其内容如下:
keystore "file:c: /admin/pepper.store", "JKS";
grant signedBy "pepper"
{ permission java.io.FilePermission "<<ALL FILES>>", "read";
};
这个文件让由pepper签名的Applet拥有本地所有文件的读权限。
2、 修改${java.home}/jre/lib/security目录下的java.security,找到下面这两行:
policy.url.1=file:${java.home}/lib/security/java.policy
policy.url.2=file:${user.home}/.java.policy
在下面添写第三行
policy.url.3=file:c: /admin/applet.policy
完成这个修改后我们在前面创建的applet.policy文件才有效。
步骤五:(转换html文件)
运行前面提到的HTMLConvert工具,将原有的FileReaderApplet.html转化成下面的形式:
<!--"CONVERTED_APPLET"-->
<!-- CONVERTER VERSION 1.3 -->
<OBJECT classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93"
WIDTH
= 400 HEIGHT = 300 NAME = "TestApplet" ALIGN = middle VSPACE = 0 HSPACE
= 0
codebase="http://java.sun.com/products/plugin/1.3/jinstall-13-
win32.cab#Version=1,3,0,0">
<PARAM NAME = CODE VALUE = "jcomponent.FileReaderApplet.class" >
<PARAM NAME = CODEBASE VALUE = "." >
<PARAM NAME = ARCHIVE VALUE = "MyApplet.jar" >
<PARAM NAME = NAME VALUE = "TestApplet" >
<PARAM NAME="type" VALUE="application/x-java-applet;version=1.3">
<PARAM NAME="scriptable" VALUE="false">
<COMMENT>
<EMBED
type="application/x-java-applet;version=1.3" CODE =
"jcomponent.FileReaderApplet.class" CODEBASE = "." ARCHIVE =
"MyApplet.jar" NAME = "TestApplet" WIDTH = 400 HEIGHT = 300 ALIGN =
middle VSPACE = 0 HSPACE = 0 scriptable=false
pluginspage="http://java.sun.com/products/plugin/1.3/plugin-
install.html"><NOEMBED></COMMENT>
</NOEMBED></EMBED>
</OBJECT>
<!--
<APPLET
CODE = "jcomponent.FileReaderApplet.class" CODEBASE = "." ARCHIVE =
"MyApplet.jar" WIDTH = 400 HEIGHT = 300 NAME = "TestApplet" ALIGN =
middle VSPACE = 0 HSPACE = 0>
</APPLET>
-->
<!--"END_CONVERTED_APPLET"-->
大家不要看到这里的写法很复杂,但是这些都是由HTMLConvert工具自动实现的。这个工具有命令行和图形界面两种运行方式。
好了,现在这个Applet可以运行读写文件的功能了。如果你要考虑在Internet上实现这个Applet,那么你也不需要在所有的客户端均做上面
的步骤,你只需要在你的服务器上创建一个目录,例如c:/admin,将这个目录映射为www.testApplet.com/admin。这里的
www.testApplet.com是一个假定的网址,将pepper.cert、pepper.store、
FileReaderApplet.html、MyApplet.jar以及applet.policy放在这个目录中,然后修改
applet.policy文件如下:
keystore "http:// www.testApplet.com/admin/pepper.store", "JKS";
grant signedBy "pepper"
{ permission java.io.FilePermission "<<ALL FILES>>", "read";
};
3、 而每个客户端仅仅需要修改一下它们的${java.home}/jre/lib/security目录下的java.security文件如下:
policy.url.1=file:${java.home}/lib/security/java.policy
policy.url.2=file:${user.home}/.java.policy
policy.url.3= http:// www.testApplet.com/admin/applet.policy
当然每个客户端还是需要安装JRE的,不过现在的浏览器安装时都已经自动安装了。
发表评论
-
JAVA Applet应用开发
2009-07-02 22:02 2489JAVA 编程思想第14章讲述APPLET使用 Java ... -
JAVA APPLET读本地文件权限问题及解决办法一
2009-07-07 09:16 2693http://hi.baidu.com/shiliangshu ... -
JAVA APPLET读本地文件权限问题及解决办法二
2009-07-07 10:03 1506http://www.chinabyte.com/200109 ... -
优化Java applets 加载过程
2009-07-07 15:24 1266http://www.chinabyte.com/200112 ... -
applet应用程序的数字签名应用实战
2009-07-07 15:33 1107http://www.iteye.com/topic/1545 ... -
JAVA APPLET签名
2009-07-07 15:37 928http://100air.iteye.com/blog/52 ... -
javascript与applet之间通讯一
2009-07-07 15:51 1154http://hgq0011.iteye.com/blog/6 ... -
javascript与applet之间通讯二
2009-07-07 15:53 1053http://fanqiang.chinaunix.net/a ... -
javascript与applet之间通讯三
2009-07-07 15:55 1060http://www.matrix.org.cn/resour ... -
javascript与applet之间通讯四
2009-07-07 15:57 1253调用方法如下: 1 首先引入JSObject 包 ...
相关推荐
利用数字签名超越Java Applet的安全限制
压缩包里面word文件说明了使用JavaApplet时客户端运行jar包的生成方法及如何数字签名,JavaAutoPlug.exe是帮助我们完成打包和签名的一个工具,需安装Framework2.0。
对Java Applet和Java Web Start进行数字签名
Java的线程和Java AppletJava的线程和Java AppletJava的线程和Java AppletJava的线程和Java AppletJava的线程和Java Applet
java applet 数字签名按步骤添加策略文件可以解决applet在浏览器中访问本地的安全问题
Java+Applet实例讲解(分为1和2两部分)、Java+Applet实例编程、java+Applet登录、JavaApplet教程.pdf、JAVA_applet应用实例.ppt、JavaApplet编程技巧实例专辑、javaapplet例子.doc、Applet类.doc等教程。...
详细讲解了applet的签名过程,自己亲自试过
一些JavaApplet小程序应用源码例子集,包括小应用程序与应用程序组合、在Applet中弹出窗口、通过HTML文件向Applet传递参数、swing的使用等。
JavaApplet与JavaScript的使用
简单的java applet图像移动重画实例,简单的java applet图像移动重画实例
关于JAVA Applet 的小程序 使用的时候请写一个HTML文档
javaapplication和javaapplet的区别
代码清晰明了,案例浅显易懂,让你1分钟了解java applet 。
阳光酒店管理系统(javaapplet+SQL)阳光酒店管理系统(javaapplet+SQL)阳光酒店管理系统(javaapplet+SQL)阳光酒店管理系统(javaapplet+SQL)阳光酒店管理系统(javaapplet+SQL)阳光酒店管理系统(javaapplet+SQL)阳光酒店...
java Application与java Applet的区别
Applet使用简介 内容包括如何使用、嵌入标签问题、IE不支持Java2问题、数字签名问题等
Java Applet 入门教程
经典Java applet程序设计 案例, Javascript操作Applet:实现文字对齐方式的实例 简单Applet实例 图像处理 为Applet传递参数:实现滚动字幕的实例
Java Applet小程序的数字签名和客户端认证
Java Applet实例编程