java 安全管理概念,代码签名和安全设置
2009-08-22 20:19
218 查看
安全管理器让java代码访问外部资源的时候受到一层过滤。就像classloader和class文件检验器是检测java文件一样,从2个方面保证了代码的安全性。
在Java应用中,安全管理器是由System类中的方法setSecurityManager设置的。要获得当前的安全管理器,可以使用方法getSecurityManager。
java.lang.SecurityManager类包含了很多checkXXXX方法,如用于判断对文件访问权限的checkRead(String file)方法。这些检查方法调用SecurityManager.checkPermission方法,后者根据安全策略文件判断调用应用是否有执行所请求的操作权限。如果没有,将引发SecurityException。
如果想让应用使用安全管理器和安全策略,可在启动JVM时设定-Djava.security.manager选项,还可以同时指定安全策略文件。如果在应用中启用了Java安全管理器,却没有指定安全策略文件,那么Java安全管理器将使用默认的安全策略,它们是由位于目录$JAVA_HOME/jre/lib/security中的java.policy定义的。
概念
策略(Policy)
类装载器用Policy对象帮助它们决定,把一段代码导入虚拟机时应该给它们什么样的权限. 任何时候,每一个应用程序都只有一个Policy对象.
策略文件
Sun的java1.2平台具体的Policy子类采用在一ASCII策略文件中用上下文无关文法描述安全策略.
一个策略文件包括了一系列grant子句,每一个grant子句将一些权限授给一个代码来源。
保护域(ProtectionDomain)
当类装载器将类型装入java虚拟机时,它们将为每一个类型指派一个保护域,保护域定义了授予
一段特定的代码的所有权限.装载入java虚拟机的每一个类型都属于一个且仅属于一个保护域.
访问控制器(AccessController)
implies()
判断一个Permissioin对象的权限,是否隐含(imply)在另一个Permissioin对象的权限中。
checkPermission()
AccessController的核心方法,这个方法决定一个特定的操作能否被允许.
它自顶向下检查栈,只要它遇到一个没有权限桢,它将抛出一个AccessControlException导常。
doPrivileged()
有的时候,调用栈较上层(更靠近栈顶)的代码可能希望执行一段代码,而这段代码在调用栈的较
下层是不允许执行的。
为了使可信的代码执行较不可靠的代码操作(这段不可靠的代码位于调用栈的较下层且没有执行
这个操作的权限),AccessController类重载了四个名为doPrivileged()的静态方法.
AccessController会忽略调用doPrivileged()方法的调用者的调用者的权限.
Permission:
权限是用抽象类java.security.Permission的一个子类的实例表示的.
CodeSource:
代码来源,包含代码库URL和签名者.
Permissions:
PermissionCollection(权限集合)的子类
装载时生成保护域的步骤:
1 根据指定的Policy文件生成一个Policy对象
2 生成CodeSource
3 用CodeSource在Policy中找到CodeSource对应的Permissions
4 用CodeSource和Permissons构造一个ProtectionDomain
5 把ProtectionDomain同这个类在方法区中的类数据联系起来(ClassLoader.defineClass()).
代码签名方式:
1.将待签名的class文件及**$1.class文件打成jar包
2.用jdk的keytool工具生成一对密钥:
keytool -genkey -alias 密钥别名 -keypass 密钥密码 -validity 密钥有效天数 -keystore 密钥文件名
3.用jdk的jarsinger工具和第二步生成的密钥对jar包数字签名:
jarsinger -keystore 密钥文件名 -storepass 签名密码 -keypass 密钥密码 jar文件名 代码签名者姓名
这样代码签名就完成了
在策略文件中 首先要加入密钥文件:keystore "密钥文件名";
grant signedBy 代码签名者姓名{ permission ****};
在程序中要手动加载安全管理器:
System.setProperty("java.security.policy", "策略文件");
System.setSecurityManager(new SecurityManager());
这样在执行动作时就会先进行权限检查,阻止恶意代码进行非法操作
在Java应用中,安全管理器是由System类中的方法setSecurityManager设置的。要获得当前的安全管理器,可以使用方法getSecurityManager。
java.lang.SecurityManager类包含了很多checkXXXX方法,如用于判断对文件访问权限的checkRead(String file)方法。这些检查方法调用SecurityManager.checkPermission方法,后者根据安全策略文件判断调用应用是否有执行所请求的操作权限。如果没有,将引发SecurityException。
如果想让应用使用安全管理器和安全策略,可在启动JVM时设定-Djava.security.manager选项,还可以同时指定安全策略文件。如果在应用中启用了Java安全管理器,却没有指定安全策略文件,那么Java安全管理器将使用默认的安全策略,它们是由位于目录$JAVA_HOME/jre/lib/security中的java.policy定义的。
概念
策略(Policy)
类装载器用Policy对象帮助它们决定,把一段代码导入虚拟机时应该给它们什么样的权限. 任何时候,每一个应用程序都只有一个Policy对象.
策略文件
Sun的java1.2平台具体的Policy子类采用在一ASCII策略文件中用上下文无关文法描述安全策略.
一个策略文件包括了一系列grant子句,每一个grant子句将一些权限授给一个代码来源。
保护域(ProtectionDomain)
当类装载器将类型装入java虚拟机时,它们将为每一个类型指派一个保护域,保护域定义了授予
一段特定的代码的所有权限.装载入java虚拟机的每一个类型都属于一个且仅属于一个保护域.
访问控制器(AccessController)
implies()
判断一个Permissioin对象的权限,是否隐含(imply)在另一个Permissioin对象的权限中。
checkPermission()
AccessController的核心方法,这个方法决定一个特定的操作能否被允许.
它自顶向下检查栈,只要它遇到一个没有权限桢,它将抛出一个AccessControlException导常。
doPrivileged()
有的时候,调用栈较上层(更靠近栈顶)的代码可能希望执行一段代码,而这段代码在调用栈的较
下层是不允许执行的。
为了使可信的代码执行较不可靠的代码操作(这段不可靠的代码位于调用栈的较下层且没有执行
这个操作的权限),AccessController类重载了四个名为doPrivileged()的静态方法.
AccessController会忽略调用doPrivileged()方法的调用者的调用者的权限.
Permission:
权限是用抽象类java.security.Permission的一个子类的实例表示的.
CodeSource:
代码来源,包含代码库URL和签名者.
Permissions:
PermissionCollection(权限集合)的子类
装载时生成保护域的步骤:
1 根据指定的Policy文件生成一个Policy对象
2 生成CodeSource
3 用CodeSource在Policy中找到CodeSource对应的Permissions
4 用CodeSource和Permissons构造一个ProtectionDomain
5 把ProtectionDomain同这个类在方法区中的类数据联系起来(ClassLoader.defineClass()).
代码签名方式:
1.将待签名的class文件及**$1.class文件打成jar包
2.用jdk的keytool工具生成一对密钥:
keytool -genkey -alias 密钥别名 -keypass 密钥密码 -validity 密钥有效天数 -keystore 密钥文件名
3.用jdk的jarsinger工具和第二步生成的密钥对jar包数字签名:
jarsinger -keystore 密钥文件名 -storepass 签名密码 -keypass 密钥密码 jar文件名 代码签名者姓名
这样代码签名就完成了
在策略文件中 首先要加入密钥文件:keystore "密钥文件名";
grant signedBy 代码签名者姓名{ permission ****};
在程序中要手动加载安全管理器:
System.setProperty("java.security.policy", "策略文件");
System.setSecurityManager(new SecurityManager());
这样在执行动作时就会先进行权限检查,阻止恶意代码进行非法操作
相关文章推荐
- java安全——数字签名+代码签名
- Oracle EBS无法启动,错误信息:您的安全设置已组织自签名的应用程序使用已过期的Java版本运行。
- java-信息安全(十三)-数字签名,代码签名【Java证书体系实现】
- Java学习笔记之语言基础――Java代码安全的概念
- Ubuntu 16.04 火狐添加java插件、解决Firefox强制低版本java插件运行以及安全设置限制自签名应用程序运行
- java-信息安全(十三)-数字签名,代码签名【Java证书体系实现】
- 您的 Java 代码安全吗?
- android 用java代码设置布局、视图View的宽度/高度或自适应
- java jvm学习笔记八(实现jar包的代码签名)
- java数据结构之树基本概念解析及代码示例
- Sonar 1.11版本发布,Java代码质量管理平台
- Eclipse中的java、xml代码提示功能设置
- java设置一段代码执行的超时时间的简单方法 间接实现获取Connection超时问题
- IE浏览器中Java小程序无法运行 应用程序已被安全设置阻止
- Android布局文件Value中设置格式字符串并在Java代码中使用的一点说明
- 微信公众号开发之设置自定义菜单实例代码【java版】
- JAVA代码安全检测
- 【设置Java的安全策略】
- MyEclipse设置Java代码注释模板
- java安全沙箱(四)之安全管理器及Java API