- 浏览: 1240239 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (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 2529JAVA 编程思想第14章讲述APPLET使用 Java ... -
JAVA APPLET读本地文件权限问题及解决办法一
2009-07-07 09:16 2737http://hi.baidu.com/shiliangshu ... -
JAVA APPLET读本地文件权限问题及解决办法二
2009-07-07 10:03 1541http://www.chinabyte.com/200109 ... -
优化Java applets 加载过程
2009-07-07 15:24 1304http://www.chinabyte.com/200112 ... -
applet应用程序的数字签名应用实战
2009-07-07 15:33 1145http://www.iteye.com/topic/1545 ... -
JAVA APPLET签名
2009-07-07 15:37 965http://100air.iteye.com/blog/52 ... -
javascript与applet之间通讯一
2009-07-07 15:51 1186http://hgq0011.iteye.com/blog/6 ... -
javascript与applet之间通讯二
2009-07-07 15:53 1084http://fanqiang.chinaunix.net/a ... -
javascript与applet之间通讯三
2009-07-07 15:55 1090http://www.matrix.org.cn/resour ... -
javascript与applet之间通讯四
2009-07-07 15:57 1300调用方法如下: 1 首先引入JSObject 包 ...
相关推荐
总结来说,要超越Java Applet的安全限制,开发者可以为Applet的代码进行数字签名,然后配置Policy文件,赋予Applet特定的权限,如访问本地文件系统或特定网络资源。这种方式使得Applet可以在用户同意的情况下执行更...
在JavaApplet中,为了确保客户端能够安全地运行从网络下载的jar包,必须对Applet进行数字签名。这个过程包括以下步骤: 1. **生成密钥对**:使用如Keytool这样的工具生成一对密钥,包括一个私钥和相应的公钥。私钥...
Java Applet是早期Java技术的一...总的来说,Java Applet的数字签名是一个关键的安全措施,它结合策略文件共同确保了在浏览器环境中执行的Applet代码的安全性。理解这一过程对于开发和部署安全的Java Applet至关重要。
对Java Applet和Java Web Start进行数字签名
由于Applet可能来自不可信的网络源,因此Java引入了安全沙箱模型,限制了Applet的权限,如读写本地文件、访问网络资源等。这降低了恶意Applet对用户系统的潜在威胁。 六、JavaApplet的局限性与替代方案 随着Web...
- Java Applet可以直接利用浏览器提供的图形用户界面,无需额外编写GUI代码。 **4. 文件访问限制** - 为了安全考虑,Java Applet通常不允许直接访问本地文件系统,这意味着它不能进行文件的读写操作。 - 这种...
- 数字签名:为了突破安全限制,开发者可以对Applet进行数字签名,以增加信任度。 7. **Applet的替代技术** - JavaFX:Oracle推荐的现代Java GUI开发框架,提供更丰富的图形和媒体功能,支持桌面和Web应用程序。 ...
为了增强用户对Applet的信任并解除这些限制,Java提供了数字签名机制。本教程将详细介绍在Java 2环境下,如何为Applet进行数字签名,以及相关的Java知识。 一、Java Applet与数字签名 1. Java Applet:Java Applet...
Java Applet是Java技术在早期Web开发中的一种应用方式,它允许开发者在浏览器中嵌入可执行的小程序,为用户提供动态交互的Web页面体验。这个简单的案例将带你深入理解Java Applet的基础概念、工作原理以及如何创建和...
Java Application在权限上较为宽松,可以执行读/写文件等操作,而Java Applet受到沙盒模型的严格限制,禁止对本地文件系统进行读写操作,以保护用户数据安全。这一限制虽然牺牲了一定的功能性,但极大地增强了Web...
Java+Applet实例讲解(分为1和2两部分)、Java+Applet实例编程、java+Applet登录、JavaApplet教程.pdf、JAVA_applet应用实例.ppt、JavaApplet编程技巧实例专辑、javaapplet例子.doc、Applet类.doc等教程。...
本文重点介绍了如何利用Java开发工具包(JDK)提供的签名工具、密钥管理工具和策略编辑器等工具,对Java Applet小程序实施数字签名和认证的方法,这种方法能够在保证安全的同时赋予“可信的”Java小程序更多的特权。...
Java Applet 是Java技术在早期Web开发中的一种应用方式,它允许开发者创建可以在网页中运行的小型程序。这个入门教程将带你了解Java Applet的基本概念、工作原理以及如何编写和部署。 1. **Java Applet简介** - ...
鉴于Java Applet的限制和Java平台的发展,JavaFX和Swing成为了开发桌面应用和Web应用的首选,它们提供了更丰富的UI组件和更好的性能,同时不受Applet的安全限制。 总的来说,这个Java Applet应用实例集提供了丰富...
### JavaApplet与JavaScript #### 6.1 JavaApplet ##### 6.1.1 JavaApplet概述 **Applet 类层次结构:** JavaApplet 的基础是 `java.applet.Applet` 类,它是从 `java.awt.Panel` 继承而来的一个特殊的图形组件。...
- **编译与签名**:使用`javac`编译源代码,为了安全原因,Applet可能需要进行数字签名。 3. **Applet通信** - **Applet与浏览器通信**:通过`getAppletContext()`和`showDocument()`方法与浏览器交互。 - **...
然而,由于安全原因,Applet需要经过严格的验证和安全控制,其中最重要的就是数字签名和客户端认证。 **数字签名**是确保代码完整性和来源可信的关键机制。在Java Applet中,数字签名是一种使用公钥基础设施(PKI)...
为了缓解这个问题,Java引入了安全沙箱模型,限制了Applet的一些操作,比如读写文件、网络通信等。然而,即使如此,Applet的安全性仍不理想,这也是它逐渐被淘汰的原因之一。 7. **替代技术**: 如今,JavaScript...
这个"Java Applet实例编程"很可能是包含了一系列的Java Applet编程示例,帮助学习者理解如何利用Java Applet进行实际的开发工作。 在Java Applet的编程中,有几个关键的概念和技术点: 1. **Applet类**:所有的...