因为
Applet
在浏览器中运行,所以,并不是什么操作都能做,例如不能读写创建文件,不能任意连接网站等等,总之就是不可威胁用户电脑的信息安全。下面我们来试试看,新建一个文件操作的
Applet
,代码清单如下:
applets.FileOperationApplet
package applets;
import java.applet.Applet;
import java.awt.Label;
import java.io.*;
public class FileOperationApplet extends Applet {
public void start() {
try {
FileWriter out = new FileWriter("c:\\test.txt");
out.write("测试写入文件");
out.close();
add(new Label("文件写入成功"));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
add(new Label("文件写入失败"));
}
}
}
。首先我们用
Eclipse
来运行,当然没问题,因为模拟器为了调试方便,是运行所有的操作的,运行后,界面显示文件写入成功,并且在
C
盘根目录下可以找到文件
test.txt
,并看到文件内容。随后我们创建
HTML
文件,打算在网页文件中运行它,文件代码清单如下:
FileOperationApplet.html
<html>
<body>
<applet code=applets.FileOperationApplet.class width="200" height="200" >
</applet>
</body>
</html>
,接着用浏览器打开这个网页,可以看到如图
18.6
所示的出错界面和信息提示。这个出错信息完整的内容是:
java.security.AccessControlException: access denied (java.io.FilePermission c:\test.txt write)
at java.security.AccessControlContext.checkPermission(Unknown Source)
at java.security.AccessController.checkPermission(Unknown Source)
at java.lang.SecurityManager.checkPermission(Unknown Source)
at java.lang.SecurityManager.checkWrite(Unknown Source)
at java.io.FileOutputStream.<init>(Unknown Source)
at java.io.FileOutputStream.<init>(Unknown Source)
at java.io.FileWriter.<init>(Unknown Source)
at applets.FileOperationApplet.start(FileOperationApplet.java:10)
at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
,即:访问拒绝,不能写入文件
c:\test.txt
。这很安全,不是吗?
然而实话实说,
Applet
在企业内部网上,还是很有用处的,它一般可以用来做一些复杂的操作,或者是大文件的上传下载,即时消息支持等等,笔者见过不少这样的解决方案(网络上也有人制作了
Applet
批量文件上传的功能)。不过,这样的限制,虽然是安全了,但是却让
Applet
的功能大打折扣,那么有没有办法绕过这层安全限制呢?答案是肯定的,这就是
Java
中推出的签名
JAR
功能,可以帮助我们在用户同意的情况下,绕过安全限制(当然在内部网没有问题,如果是外网,很容易发生恶意代码,例如恶意删除文件等等)。
注意:
由于
Microsoft
也推出了一款
JVM
,导致了
Java
标准的分裂,微软格式的数字签名
applet
打包格式为
cab
,签名方式也和我们下面描述的内容不同,有兴趣的读者可以去查找相关资料,总之是不通用的。
如果是正规的公司,数字证书都是需要购买的,像
Verisign
之类的公司,提供这样的服务,它的好处就是确保证书是全球唯一的,能够在出现事故时,鉴定是否是有效的数字证书,其实就类似于一份全球唯一的身份证,带有你自己才知道的密码,缺点就是不免费。大家如果在线安装过软件,一般大公司的插件,例如
Flash
播放器等等,都会带有数字证书。当然,在
Java
中,不需要这么麻烦,
JDK
已经提供了一个工具
keytool.exe
来让开发人员自己生成数字证书(至于安全,加密方面的话题,那就太繁杂了,读者可以自己去查找资料)。如果不想使用命令行版本的这个工具,还可以下载一个开源的软件
KeyTool GUI
,详见参考资料一节的内容。下面我们就快速进入主题,首先启动
CMD
命令行工具,然后进入到当前的项目目录,运行下面的命令:
keytool
-genkey -dname "cn=BeanSoft Studio, ou=Java Software, o=BeanSoft
Studio, c=China" -alias beansoft -keypass beansoft -storepass beansoft
-validity 365 -keystore .\beansoft
这段命令将会创建一个数字文件放在当前目录的二进制文件
beansoft
中。该证书的别名是
beansoft
(通过
-alias
指定),密钥的密码是
beansoft
(
-keypass
命令指定),存储密钥的文件密码也是
beansoft
(
- storepass
命令指定),证书的有效期是
365
天(通过
-validity
指定),
并把它存储到密码文件
beansoft
中。这段命令执行后,没有出错信息的话即是创建成功。另外,如果是实际的项目的话,最好将两个密码设置成安全级别比较高的密码。除了这样来生成一个密钥文件外,还可以用
KeyTool
以交互的方式来生成(比较推荐初学者使用这种方式):
keytool –genkey
随后,会提示您输入必须或者可选的内容。
随后我们可以检查下这份证书文件的内容,执行下面的命令:
keytool -list -keystore .\beansoft -storepass beansoft
会输出信息:
Keystore
类型:
JKS
Keystore
提供者:
SUN
您的
keystore
包含
1
输入
beansoft, 2008-5-7, PrivateKeyEntry,
认证指纹
(MD5)
:
16:15:A0:47:92:96:29:96:93:5D:F0:76:F7:D0:2C:84
。这说明证书没有问题。
有时可能需要导出证书供人使用,可以执行下面的命令:
keytool -export -keystore .\beansoft -storepass beansoft -file beansoft.cer -alias beansoft
随后会生成一个
beansoft.cer
,不过在这里对
Applet
签名是不需要这样做的,只有在做
SSL
开发时,才能用得到它。
随后,请读者按照
16.1.3.1 JAR
文件一节所介绍的内容,将
Applet
的类文件打包成
jar
文件,名为
applets.jar
,放在项目的根目录下。接着就进入最关键的,对
JAR
文件进行签名了,键入下列命令:
jarsigner -verbose -keystore .\beansoft applets.jar beansoft
接着提示信息为:
输入密钥库的口令短语:
beansoft
按下回车,即可看到签名过程:
正在添加:
META-INF/MANIFEST.MF
正在添加:
META-INF/BEANSOFT.SF
正在添加:
META-INF/BEANSOFT.DSA
正在添加:
applets/
正在签名:
applets/FileOperationApplet.class
正在签名:
applets/LifeCycleApplet.class
正在签名:
applets/MyApplet.class
正在签名:
applets/usb.jpg
可以看到
META-INF
目录下将会多出两个数字指纹文件,运行的时候
JVM
将会和类文件进行对比,确保文件没被人篡改过。
好了,现在的
applets.jar
已经今非昔比了,它是个被签名过的
JAR
,怎么使用它呢?需要在它所在的同一目录下,即项目根目录下,新建一个
HTML
文件,代码清单如下:
FileOperationAppletSigned.html
<html>
<body>
<applet code=applets.FileOperationApplet.class archive="applets.jar" width="200" height="200" >
</applet>
</body>
</html>
唯一的不同,就是多了粗斜体的
archive="applets.jar"
这句话。
好了,最激动人心的时刻到来了,请用浏览器打开这个网页,会看到一个安全提示,如图
18.7
所示。点击运行
按钮,即可看到正确的执行了操作,在用户的
C
盘上创建了一个文件!很好,我们可以为所欲为了,像写普通
Java
应用那样来写
Applet
了!如果点击取消
按
钮,那很自然的无法创建文件,用户拥有选择权,当然,如果是企业的客户,自然都是让他们选择运行按钮。其实通过这里读者也可以注意到,现在好多网站(例如
视频分享的网站等),都会提示您下载一些插件提供增强的功能,然而,他们的数字证书和这里的一样,都是自己造的(其实就是伪造
),所以,装完后并不能保证是否夹杂了病毒或者恶意代码,所以读者上网时千万要谨慎识别,不要随意点击在线安装或者运行软件。
Applet
数字签名安全提示
- 大小: 17.7 KB
分享到:
相关推荐
详细讲解了applet的签名过程,自己亲自试过
利用数字签名超越Java Applet的安全限制
用Applet写的java小程序如果没有经过签名,那么访问客户端程序下载后会受到安全限制;怎样对java小程序签名受到很多人的关注,网上也有这些方面可供参考的文档,但都不是完整,在这里我给出一份可具体操作的文档,...
# 本章介绍基于代码来源的程序的安全运行,可以基于运行时代码在哪个URL、或代码是谁签名的限制其可以访问哪些用户资源。还介绍了定义自己的权限以及签名Java Applet。 # 第九章 # 解决的主要问题——身份验证和...
[目录]Applet的安全限制及措施 2. [目录]与Servlet通信 3. [目录]与其他Cgi程序通信 4. [目录]与JavaScript通信 5. [目录]与其他Applet通信 6. [目录]找不到类的问题 6. [目录]Java...
在客户层,在浏览器中applet的textarea区域显示word题的要求,并利用applett数字签名技术,突破访问本地文件系统的限制,打开word做题。 在Web层,利用servlet的文件上传下载技术,将读出的word文件下载到本地磁盘...