Java安全技术
lPolicy安全 策略
l安全管理器
PDF 文件使用 "pdfFactory" 试用版本创建 www.fineprint.com.cn
Policy安全 策略
lJava在安全 策略文件中为程序指定权限
系统 策略: JDK_HOME/jre/lib/security/java. policy
grant {
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";
...
};
PDF 文件使用 "pdfFactory" 试用版本创建 www.fineprint.com.cn
Policy安全 策略
lJava默认识别两种 策略:
系统 策略: JDK_HOME/jre/lib/security/java. policy
用户 策略: 存放于用户目录(系统属性user.home指定的目录)下的
java. policy文件.
l可以通过java.security. policy系统属性指定其它 策略
1.指定的 策略文件补充系统 策略和用户 策略
java -Djava.security. policy=mytest.policyAccessControlTest
2.指定的 策略文件代替系统 策略和用户 策略
java -Djava.security. policy==mytest.policyAccessControlTest
PDF 文件使用 "pdfFactory" 试用版本创建 www.fineprint.com.cn
Policy安全 策略
l缺省情况,小应用程序不能读本地系统的硬盘
参见FileOpeartionApplet.java,在这个 applet中对本地文件进行读
写,将抛出如下异常
java.security.AccessControlException: access denied (java.io.FilePermissionc:/in.txt read)
java.security.AccessControlException: access denied (java.io.FilePermissionc:/in.txt write)
运行appletviewer FileOperationApplet.html
PDF 文件使用 "pdfFactory" 试用版本创建 www.fineprint.com.cn
Policy安全 策略
l可以扩大 applet的安全范围
l增加FileOperation. policy 策略文件
grant{
permission java.io.FilePermission "C://in.txt","read";
permission java.io.FilePermission "C://in.txt","write";
};
再运行appletviewer -J-Djava.security. policy=FileOperation. policy
FileOperationApplet.html
PDF 文件使用 "pdfFactory" 试用版本创建 www.fineprint.com.cn
Policy安全 策略
思考:能否通过增加FileOperation. policy
策略文件使 applet在浏览器上运行时可以
访问本地系统的文件
PDF 文件使用 "pdfFactory" 试用版本创建 www.fineprint.com.cn
安全管理器
lSecurityManager提供了很多checkXxx()方法,用来判断程序是否具备某
种权限,如果不具备这种权限,将抛出SecurityException
l默认的SecurityManager根据 policy文件来判断程序是否具备某种权限
l当程序读文件时,Java类库中的输入流的read方法会先调用
SecurityManager的checkRead()方法
l当程序读文件时,Java类库中的输出流的write方法会先调用
SecurityManager的checkWrite()方法
PDF 文件使用 "pdfFactory" 试用版本创建 www.fineprint.com.cn
安全管理器
默认情况下,
l独立应用程序没有安全管理器
lapplet的安全管理器是sun. applet.AppletSecurity
参见SecurityManagerTest.java
分别将这个程序作为独立应用程序运行
JavaSecurityManagerTest
再作为 applet运行,看输出结果.
appletviewer SecurityManagerTest.html
PDF 文件使用 "pdfFactory" 试用版本创建 www.fineprint.com.cn
安全管理器
l可以为独立应用程序设定安全管理器
System.setSecurityManager( newSecurityManager());
l不能修改 applet的安全管理器
参见SecurityManagerTest.java
分别将这个程序作为独立应用程序运行
JavaSecurityManagerTest
再作为 applet运行,看输出结果.
appletviewer SecurityManagerTest.html
PDF 文件使用 "pdfFactory" 试用版本创建 www.fineprint.com.cn
编写自己的安全管理器
l可以编写自己的安全管理器,继承SecurityManager
l覆盖SecurityManager的有关checkXxx()方法
l参见MySecurityManager,在MySecurityManager中对文件的读写权限作
了限定,必须先输入正确的口令,才能读写文件.
PDF 文件使用 "pdfFactory" 试用版本创建 www.fineprint.com.cn
MySecurityManager
public voidcheckRead(String filename)
{
if (!VerifyPassword())
throw newSecurityException("Dontread!");
else
System.out.println("checkRead(String filename)");
}
public voidcheckWrite(String filename)
{
if (!VerifyPassword())
throw newSecurityException("Dontwrite!");
else
System.out.println("checkWrite(String filename)");
}
PDF 文件使用 "pdfFactory" 试用版本创建 www.fineprint.com.cn
SecurityTest
1.如果将SecurityTest的安全管理器设为SecurityManager, 运行该程
序,将抛出java.security.AccessControlException
2.如果将SecurityTest的安全管理器设为MySecurityManager, 运行该
程序,只有输入正确的口令,才会正常运行.
思考:在第一种情况下,如何使SecurityTest具有对 文件读写权限
PDF 文件使用 "pdfFactory" 试用版本创建 www.fineprint.com.cn
lPolicy安全 策略
l安全管理器
PDF 文件使用 "pdfFactory" 试用版本创建 www.fineprint.com.cn
Policy安全 策略
lJava在安全 策略文件中为程序指定权限
系统 策略: JDK_HOME/jre/lib/security/java. policy
grant {
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";
...
};
PDF 文件使用 "pdfFactory" 试用版本创建 www.fineprint.com.cn
Policy安全 策略
lJava默认识别两种 策略:
系统 策略: JDK_HOME/jre/lib/security/java. policy
用户 策略: 存放于用户目录(系统属性user.home指定的目录)下的
java. policy文件.
l可以通过java.security. policy系统属性指定其它 策略
1.指定的 策略文件补充系统 策略和用户 策略
java -Djava.security. policy=mytest.policyAccessControlTest
2.指定的 策略文件代替系统 策略和用户 策略
java -Djava.security. policy==mytest.policyAccessControlTest
PDF 文件使用 "pdfFactory" 试用版本创建 www.fineprint.com.cn
Policy安全 策略
l缺省情况,小应用程序不能读本地系统的硬盘
参见FileOpeartionApplet.java,在这个 applet中对本地文件进行读
写,将抛出如下异常
java.security.AccessControlException: access denied (java.io.FilePermissionc:/in.txt read)
java.security.AccessControlException: access denied (java.io.FilePermissionc:/in.txt write)
运行appletviewer FileOperationApplet.html
PDF 文件使用 "pdfFactory" 试用版本创建 www.fineprint.com.cn
Policy安全 策略
l可以扩大 applet的安全范围
l增加FileOperation. policy 策略文件
grant{
permission java.io.FilePermission "C://in.txt","read";
permission java.io.FilePermission "C://in.txt","write";
};
再运行appletviewer -J-Djava.security. policy=FileOperation. policy
FileOperationApplet.html
PDF 文件使用 "pdfFactory" 试用版本创建 www.fineprint.com.cn
Policy安全 策略
思考:能否通过增加FileOperation. policy
策略文件使 applet在浏览器上运行时可以
访问本地系统的文件
PDF 文件使用 "pdfFactory" 试用版本创建 www.fineprint.com.cn
安全管理器
lSecurityManager提供了很多checkXxx()方法,用来判断程序是否具备某
种权限,如果不具备这种权限,将抛出SecurityException
l默认的SecurityManager根据 policy文件来判断程序是否具备某种权限
l当程序读文件时,Java类库中的输入流的read方法会先调用
SecurityManager的checkRead()方法
l当程序读文件时,Java类库中的输出流的write方法会先调用
SecurityManager的checkWrite()方法
PDF 文件使用 "pdfFactory" 试用版本创建 www.fineprint.com.cn
安全管理器
默认情况下,
l独立应用程序没有安全管理器
lapplet的安全管理器是sun. applet.AppletSecurity
参见SecurityManagerTest.java
分别将这个程序作为独立应用程序运行
JavaSecurityManagerTest
再作为 applet运行,看输出结果.
appletviewer SecurityManagerTest.html
PDF 文件使用 "pdfFactory" 试用版本创建 www.fineprint.com.cn
安全管理器
l可以为独立应用程序设定安全管理器
System.setSecurityManager( newSecurityManager());
l不能修改 applet的安全管理器
参见SecurityManagerTest.java
分别将这个程序作为独立应用程序运行
JavaSecurityManagerTest
再作为 applet运行,看输出结果.
appletviewer SecurityManagerTest.html
PDF 文件使用 "pdfFactory" 试用版本创建 www.fineprint.com.cn
编写自己的安全管理器
l可以编写自己的安全管理器,继承SecurityManager
l覆盖SecurityManager的有关checkXxx()方法
l参见MySecurityManager,在MySecurityManager中对文件的读写权限作
了限定,必须先输入正确的口令,才能读写文件.
PDF 文件使用 "pdfFactory" 试用版本创建 www.fineprint.com.cn
MySecurityManager
public voidcheckRead(String filename)
{
if (!VerifyPassword())
throw newSecurityException("Dontread!");
else
System.out.println("checkRead(String filename)");
}
public voidcheckWrite(String filename)
{
if (!VerifyPassword())
throw newSecurityException("Dontwrite!");
else
System.out.println("checkWrite(String filename)");
}
PDF 文件使用 "pdfFactory" 试用版本创建 www.fineprint.com.cn
SecurityTest
1.如果将SecurityTest的安全管理器设为SecurityManager, 运行该程
序,将抛出java.security.AccessControlException
2.如果将SecurityTest的安全管理器设为MySecurityManager, 运行该
程序,只有输入正确的口令,才会正常运行.
思考:在第一种情况下,如何使SecurityTest具有对 文件读写权限
PDF 文件使用 "pdfFactory" 试用版本创建 www.fineprint.com.cn