• 1. 中国矿业大学Java安全体系结构By 梦朝思夕
  • 2. 一,Java体系结构Java体系结构包括四个独立但相关 的技术:Java程序设计语言 Java class文件格式 Java应用编程接口(Java API) Java虚拟机
  • 3. 1.1 Java三大特性Java三大特性: 平台无关性(有条件的) 安全性 网络移动性
  • 4. 类装载器就是一个能够制造出字节码数据的制造器
  • 5. 1.2 Java与C++比较Java与C++的差异:Java不支持结构和指针; 自动内存管理和线索控制。 Java的编译和C/C++大有不同
  • 6. 1.3 Java虚拟机简介 Java虚拟机只是一种抽象的规范。Java虚 拟机的天职——运行Java程序。Java虚拟机的执行引擎: 一次性解释字节码 即时编译器 自适应优化器
  • 7. JVM可以使用纯粹的软件来实现,也可以很大 部分有硬件实现。 当Java虚拟机是有主机操作系统上的软件实现 的时候,Java程序可以通过调用本地方法和主机 交互。Java方法种类: Java方法——由Java语言编写; 本地方法——系统本身的方法,由其他语言编 写(C\C++等)。Java真的是与平台无关性吗???
  • 8. Java语言是一个面向对象的。Java语言提供类、 接口和继承等原语,为了简单起见,只支持类之间 的单继承,但支持接口之间的多继承,并支持类与 接口之间的实现机制(关键字为implements)。 Java语言全面支持动态绑定,而C++ 语言只对虚函 数使用动态绑定。总之,Java语言是一个纯的面向 对象程序设计语言。 ——百度百科真的“完全面向对象”吗!? 面向对象语言是一类以对象作为基本程序结构单位 的程序设计语言,指用于描述的设计是以对象为核心,而 对象是程序运行时刻的基本成分。语言中提供了类、继承 等成分。
  • 9. Java是一种不完全面向对象的编程语言!
  • 10. 二,Java安全基础 为什么需要安全!? 随着互联网应用越来越广泛,并且互联网其本身独特的资源 共享性,因此能够按照用户需求及时准确获得信息和处理信息的应 用对用户而言就相当重要,这也是Java得以迅速发展和被广泛接受 的原因。但同时网络也提供了一条攻击接入计算机的潜在途径,特 别是当用户下载网络软件在本地运行,这就要求Java能够对病毒/木 马的问题加以防范,对信息以及本地环境进行保护。比如我们浏览 一个网页的时候,网页上的Applet可能会自动下载并且运行,而这 个Applet完全有可能来自不可靠的地方,又或者我们使用通过JINI服 务查找到的网络上不可靠的服务对象来获得服务,如果没有Java体 系结构提供的安全机制,这就很有可能引入了一个怀有敌意的程序 造成信息丢失、资料泄密、相信伪造数据和修改本地计算机安全设 置等等后果,带来未知的严重后果。
  • 11. 2.1, Java语言本身安全性 Java语言的设计者们是在C++的基础上设计出来Java的,因此与 C++相比它的语法更加简单清晰,结构、单元、运算符重载、虚拟基 础类等在Java中都没有采用,并且取消了多重继承而采用实现多个 接口的方式。这样能降低开发人员犯错误的几率,帮助他们写出更 安全的代码。 Java中去除了C++语言中的令人费解、容易出错的"指针", 用列表、堆、哈希表等结构来代替,避免了任何不安全的结构。 Java也没有索引核查的数组访问,因为这往往会导致不定的不可 预测的程序操作,它所有的数组访问都必须先检查是否越界。Java 要求所有的变量在初始化以前不能使用,对于基本数据类型变量都 会自动地赋给某个初始值,避免了未初始化变量获取内存信息。所 有这些都使得程序不能访问任意的内存地址,对于内存中的实体信 息只能通过有权限的对象进行访问,而不会出现象C++那样把类型 指针强制转换成内存的指针,然后通过内存查找的方法找到私有的 变量。
  • 12. Java分配内存对于开发人员来说是透明的,开发人员使用new 方法新建对象,这时候虚拟机就会从堆内存中找到合适的内存空间, 开发人员不需要也不能够进行干预。而对于内存的回收,Java避免 了开发人员明确干预对象的回收,比如C的free或C++的delete命令, 避免了开发人员无意间对内存的破坏。Java采用虚拟机的"垃圾回 收“机制来实现的内存自动管理,释放不再被使用的内存资源,内 存回收器就像一台垃圾收集车,但是和我们在大街上看到的收集车, 仅仅收集大家放在垃圾桶里面的垃圾不同的是,它还要到你家里去 帮你找出那些东西是不要用的垃圾,然后把这些东西拿走,最后还 要整理家里的空间,腾出最大的空间让你放新东西。Java的内存回 收器目的就是找到不再引用的对象,释放内存空间,并且需要整理 内存的碎片空间,尽量避免出现"内存不足"的情况2.2, Java内存分配安全性
  • 13. 三,Java安全模型的体系结构Java 的安全平台有两部分组成: Java 2 安全体系内核 Java加密体系(JCA) Java的安全好象是目前的编程语言中最优秀的 一种,Java技术之所以适用于网络就是因为它有完 备的、设计到其结构中的安全模式
  • 14. Java各个版本提供的安全功能: JDK 1.0:沙箱技术 JDK 1.1:基于代码签名和认证 JDK 1.2—1.4:细粒度访问控制 JDK 1.5:安全令牌、保护域3.1 Java各个版本安全功能
  • 15. 3.2 Java沙箱技术 Java程序在它的沙箱内可做任何事情,但出此 边界就不能有任何操作。沙箱禁止的操作: 禁止对本地磁盘的读写; 除了下载此Applet的主机外不能与任何别的主机 连接; 禁止建立一个新的进程; 禁止载入一个直接调用本地方法的新的动态库。
  • 16. 3.3 基于代码签名和认证 Java的沙箱技术是Java安全体系结构中第一道 防线。但其是有缺点的,那就是管得太多太严了。 在版本1.1中,Java的安全体系结构得到了进一 步的发展。引进了基于签名和认证的信任模式。签 名和认证使得接收端可以确认一系列的class文件( 在一个JAR文件中)已经由某一实体进行了数据签 名(有效,可信赖),并且签名后这些class文 件没有被改动。这就使得终端用户和管理员减少对 某些源代码在沙箱的限制,但这些代码必须有可信 任的团体进行数字签名。
  • 17. 3.4 细粒度访问控制1.1版本的代码签名和认证有两个漏洞: 善意的代码,也会有bug 需要用户自己编写安全管理器 细粒度模型,通俗的讲就是将业务模型中的对象加以细 分,从而得到更科学合理的对象模型,直观的说就是划分出很 多对象. 所谓细粒度的划分就是在pojo类上的面向对象的划 分,而不是在于表的划分上。 ----百度百科有的操作是允许,有的是不允许!
  • 18. 3.5 类载入程序体系结构 Java沙箱主要是由类装载器、Class文件检验器 和安全管理器组成的。类装载器就是沙箱技术的第 一道防线。类装载器体系结构在沙箱中作用: 它防止恶意代码去干涉善意的代码; 它守护了被信任的类库的边界; 它将代码归入某类(称为保护域),该类确定 了代码可以进行哪些操作。
  • 19. 3.5.1防止恶意代码去干涉善意的代码 防止恶意代码去干涉善意的代码,这是由不同的类 装载器装入的类提供不同的命名空间来实现的。命名空间 有一系列唯一的名称组成,每一个被装载的类都有一个名 字,这个命名空间是有Java虚拟机为每一个类装载器维护 的。
  • 20. 在Java虚拟机中,同一个命名空间内的类可以 直接地进行交互,而不同的命名空间内的类甚至不 能察觉彼此的存在,除非显式地提供了允许它们交 互的机制。 一旦加载后,如果一个恶意类被赋予权限访问 其他虚拟机加载的当前类,他就可以潜在地知道一 些它不应该知道的信息或者干扰程序的正常运行。不该问的不问,不该知道的不知道
  • 21. 3.5.2守护了被信任的类库的边界 守护了被信任的类库的边界,这是通过分别 使用不同的类装载器可靠的包和不可靠的包来实现 的。虽然通过赋值成员受保护(或包访问)的访问 限制,可以在同一个包中的类型间授予访问的特殊 权限,但这种特殊权限只能授予在同一个包中的运 行时成员,而且它们必须是由同一个类装载器装载 的。
  • 22. 类装载器启动类装载器——虚拟机创建用户自定义类装载器——用户创建用户自定义类装载器是采用双亲委派模式的
  • 23. 启动类装载器标准扩展类装载器类路径类装载器自定义类装载器
  • 24. 类装载器保护被信任的类库的边界方法: 类装载器的“双亲委派模式” 通过简单地拒绝装载特定的禁止类型
  • 25. 3.6 class文件检验器 class文件检验器是为了保证程序的健壮 性。class文件检验器的扫描过程: 第一趟:class文件的结构检查 第二趟:类型数据的语义检查 第三趟:字节码验证 第四趟:符号引用的验证
  • 26. 3.6.1第一趟:class文件的结构检查 在第一趟扫描中,对每一段将被当作类型导入的字节 序列。class文件检验器都会确认它是否符合Java class的基本 结构。比如检查魔数:0xCAEFBABE。这个魔数的用处是让 class文件分析器很容易检测出某个文件有明显问题而加以 拒绝。所以class文件检验器第一件事就是检查导入class文 件是否以0xCAEFBABE开头。 而且,在第一趟扫描中,class文件检验器必须检验确 认这个class文件没有删节,尾部也没有附带其他的字节。 就一句:class文件检验器是保证class 文件遵从class文件的固定格式。
  • 27. 3.6.2 第二趟:类型数据的语义检查 在这趟扫描中,检验器查看每个组成部分,确 认它们是否是其所属类型的实例,它们的结构是否 正确。另外,class文件检验器检测这个类本身是否 符合特定的条件,它们是由Java编程语言规定的。 就一句,确认class文件的语义正确。
  • 28. 3.6.3 第三趟:字节码验证 在这趟扫描中,Java虚拟机对字节流进行 数据流分析,这些字节流代表的是类的方法。 它是有称为操作码的单字节指令组成的序列, 每一个操作码后都跟着一个或多个操作数。 就一句话,确认Java程序的堆栈正确。
  • 29. 3.6.4 第四趟:符号引用的验证 在这趟扫描中,Java虚拟机将追踪那些引用 ——从被验证的class文件到被引用的class文件,以 确保这个引用的正确。因为第四趟扫描必须检查被 检测的class文件意外的其他类,所以这次扫描可能 会装载新的类。大多数Java虚拟机的实现采用了延 迟装载类的策略,直到类真正地被程序使用时在装 载。在这趟扫描中Java虚拟机要执行两个基本的任务: 查找被引用的类(如果有必要就装载它); 将符号引用替换为直接引用,这样当它再次遇到 相同的引用时,可以立即使用,不必再花时间解 析这个引用。
  • 30. 3.7 Java虚拟机中内置的安全特性 Java虚拟机装载了一个类,并且对它进行了第一到第 三趟的class文件检验,这些字节码可以被运行了。除了对 符号引用的检验(class文件检验的第四趟扫描),Java虚拟 机在执行字节码是还进行其他一些内置的安全机制。这些机制是Java虚拟机的特性: 类型安全的引用转换; 结构化的内存访问(无指针算法); 自动垃圾手机(不必显式地释放被分配的内存); 数组边界检查; 空引用检查。
  • 31. Java是没有指针的,那Java虚拟机如何指明运 行时的数据空间的分布呢? 运行是数据空间是指一些内存空间,Java虚拟机用 这些空间来存储运行一个Java程序时所需要的数据: Java栈(每一个线程)、一个存储字节码的方法区, 以及一个垃圾收集堆(它用来存储有运行的程序创 建的对象)。查看class文件是无法找到内存地址的 。当Java虚拟机装载一个class1文件时,由它决定这 些字节码以及其他从class文件中解析得到的数据放 置内存的什么地方。所以凭借class文件无法找到 Java虚拟机的内存分布。 就一句话:禁止内存进行非结构化访问。
  • 32. 你也许会有疑问,我们说的都是在Java虚拟机 中的,那程序可不可以突破虚拟机调用本地方法呢 ??? 为此,安全管理器中包含一个方法,该方法 用来确认一个程序是否能转载对于爱连接库,因为 在调用本地方法时动态链接库是必需的。当线程调 用本地方法时,这个线程就跳出了沙箱;因此,对 于本地方法,调用本地方法前必须是确认它是安全 的。
  • 33. Java虚拟机还有最后一个机制保障安全—— 异常的结构化错误处理 因为Java虚拟机支持异常,所以一些违反安全 的行为发生时,它会做一些结构化的处理,Java虚 拟机将抛出一个异常或错误,而不是崩溃。
  • 34. 3.8 安全管理器和Java API Java安全模型的前三个部分———类装载器、 class文件检验器以及Java内置安全特性——一起达 到一个共同的目的:保持Java虚拟机的实例和他正 在运行的应用存储的内部完整性,使它们不被下载 的恶意或有bug的善意程序侵犯。 安全管理器主要是保护虚拟机的外部资源不 被虚拟机内运行的恶意或有bug的善意程序侵犯。 在运行的Java虚拟机中,安全管理器在访问控制 ——对于外部资源的访问控制——中起中枢作用。
  • 35. 安全管理器定义了沙箱的外部边界。它是可以 定制的,可以根据自己的需求重写安全管理器。当 Java API进行任何可能不安全的操作时,他都会想安 全管理器请求许可,从而强制执行自定义的安全策 略。安全管理器就是java.lang.SecurityManager。 如果已使用 System.setSecurityManager(java.lang.SecurityManager) 设置了安全管理器
  • 36. 3.9 Java安全机制结论类载入程序的体系结构用二种方法帮助建立 Java的安全模式: 把代码分离到不同的命名空间并在不同命 名空间的代码间设置保护屏; 保护像Java API这样已获确认的库。
  • 37. 为了发挥Java类载入程序体系结构在安全性方 面的作用,程序员们必须正确使用它的上述二种功 能。为利用命名空间所形成的保护,不同来源的代 码应用不同的类载入程序对象来装入;为利用受信 任的包得到的保护,编写的类载入程序必须对照受 限制的和被禁止的包的名单来检查所需求的类的命 名。
  • 38. 在JDK1.1中,本地应用程序和正确数字化签名 的applet对重要的系统资源有完全的访问权限。而 未签名的applet则只能访问沙箱提供的有限的资源。 安全管理器负责确定可以容许什么样的资源访问。 Java 2 SDK(JDK1.2-JDK1.4)安全体系结构是基于 政策的并且容许细粒度的访问控制。当代码被加载 时,基于当前有效的安全政策授予相应的许可权限 。许可权限和政策等新概念使得SDK提供了细粒度 、高可配置、弹性以及可扩展的访问控制。这种访 问控制不仅可以为applet指定,也可以为应用程序 、beans 和servlet指定。
  • 39. 4 Java安全体系结构展望未来1、资源消耗管理 在某些情况下,资源消耗管理比较容易实现 (例如,在任意时候限制任意应用程序能够弹出的 窗口数),而在另外一些情况下有效的实现则比较 困难(例如,限制内存和文件系统的使用)。
  • 40. 2、许可权限的任意成组 首先,在分发一个超级许可权限、创建一个固 定的许可权限或者有名字的许可权限类以表示静态 指定的许可权限组时或者在安全政策文件中指定许 可权限成员时,需要理解给予了什么样的实际许可 权限。第二,处理安全政策文件变得更加复杂,因 为成组的许可权限可能需要扩展。另外,成组的许 可权限嵌套增加了复杂性。
  • 41. 3、基于对象层次的保护 考虑到Java编程语言的面向对象性质,开发人 员会从一些合适的基于对象层次保护机制中受益: (1):这些机制超越了Java编程语言提供的 自然保护; (2):补充了基于线程的访问控制机制。
  • 42. 4、保护域划分 为了便利,可以把系统域当成一个所有系统代 码的大集合 。为了更好的保护,尽管系统代码应该 运行在多个系统域中,在那里每个域都保护一个特 定类型的资源并且授予一个特定的权限集。例如, 如果文件系统代码和网络系统代码运行在单独的域 中,则前者没有权利访问网络资源,而后者没有权 利访问文件系统资源,这样系统域中错误和安全漏 洞的风险和结果更可能被限制在它的边界内。
  • 43. 四 Java反编译技术 java诞生于1995年,是一门较年轻的语言。它以平台 无关性,安全性,面向对象,分布式,键壮性等特点赢得 了众多程序员的青睐。特别是它简洁的面向对象的语言风 格,更让许多人对它爱不释手。但人们在使用java的过程中 ,会发现它有几个致命的弱点:运行速度慢,用户使用不 便,源代码保护机制不够安全。特别是在保护源代码方面 ,java是基于解释一种叫java字节码的中间代码来运行其程 序的,而且jvm比计算机的微处理器要简单的多,文档也很 齐全,结果造成其目标程序很容易被反编译,而且所得代 码和其原始代码十分相似,甚至可以一模一样,可读性相 当好。这就给java的代码保护带来了不利。
  • 44. 4.1 防反编译 目前关于JAVA程序的加密方式不外乎JAVA混淆 处理(Obfuscator)和运用ClassLoader方法进行加密 处理这两种方式(其他的方式亦有,但大多是这两 种的延伸和变异)。
  • 45. 4.1.1 混淆处理 关于JAVA程序的加密方式,一直以来都是以JAVA混淆 处理(Obfuscator)为主。这方面的研究结果也颇多,既有 混淆器(如现在大名鼎鼎的JODE,SUN开发的JADE),也有 针对反编译器的"炸弹"(如针对反编译工具Mocha的 "炸弹“ Crema和HoseMocha)。混淆器,从其字面上,我们就可以 知道它是通过混淆处理JAVA代码,具体的说,就是更换变量 名,函数名,甚至类名等方法使其反编译出来的代码变得 不可理解。它的目的是:让程序无法被自动反编译,就算 被反编译成功,也不容易被程序员阅读理解。 其实这只是做到了视觉上的处理,其业务逻辑却依然 不变,加以耐心,仍是可以攻破的,如果用在用户身份验 证等目的上,完全可以找到身份验证算法而加以突破限制。
  • 46. 4.1.2 采用ClassLoader加密 JAVA虚拟机通过一个称为ClassLoader的对象装 来载类文件的字节码,而ClassLoader是可以由JAVA 程序自己来定制的。ClassLoader是如何装载类的呢? ClassLoader根据类名在jar包中找到该类的文件,读 取文件,并把它转换成一个Class对象。该方法的原 理就是,对需加密的类文件我们先行采用一定的方 法(可以是PGP, RSA, MD5等方法)进行加密处 理,我们可以在读取文件之后,进行解密后,再转 换成一个Class对象。
  • 47. 4.2 对性能及稳定性的影响1.加密过的程序会遇到的问题 由于解密需要一定的时间,如果不加区分的全部进行 加密处理,势必会影响到程序的速度和响应。所以应该在 需要加密的地方才加密,比方说,用户密码验证,专利算 法,或者是数据库密码等等,这样的才不会导致系统的性 能下降。对于稳定性还没有看见有对稳定性影响的说明。2.混淆过的程序会遇到的问题 通常效率会变差,更严重的情况是可能无法执行。 对于稳定性还没有看见有对稳定性影响的说明。
  • 48. Thanks!!!
  • 49. (本页无文本内容)