大学JAVA实用教程--第10章 Java安全技术_第1页
大学JAVA实用教程--第10章 Java安全技术_第2页
大学JAVA实用教程--第10章 Java安全技术_第3页
大学JAVA实用教程--第10章 Java安全技术_第4页
大学JAVA实用教程--第10章 Java安全技术_第5页
已阅读5页,还剩47页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第10章 Java安全技术 10.1 简介简介10.2 安全限制和许可安全限制和许可10.3 安全策略安全策略 (Policy)10.4 辅助工具辅助工具10.5 签名及发布的例子签名及发布的例子 习习 题题 10.1 简简 介介 Java是网络上使用的编程语言,安全性是非常重要的,特别是Java平台的安全以及Java技术部署带来的安全问题,尤其值得认真考虑。Java中的安全包括两个方面: (1) 提供安全且易于构建的Java平台,能够以安全模式运行Java实现的应用程序。 (2) 提供用于编程语言的安全工具和服务,实现较广泛的安全。 Java平台提供的原始安全模型称为沙箱模型(JDK1.0)

2、,该模型提供较窄环境沙箱来运行没有得到信任的代码。在沙箱模型中允许得到信任的本地代码访问重要资源,而没有经过信任的远程代码只能访问沙箱内的很少部分资源。在JDK1.1中引入签名Applet的概念,如果签名的密钥由接收Applet的客户端认为是可信任的,那么这个经过正确数字签名的Applet就可以当作可信任本地代码访问重要资源。这里签名Applet和它的签名以JAR格式传送。随着发展,在原来沙箱模型的基础上引入新的安全体系,形成Java 2平台安全模型如图10.1所示。从图10.1中可以看出,不管本地还是远程,签名还是未签名的代码都统一到类加载器处,咨询安全策略,然后决定代码能够访问的资源。Ja

3、va 2安全平台模型较之以前有了很大的改进,其主要特点如下:(1) 细粒度的访问控制。(2) 易于配置的安全策略。 (3) 易于扩展的访问控制结构。(4) 安全检查扩展到所有Java程序,包括应用程序和Applet。图10.1 Java 2平台安全模型 JVM 有价值的资源(文件等)沙箱类加载器安全策略本地或远程代码(签名的或者未签名的)代码以不同的许可运行,没有信任代码内置的概念 图10.1中的多个沙箱模型可以看作有固定边界的保护域。所谓保护域是指一个对象集合,这些对象可以由安全策略中定义的一条规则直接访问。保护域分为系统域和应用程序域,受保护的资源,像文件系统、网络设施以及屏幕和键盘,只允

4、许系统域进行访问,而应用程序域可以通过授权许可访问受保护资源。类加载器将本地或远程代码(Applet)载入的同时,策略文件给出域的划分和不同代码对不同域访问权限的许可,载入的类就根据域划分和权限许可来访问相应的域资源。图10.2为运行中类到域再到许可的映射。图10.2 类到域再到许可的映射许可许可e.classd.classc.classb.classa.class运行时的类安全策略域B域A10.2 安全限制和许可安全限制和许可 本地的代码类访问系统资源时通常不会受到太大的限制,所以本章主要讨论从服务器下载到客户端的远程代码Applet访问客户端资源的情况。 Applet访问客户端资源时,由于

5、Java内嵌的平台安全性机制受到较大的限制,通常表现在无法读写客户端的文件,无法采集客户端音频。例如,当Applet实现的是客户端和服务器端进行语音聊天时,客户端采集音频就会受到限制,还有无法启动客户端的Socket进行传输等。下面看一个文件访问受到安全限制的例子。 【例10.1】 编写一个用来读取客户端文件的Applet,客户端的文件路径及文件名为E:a.txt,文件内容为“你好,这是客户端的测试文件!”,如图10.3右部分所示。将读出的文件内容显示在文本区域内,如果访问出错,异常信息也显示在文本区域内。/程序文件名:AppletSecurity.javaimport java.awt.*;

6、import java.awt.event.*;import java.applet.*;import java.io.*;public class AppletSecurity extends Applet TextField fileNameField;TextArea fileArea;public void init() Label lblName=new Label(文件名:);Label lblContext = new Label(文件内容:);fileNameField=new TextField(35);fileNameField.addActionListener(new

7、ActionListener()public void actionPerformed(ActionEvent e)loadFile(fileNameField.getText(););fileArea=new TextArea(10,35);add(lblName);add(fileNameField);add(lblContext);add(fileArea);public void loadFile(String fileName)tryBufferedReader reader=new BufferedReader(new FileReader(fileName);String con

8、text = new String();while(context = reader.readLine()!=null)fileArea.append(context + n);reader.close();catch(IOException ie)fileArea.append(IO错误: + ie.getMessage();catch(SecurityException se) fileArea.append(安全访问错误: + se.getMessage(); 程序编写后,编译生成相应的类,将类嵌入HTML文件,从本地服务器加载,在载入Applet的界面上输入文件名E:a.txt后按回车

9、键,在界面的文本区域内并没有显示相应a.txt的内容,只是提示“access denied (java.io.FilePermission E:a.txt read)”,表示访问拒绝,如图10.3左部分所示。图10.3 Applet访问文件出错显示和客户端文件内容 Java安全平台中受到的种种安全限制,在Java中都提供了一一对应的许可,例如对于读、写文件的限制,Java提供了java.io.FilePermission来许可对客户端文件的读、写等操作。下面看一下这些许可类。 许可类代表对系统资源的访问权限。Java.security.permission类是抽象类,划分为多个子类来代表特定的

10、访问。而不同的许可类属于不同的包,如FilePermission类属于java.io包,而SocketPermission类属于包。目前Java系统内嵌的主要的许可类如表10.1所示。表表10.1 Java内嵌的许可类内嵌的许可类名 称 描 述 全 称 AllPermission 包含所有其它许可 java.security.AllPermission AudioPermission 代表对音频系统资源的访问权限 javax.sound.sampled.AudioPermission AuthPermission 认证许可 javax.security.auth.AuthPermission

11、AWTPermission 图形界面资源许可,像使用剪贴板 java.awt.AWTPermission FilePermission 文件及目录访问许可,像读、写 java.io.FilePermission NetPermission 各种网络许可,像请求密码认证 .NetPermission PropertyPermission 访问系统属性许可 java.util.PropertyPermission ReflectPermission 反射操作中禁止访问检查许可 java.lang.reflect.ReflectPermission RuntimePermission 运行时许可 j

12、ava.lang.RuntimePermission SecurityPermission 安全许可 java.security.SecurityPermission SerializablePermission 序列化许可 java.io.SerializablePermission SocketPermission 通过 Socket 访问网络的权限 .SocketPermission SQLPermission 调用 SetLogWriter 方法时许可 java.sql.SQLPermission 建立这些类的对象就可以产生许可。例如,下面的代码用来产生许可读取/tmp目录下名为Hel

13、lo的文件: filePerm = new java.io.FilePermission(/tmp/Hello,read);10.3 安安 全全 策策 略略 (Policy) 1. keystore条目条目 keystore用来存放密钥对和相关数字证书。数字证书像X.509证书链用来鉴别相应的公有密钥。keytool工具用来创建和管理keystore。Policy配置文件中指定keystore,用来查找grant条目中签名者的公有密钥。如果存在指明签名的grant条目,那么必须存在相应的keystore。Keystore条目的格式为:keystore url,type 其中: (1) keys

14、tore是保留字,表示keystore条目。 (2) url指kestore的URL地址。 (3) type指keystore的类型,用于定义keystore信息的存储和数据格式,以及保护keystore中的私有密钥和keystore完整性算法。通常情况下缺省类型为“JKS”。 2. grant条目条目 policy对象中含有0到多条grant条目,指明远程代码访问特定资源的相关许可。grant条目的格式如下:grant signedBy name codeBase url Permission permission-class-name target-name, action-name ;

15、Permission permission-class-name target-name, action-name ; 其中: (1) 每个grant条目为由name签名且来源于codeBase的类的访问提供一系列许可permission-class-name。 (2) grant为保留字,表示一条授权。 (3) signedBy为保留字,指明签名者。 (4) name为数字签名的作者名。 (5) codeBase为保留字,指明代码来源。 (6) url为指定代码的来源路径。(7) Permission为保留期,指明许可名字及许可操作。(8) permission-class-name指许可类

16、名。(9) target-name为受保护资源的名字,如文件目录。(10) action-name 为对受保护资源进行操作的权限。 例如,下面为两条具体的grant条目,第一条表示允许lihua签名的网址3:8080/下的访问代码对temp目录的所有文件有读、写权限。第二条表示对本机java.home目录的子目录/lib/ext/下的所有代码授予任意访问受保护资源的权限。grant signedBy lihua codeBase 3:8080/Permission java.io.FilePermission tmp/

17、*,read,wirte;grant codeBase file:$java.home/lib/ext/* permission java.security.AllPermission;10.4 辅辅 助助 工工 具具10.4.1 密钥和证书管理工具密钥和证书管理工具 keytool为密钥和证书管理工具。它使得用户可以管理他们自己的公共密钥和私有密钥对以及相关的证书,用于在数字签名中进行数据完整性验证和身份验证。 keytool将密钥对和证书存放在keystore中,keystore通常以文件的形式存在。创建keystore时需要为它设置密码,还要为其中的私有密钥设置密码。命令提示符状态下键入

18、不带参数的命令keytool,可以看见它的用法,如图10.4所示。图10.4 keytool的用法 例如,在命令行提示符状态下键入如下命令行,生成UseImage.keystore文件,密钥和keystore的密码均为xueliang,显示结果如图10.5所示。keytool -genkey -alias UseImage -keypass xueliang -keystore UseImage.keystore -storepass xueliang 其中: (1) -genkey:选项,表示生成新的密钥。 (2) -alias:别名选项,表示紧跟的参数为别名具体值:UseImage。 (3

19、) -keypass:密钥的密码选项,表示紧跟的参数为密钥的密码具体值:xueliang。 (4) -keystore:选项,表示紧跟的参数为生成的keysotre文件名称:UseImage.keystore。 (5) -storepass:keystore密码的选项,表示紧跟的参数为keystore文件的密码具体值:xueliang。 图10.5 生成文件UseImage.keystore 而要将公共密钥导入证书,则需要键入如下代码,生成UseImage.cer证书文件,结果如图10.6所示。 keytool -export -alias UseImage -file UseImage.ce

20、r -keystore UseImage.keystore -storepass xueliang图10.6 生成证书文件UseImage.cer10.4.2 签名和校验工具签名和校验工具 jarsigner用来对JAR文件进行数字签名和校验,这个过程基于keytool生成的keystore。在命令提示符状态下键入jarsigner后按回车键,可以看见用法及选项说明,如图10.7所示。图10.7 jarsigner工具的用法及选项 常用的签名格式为: jarsigner -keystore keysotre-file -storepass keystore-password jar-file

21、alias 其中: (1) keystore-file为keytool生成的keystore文件。 (2) keystore-password为keystore的密码。 (3) jar-file文件为档案文件而且只能为档案文件。例如:jar cvf UseImage.jar UseImage.class index_01.gif;/生成JAR文件jarsigner -keystore UseImage.keystore -storepass xueliang UseImage.jar UseImage/进行签名10.4.3 PolicyTool Policytool是图形用户界面工具,可帮助用

22、户指定、生成、编辑一个安全策略。命令提示符状态下键入PolicyTool后按回车键,就可调出此图形界面。根据界面指示,可以实现一个policy文件的各种操作。下面来看一下系统默认的policy文件,将D:j2sdk1.4.0_01jrelibsecurity目录下的java.policy文件拷贝到E:_WorkJavasample目录下,在命令行状态运行命令policytool,弹出“规则工具”对话框。单击“文件”菜单中的“打开”项,选择java.policy文件并打开,如图10.8所示。从图10.8中可以看出允许两个CodeBase来源的远程代码。图10.8 使用policytool工具打开

23、java.policy文件 选中第一个规则项目“CodeBase file:$java.home/lib/ext/*”,单击“编辑规则项目”按钮,弹出一个“规则项目”的窗口,如图10.9所示,可以看见签名项(SignedBy:)为空,而权限一栏中为 permission java.security.AllPermission;表示允许这个规则项目下的所有远程代码对系统的所有资源进行访问。图10.9 全部授权的权限列表 选中第二个规则项目“CodeBase ”,单击“编辑规则项目”按钮,弹出如图10.10所示窗口。权限列表中可以看出对普通属性都有读的权限。这是客户端对所有远程代码的默认的安全限制

24、列表。图10.10 所有远程代码访问的默认权限列表这个默认的java.policy文件对应的源文件如下:/ Standard extensions get all permissions by defaultgrant codeBase file:$java.home/lib/ext/* permission java.security.AllPermission;/ default permissions granted to all domainsgrant / Allows any thread to stop itself using the java.lang.Thread.stop

25、() / 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

26、 potentially unsafe./ See http:/ for more information.permission java.lang.RuntimePermission stopThread;/ allows anyone to listen on un-privileged portspermission .SocketPermission localhost:1024-, listen;/ standard properies that can be read by anyonepermission java.util.PropertyPermission java.ver

27、sion, 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 , read;permission java.util.PropertyPermission os.version

28、, 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.specificati

29、on.version, read;permission java.util.PropertyPermission java.specification.vendor, read;permission java.util.PropertyPermission , read;permission java.util.PropertyPermission java.vm.specification.version, read;permission java.util.PropertyPermission java.vm.specification.ven

30、dor, read;permission java.util.PropertyPermission , read;permission java.util.PropertyPermission java.vm.version, read;permission java.util.PropertyPermission java.vm.vendor, read;permission java.util.PropertyPermission , read;10.5 签名及发布的例子签名及发布的例子10.5.1 步骤步骤 在命令提示符状态下进入路径D:Apache Tomcat 4.0webappsROOTuser,所有操作都在服务器路径下操作,也可以在普通路径下操作,完成后将一系列文件配置到服务器端。本书作者使用前者,在user目

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论