10Java安全技术.

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

Java实用教程Java教程JavaJava实用教程目录第1章Java环境及配置P3第2章Java基本语法P35第3章类和接口P119第4章JavaAppletP213第5章Java图形处理P293第6章Java用户界面技术P342第7章异常、事件和多线程机制P447第8章输入输出技术P536第9章Java数据库技术P581第10章Java安全技术P630第11章Java网络技术(一)P682第12章Java网络技术(二)P772第13章Servlet技术P864第14章Java读写XML技术P916Java实用教程第10章Java安全技术10.1简介10.2安全限制和许可10.3安全策略(Policy)10.4辅助工具10.5签名及发布的例子习题Java实用教程10.1简介Java是网络上使用的编程语言,安全性是非常重要的,特别是Java平台的安全以及Java技术部署带来的安全问题,尤其值得认真考虑。Java中的安全包括两个方面:(1)提供安全且易于构建的Java平台,能够以安全模式运行Java实现的应用程序。(2)提供用于编程语言的安全工具和服务,实现较广泛的安全。Java实用教程Java平台提供的原始安全模型称为沙箱模型(JDK1.0),该模型提供较窄环境——沙箱来运行没有得到信任的代码。在沙箱模型中允许得到信任的本地代码访问重要资源,而没有经过信任的远程代码只能访问沙箱内的很少部分资源。在JDK1.1中引入签名Applet的概念,如果签名的密钥由接收Applet的客户端认为是可信任的,那么这个经过正确数字签名的Applet就可以当作可信任本地代码访问重要资源。这里签名Applet和它的签名以JAR格式传送。随着发展,在原来沙箱模型的基础上引入新的安全体系,形成Java2平台安全模型如图10.1所示。从图10.1中可以看出,不管本地还是远程,签名还是未签名的代码都统一到类加载器处,咨询安全策略,然后决定代码能够访问的资源。Java2安全平台模型较之以前有了很大的改进,其主要特点如下:Java实用教程(1)细粒度的访问控制。(2)易于配置的安全策略。(3)易于扩展的访问控制结构。(4)安全检查扩展到所有Java程序,包括应用程序和Applet。Java实用教程图10.1Java2平台安全模型JVM有价值的资源(文件等)沙箱类加载器安全策略本地或远程代码(签名的或者未签名的)代码以不同的许可运行,没有信任代码内置的概念Java实用教程图10.1中的多个沙箱模型可以看作有固定边界的保护域。所谓保护域是指一个对象集合,这些对象可以由安全策略中定义的一条规则直接访问。保护域分为系统域和应用程序域,受保护的资源,像文件系统、网络设施以及屏幕和键盘,只允许系统域进行访问,而应用程序域可以通过授权许可访问受保护资源。类加载器将本地或远程代码(Applet)载入的同时,策略文件给出域的划分和不同代码对不同域访问权限的许可,载入的类就根据域划分和权限许可来访问相应的域资源。图10.2为运行中类到域再到许可的映射。Java实用教程图10.2类到域再到许可的映射许可许可e.classd.classc.classb.classa.class运行时的类安全策略域B域AJava实用教程10.2安全限制和许可本地的代码类访问系统资源时通常不会受到太大的限制,所以本章主要讨论从服务器下载到客户端的远程代码Applet访问客户端资源的情况。Applet访问客户端资源时,由于Java内嵌的平台安全性机制受到较大的限制,通常表现在无法读写客户端的文件,无法采集客户端音频。例如,当Applet实现的是客户端和服务器端进行语音聊天时,客户端采集音频就会受到限制,还有无法启动客户端的Socket进行传输等。下面看一个文件访问受到安全限制的例子。Java实用教程【例10.1】编写一个用来读取客户端文件的Applet,客户端的文件路径及文件名为E:\a.txt,文件内容为“你好,这是客户端的测试文件!”,如图10.3右部分所示。将读出的文件内容显示在文本区域内,如果访问出错,异常信息也显示在文本区域内。//程序文件名:AppletSecurity.javaimportjava.awt.*;importjava.awt.event.*;importjava.applet.*;importjava.io.*;publicclassAppletSecurityextendsApplet{Java实用教程TextFieldfileNameField;TextAreafileArea;publicvoidinit(){LabellblName=newLabel(文件名:);LabellblContext=newLabel(文件内容:);fileNameField=newTextField(35);fileNameField.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){loadFile(fileNameField.getText());}});fileArea=newTextArea(10,35);Java实用教程add(lblName);add(fileNameField);add(lblContext);add(fileArea);}publicvoidloadFile(StringfileName){try{BufferedReaderreader=newBufferedReader(newFileReader(fileName));Stringcontext=newString();Java实用教程while((context=reader.readLine())!=null){fileArea.append(context+\n);}reader.close();}catch(IOExceptionie){fileArea.append(IO错误:+ie.getMessage());}Java实用教程catch(SecurityExceptionse){fileArea.append(安全访问错误:+se.getMessage());}}}Java实用教程程序编写后,编译生成相应的类,将类嵌入HTML文件,从本地服务器加载,在载入Applet的界面上输入文件名E:\a.txt后按回车键,在界面的文本区域内并没有显示相应a.txt的内容,只是提示“accessdenied(java.io.FilePermissionE:\a.txtread)”,表示访问拒绝,如图10.3左部分所示。图10.3Applet访问文件出错显示和客户端文件内容Java实用教程Java安全平台中受到的种种安全限制,在Java中都提供了一一对应的许可,例如对于读、写文件的限制,Java提供了java.io.FilePermission来许可对客户端文件的读、写等操作。下面看一下这些许可类。许可类代表对系统资源的访问权限。Java.security.permission类是抽象类,划分为多个子类来代表特定的访问。而不同的许可类属于不同的包,如FilePermission类属于java.io包,而SocketPermission类属于java.net包。目前Java系统内嵌的主要的许可类如表10.1所示。Java实用教程表10.1Java内嵌的许可类名称描述全称AllPermission包含所有其它许可java.security.AllPermissionAudioPermission代表对音频系统资源的访问权限javax.sound.sampled.AudioPermissionAuthPermission认证许可javax.security.auth.AuthPermissionAWTPermission图形界面资源许可,像使用剪贴板java.awt.AWTPermissionFilePermission文件及目录访问许可,像读、写java.io.FilePermissionNetPermission各种网络许可,像请求密码认证java.net.NetPermissionPropertyPermission访问系统属性许可java.util.PropertyPermissionReflectPermission反射操作中禁止访问检查许可java.lang.reflect.ReflectPermissionRuntimePermission运行时许可java.lang.RuntimePermissionSecurityPermission安全许可java.security.SecurityPermissionSerializablePermission序列化许可java.io.SerializablePermissionSocketPermission通过Socket访问网络的权限java.net.SocketPermissionSQLPermission调用SetLogWriter方法时许可java.sql.SQLPermissionJava实用教程建立这些类的对象就可以产生许可。例如,下面的代码用来产生许可——读取/tmp目录下名为Hello的文件:filePerm=newjava.io.FilePermission(/tmp/Hello,read);Java实用教程10.3安全策略(Policy)1.keystore条目keystore用来存放密钥对和相关数字证书。数字证书像X.509证书链用来鉴别相应的公有密钥。keytool工具用来创建和管理keystore。Policy配置文件中指定keystore,用来查找grant条目中签名者的公有密钥。如果存在指明签名的grant条目,那么必须存在相应的keystore。Keystore条目的格式为:keystoreurl,typeJava实用教程其中:(1)keystore是保留字,表示keystore条目。(2)url指kestore的URL地址。(3)type指keystore的类型,用于定义keystore信息的存储和数据格式,以及保护keystore中的私有密钥和keystore完整性算法。通常情况下缺省类型为“JKS”。Java实用教程2.grant条目policy对象中含有0到多条grant条目,指明远程代码访问特定资源的相关许可。grant条目的格式如下:grantsignedBynamecodeBaseurl{Permissionpermission-class-nametarget-name,action-name;Permissionpermission-class-nametarget-name,action-name;}Java实用教程其中:(1)每个grant条目为由name签名且来源于codeBase的类的访问提供一系列许可permission-class-name。(2)grant为保留字,表示一条授权。(3)signedBy为保留字,指明签名者。(4)name为数字签名的作者名。(5)codeBase为保留字,指明代码来源。(6)url为指定代码的来源路径。Java实用教程(7)Permission为保留期,指明许可名字及许可操作。(8)permission-class-name指许可类名。(9)target-name为受保护资源的名字,如文件目录。(10)action-name为对受保护资源进行操作的权限。Java实用教程例如,下面为两条具体的grant条目,第一条表示允许lihua签名的网址下的访问代码对temp目录的所有文件有读、写权限。第二条表示对本机java.home目录的子目录/lib/ext/下的所有代码授予任意访问受保护资源的权限。grantsignedBylihuacodeBase

1 / 54
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功