`

java安全管理器

    博客分类:
  • jvm
 
阅读更多

每个Java应用都可以有自己的安全管理器,它是防范恶意攻击的主要安全卫士。安全管理器通过执行运行阶段检查和访问授权,以实施应用所需的安全策略,从而保护资源免受恶意操作的攻击。实际上,安全管理器根据Java安全策略文件决定将哪组权限授予类。然而,当不可信的类和第三方应用使用JVM时,Java安全管理器将使用与JVM相关的安全策略来识别恶意操作。在很多情况下,威胁模型不包含运行于JVM中的恶意代码,此时Java安全管理器便不是必需的。当安全管理器检测到违反安全策略的操作时,JVM将引发AccessControlException或SecurityException。

    在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()).
 
 
 运行权限检查:
如当前应用程序执行new FileInputStream(“a.txt”),java会检查当前代码有没有读”a.txt”的权限.
步骤:
1           调用SecurityManager.checkRead()方法
2           调用AccessControl.checkPermission()方法,执行栈检查

实现安全管理器步骤:

(1) 创建一个SecurityManager的子类;
(2) 覆盖一些方法。
import java.io.*;

public class TestSecurity
{
   public static void main(String args[])
   {
        try {
               System.setSecurityManager(new PasswordSecurityManager("123456"));
            } catch (SecurityException se) {
                System.out.println("SecurityManager already set!");
            }
        try {
            //DataInputStream fis = new DataInputStream(new FileInputStream("input.txt"));
            BufferedReader fis = new BufferedReader(new FileReader("input.txt"));
            //DataOutputStream fos = new DataOutputStream( new FileOutputStream("output.txt"));
            BufferedWriter fos = new BufferedWriter(new FileWriter("output.txt"));
            String inputString;
            while ((inputString = fis.readLine()) != null) {
        //fos.writeBytes(inputString);
        //fos.writeByte('\n');
        fos.write(inputString);
        fos.write('\n');
            }
            fis.close();
            fos.close();
        } catch (IOException ioe) {
            System.out.println("I/O failed for SecurityManagerTest.");
        }catch(Exception e)
        {
           System.out.println(e.toString());
        }
      
   }
}
 
 
import java.io.*;
class PasswordSecurityManager extends SecurityManager {
private String password;
PasswordSecurityManager(String password) {
    super();
    this.password = password;
}
private boolean accessOK() {
    int c;
    //DataInputStream dis = new DataInputStream(System.in);
    BufferedReader dis = new BufferedReader(new InputStreamReader(System.in));
    String response;
    System.out.println("What's the secret password?");
    try {
        response = dis.readLine();
        if (response.equals(password))
            return true;
        else
            return false;
    } catch (IOException e) {
        return false;
    }
}
public void checkRead(FileDescriptor filedescriptor) {
    if (!accessOK())
        throw new SecurityException("Not a Chance!");
}
public void checkRead(String filename) {
    if (!accessOK())
        throw new SecurityException("No Way!");
}
public void checkRead(String filename, Object executionContext) {
    if (!accessOK())
        throw new SecurityException("Forget It!");
}
public void checkWrite(FileDescriptor filedescriptor) {
    if (!accessOK())
        throw new SecurityException("Not!");
}
public void checkWrite(String filename) {
    if (!accessOK())
        throw new SecurityException("Not Even!");
}

分享到:
评论

相关推荐

    java外卖系统源码-remote-code-execution-sample:演示Java安全管理器的使用如何防止远程代码执行(RCE)攻击

    安全管理器来防止远程代码执行漏洞。 Java 安全管理器 由于 JEP 411(以及这里已经指出的其他原因),提到的启用 Java 安全管理器的具体解决方案是不切实际的。 然而,它的思想,即采用强制访问控制技术仍然非常适用...

    ProGrade:Java 安全管理器变得简单-开源

    专业级库提供自定义 Java 安全管理器和安全策略的实现。 主要组件是带有拒绝规则和策略文件生成器的 Java 安全策略实现。

    Java安全_使用JavaAPI管理证书

    Java安全_使用JavaAPI管理证书

    java任务管理器基础代码

    java任务管理器基础代码(基于Android)

    Java安全中文版

    本书系《Java安全》第二版,内容涉及安全管理器、类装载器、存取控制器以及java.security包等。此外还讨论了消息摘要、证书和数字签名,并介绍了如何利用Java所提供的功能建立类签名,以及如何自行实现签名功能。...

    Java安全权限控制机制研究综述.pdf

    通过对java安全体制中权限控制机制的研究,探讨了java安全管理器、权限类、安全策略文件、自定制权限类等底层技术,提出通过这些技术,程序员可以细致的控制各个安全访问权限。

    Java教务管理系统源码 springboot教务系统源码

    Java教务管理系统源码 springboot教务系统源码 功能介绍: 校区管理 班级管理 学生管理 满意度管理 数据汇总 知识管理 总部督查 系统监控 系统工具 系统管理 后台:SpringBoot2.x + MyBatis3.x + Shiro1.4 + ...

    java 图书管理系统(Java源码 + Mysql数据库).rar

    【实例简介】图书管理系统 Java MySQL 完整实训代码,MVC三层架构组织,包含所有用到的图片资源以及数据库文件,大四上学期实训,注释很详细,按照阿里巴巴Java编程规范编写, SSM(spring spring MVC mybatis)开发...

    基于java实现的数据库管理系统.7z

    大二下学期,用Java的javadbf4.1jar包辅助开发的数据库管理系统课程设计,模仿了Java的 从.java到.class再到类加载执行的过程对SQL语句进行先编译再执行,时间有限,,只有一 星期时间,细节方面没考虑很多,代码也...

    基于Java的安全管理平台系统的开发.pdf

    基于Java的安全管理平台系统的开发.pdf

    java 插件包(用于Cisco安全管理器SDM 2.41中文)

    java 插件包(用于Cisco安全管理器SDM 2.41中文)

    Java设计模式综合应用之密码管理器桌面离线版

    该密码管理器应用由Java语言编写,使用了GUI框架Swing,以MySQL5.7作为后台数据库管理系统进行开发。在该密码管理器的开发中,我们主要使用了创建型模式的工厂方法模式,结构型模式的装饰者模式,以及行为型模式的...

    Java项目工时管理系统源码.zip

    Java项目管理系统(oak project),是一款轻量级项目管理工具,目前包括工时统计、原型预览、效果图管理等功能。。 工时:工时统计可通过员工工时上报的方式,来记录项目所花费的工时,帮助企业进行项目工时统计、...

    酒店管理系统JAVA源代码

    q 人员管理:该模块主要包括档案管理、管理员管理和操作权限管理功能,其中管理员管理功能用来管理系统的操作员,权限管理功能用来管理系统操作员具有的操作权限。 q 初始化系统:该功能用来对系统进行初始化,初始...

    JAVA门户管理系统

    JAVAPMS是JAVA门户管理系统(JAVA Portal Management System)的简称,以Sping+Hibernate+Freemarker+...是一款技术先进、安全稳定、操作友好、注重用户体验的JAVA门户管理系统,倾力打造JAVA、JSP门户管理系统品牌。

    Java洗衣店智能管理系统源码.zip

    Java洗衣店智能管理系统:实现对洗衣店的一体化管理,集前台衣物管理系统、会员卡管理系统、 财务报表系统等功能于一身,提高洗衣店的管理效率和服务水平。 技术选型: 核心框架:Spring Boot 2.3 安全框架:...

    java图书信息管理系统课程设计报告.pdf

    其安全性。尤其对于复杂的信息管理,计算机能够充分发挥它的优越性。计算机进 行信息管理与管理信息系统的开发密切相关,系统的开发是系统管理的前提。本系 统就是为了管理好图书馆信息而设计的。图书馆作为一种信息...

    java期末大作业学生信息管理系统源代码.zip

    java期末大作业学生信息管理系统源代码。本系统大致分为三个模块,学生端,系管理员端与超级管理员端。 软件架构 学生端 学生端功能: 认证方面 有学生注册,登录,激活与忘记密码。其中激活是通过邮箱进行激活的,...

    基于Java设计的超市库存管理软件源码+说明文档资料.zip

    基于Java设计的超市库存管理软件源码+说明文档资料 库存管理系统是一个企业、单位在进行大量商品统一管理时不可缺少的部分,它的内容对于企业的决策者和管理者来说都是至关重要的。库存管理系统可广泛适用于批发、...

    java 后台权限管理系统

    是一个简单高效的后台权限管理系统。项目基础框架采用全新的Java Web开发框架 —— Spring Boot2.0.4,消除了繁杂的XML配置,使得二次开发更为简单;数据访问层采用Mybatis,同时引入了通用Mapper和PageHelper插件,...

Global site tag (gtag.js) - Google Analytics