总的来说,java安全应该包括两个方面,一是java平台(即运行环境)的安全性;二是以java语言开发的应用程序的安全性。我们只考虑第二块,一般我们可以通过安全管理机制来完善安全性,安全管理器是安全的实施者,可对此类进行扩展,它提供了加在应用程序上的安全措施,通过配置安全策略文件达到对网络、本地文件和程序其他部分的访问限制的效果

 

java从应用层给我们提供了安全管理机制--安全管理器,每个java应用都可以拥有自己的安全管理器,他会在运行阶段检查需要保护的资源的访问权限及其他规定的操作权限,保护系统免受恶意操作攻击,达到系统的安全策略。当运行java程序时,安全管理器会根据policy文件所描述策略给程序不同模块分配权限。例如,当应用程序要读取本地文件时,securityManger会在读取前进行拦截,判断是否有读取此文件的权限,如果有顺利读取,否则将抛出访问异常。SecurityManager类中提供了很多检查权限的方法,例如checkPermisson方法判断是否有操作权限 ,checkRead方法用于判断对文件的访问权限。一旦发现没有权限都会抛出安全异常

 

一般而言,java程序启动时并不会自动启动安全管理器,可以通过以下两种方法启动安全管理器:

1.在启动命令中添加-Djava.security.manager 

2.实例化java.lang.SecurityManager或它的子类的对象,然后通过System.setSecurityManager()来设置并启动一个安全管理器

 

在启动安全管理器时可以通过-Djava.security.policy参数来指定安全策略文件,参数和值连接用“=”表示将和默认策略一同发挥作用,“==”表示单独使用,如果没指定,将使用默认安全策略文件%JAVA_HOME%/jre/lib/security/java.policy。 policy文件包含多个grant语句,在启动安全管理器时会根据policy文件生成一个policy对象,任何时候一个应用程序只能有一个policy对象 

 

给出一个例子说明安全管理器的作用:

 

public class SecurityManagerTest {

        public static void main(String[] args) throws FileNotFoundException {

         System.out.println("SecurityManager: " + System.getSecurityManager());

         FileInputStreamfis = new FileInputStream("c:\\protect.txt");

         System.out.println(System.getProperty("file.encoding"));

        }

}

 

1.不添加启动参数直接运行,即不启动安全管理器,SecurityManager打印出来为null,且能正确读取protect.txt文件跟file.encoding属性

2.添加启动参数-Djava.security.manager -Djava.security.policy=c:/protext.policy(两参数要分开),此时SecurityManger打印出来不为null,但是此时protect.policy里面没有任何授权,所以在读取文件时就抛出AccessControlException异常

3.在protect.policy文件添加一下授权语句:

grant{
permission java.io.FilePermission "c:/protect.txt","read";
};

此时SecurityManager不为空,并有权限读取protect.txt文件,但最终还是会抛出一个AccessControlException异常,因为并没有权限读取file.encoding系统属性

4.将protect.policy授权语句改为

grant{
permission java.io.FilePermission "c:/protect.txt","read";
permission java.util.PropertyPermission "file.encoding","read";
};

程序正常运行

上面几种情况我们可以了解安全管理器的使用。java的Permission类是用来定义类所拥有的权限,java本身包括了一些Permission类:

java.security.AllPermission

所有权限的集合

java.util.PropertyPermission

系统/环境属性权限

java.lang.RuntimePermission

运行时权限

java.net.SocketPermission

Socket权限

java.io.FilePermission

文件权限,包括读写,删除,执行

java.io.SerializablePermission

序列化权限

java.lang.reflect.ReflectPermission

反射权限

java.security.UnresolvedPermission

未解析的权限

java.net.NetPermission

网络权限

java.awt.AWTPermission

AWT权限

java.sql.SQLPermission

数据库sql权限

java.security.SecurityPermission

安全控制方面的权限

java.util.logging.LoggingPermission

日志控制权限

javax.net.ssl.SSLPermission

安全连接权限

javax.security.auth.AuthPermission

认证权限

javax.sound.sampled.AudioPermission

音频系统资源的访问权限