「java安全举荐」Java安全性
今天给各位分享java安全举荐的知识,其中也会对Java安全性进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:
- 1、Java的安全机制有哪些?
- 2、JAVA的安全结构
- 3、为什么java的安全性比较高
- 4、为了保证软件的安全性,Java采用了那些措施?
- 5、JAVA的安全性究竟怎样体现出来
- 6、java的安全性体现在哪里
Java的安全机制有哪些?
》类装载器结构
(class
loader)
》class文件检查器
(the
class
file
verifier)
》内置于Java虚拟机(及语言)的安全特性
》安全管理器及Java
API
(security
manager)
在Java沙箱中,类装载器体系结构是第一道防线。它在三个方面对Java的沙箱起作用:
1它防止恶意代码区干涉善意的代码
2它守护了被信任的代码的边界
3它将代码归于某类(称为保护域),该类确定了代码可以进行哪种操作
Class文件检查器:
Class文件检查器保证装载的class文件内容有正确的内部结构,并且这些class文件互相间协调一致。Class文件检查器实现的安全目标之一就是程序的健壮性。如果某个有漏洞的编译器,或某个聪明的黑客,产生了一个class文件,而这个class文件中包含了一个方法,则合格方法的字节码中含有一条跳转到方法之外的指令,那么,一旦这个方法被调用,它将导致虚拟机的崩溃,所以,处于对健壮性的考虑,由虚拟机检验它装载的字节码的完整性非常重要。
Class文件检查器要进行四趟独立的扫描来完成它的操作。
第一趟:Class文件的结构检查
在这一趟扫描中,对每一段将被当做类型导入的字节序列,Class文件检查器都会确认它是否符合JavaClass文件的节本结构。在这一趟检查中检查器会进行很多检查例如:每个Class文件都必须以四个同样的字节开始:0xCAFEBABE。因为这个魔数Class文件分析器会很容易判断出某个文件具有明显问题而加以拒绝。检查器还必须确认在Class文件中声明的版本号和次版本号,这个版本号必须在这个虚拟机实现可以支持的范围之内。而且第一趟扫描还必须确认这个Class文件有没有被删减。总之第一趟扫描的目的就是保证这个字节序列正确的定义了一个新类型。
第二趟:类型数据的语义检查
第二趟扫描,检查器要查看每个组成部分,确认它们是否是其所属类型的实例,他们的结构是否正确。另外还要检查这个类本身是否符合特定的条件,它们是由Java编程语言规定的。例如,检查器强制规定除Object类以外的类必须有一个超类,或者检查final类有没有被子化等。
第三趟:字节码验证
这一趟是要确保采用任何路径在字节码流中都得到一个确定的操作码,确保操作数栈总是包含正确的数值以及正确的类型。
第四趟:符号引用的验证
在动态链接的过程中,如果包含在一个Class文件中的符号引用被解析时,Class文件检查器要进行第四趟检查。第四趟扫描仅仅是动态链接过程的一部分。当一个Class文件被装载时,它包含了对其他类的符号引用以及它们的字段和方法。一个符号引用是一个字符串,它给出了名字,并且可能还包含了其他关于这个被引用项的信息------这些信息必须足以唯一的识别一个类、方法、字段。这样对于其他类的符号引用必须给出这个类的全名;对于其他类的字段的符号引用必须给出类名、字段名以及字段描述符;对于其他类中的方法的引用必须给出类名、方法名以及方法的描述符。
所谓的动态链接是一个将符号引用解析为直接引用的过程。
此外,由于Java程序是动态链接的,所以Class文件检查器在进行第四次扫描中,必须检查相互引用类之间的兼容性。
除此之外,Java虚拟机还有一些内置的安全特性:
》类型安全的引用转换
》结构化的内存访问
》自动垃圾收集(不必显式地释放被分配的内存)
》空引用检查
通过保证一个Java程序只能使用类型安全的、结构化的方法去访问内存,Java虚拟机使得Java程序更为健壮。
JAVA的安全结构
JAVA的安全模型不同于传统的安全方法 传统的安全方法中 大多数操作系统允许应用程序充分访问系统资源 在操作系统不提供安全保护的机器里 运行环境不能被信任 为了弥补这个缺陷 安全策略经常要求在应用程序执行之前对应用程序建立信任 例如要求程序员在执行从网上获得的应用程序前 先检查病毒和源代码中不安全的代码 这种方法有 个问题 ( )确定程序是否安全的检查很复杂很浪费时间 很少有程序员愿意花时间读程序的源代码 然后再将它编译成本地机器码以保证程序是安全的 ( )病毒检查要不断维护以保证有效性 JAVA的安全模型是不同的 为了防止用户系统受到通过网络下载的不安全程序的破坏 JAVA提供了 个自定义的可以在里面运行JAVA程序的 沙盒 JAVA的安全模型使得JAVA成为适合于网络环境的技术 JAVA的安全性允许用户从Internet或Intranet上引入或运行applet applet的行动被限制于它的 沙盒 applet可以在沙盒里做任何事情 但不能读或修改沙盒外的任何数据 沙盒可以禁止不安全程序的很多活动 如 对硬盘进行读写 和别的主机(不包括程序所在的主机)进行网络连接 创建 个新过程 载入 个新的动态库并直接调用本地方法 沙盒 模型的思想是在信任的环境中运行不信任的代码 这样即使用户不小心引入了不安全的applet applet也不会对系统造成破坏 沙盒 模型 沙盒 安全模型是内建于JAVA结构的 它主要由以下几部分构成 内建于JAVA虚拟机和语言的安全特性 类的载入结构 类文件校验器 安全管理器和JAVA API 下面分别进行阐述 内建于JAVA虚拟机和语言的安全特性 JAVA语言有一些机制使得JAVA程序很稳健 这些机制也是JAVA虚拟机(JVM)的特点 它们是 安全的类型转换 在C C++中 可以通过指针进行任意的类型转换 但常常带来不安全性 而在JAVA中 运行时系统对对象的处理要进行类型相容性检查 以防止不安全的转换 没有指针 指针是C和C++中最灵活 也最容易产生错误的数据类型 由指针所进行的内存地址操作常会造成不可预知的错误 同时通过指针对某个内存地址进行显示类型转换后 可以访问 个C++中的私有成员 从而破坏安全性 造成系统的崩溃 而JAVA对指针进行完全的控制 程序员不能直接进行任何指针操作 自动的垃圾收集 在C中 程序员通过库函数malloc()和free()来分配和释放内存 C++中则通过运算符new和delete来分配和释放内存 再次释放已释放的内存块或未被分配的内存块 会造成系统的崩溃 同样 忘记释放不再使用的内存块也会逐渐耗尽系统资源 而在JAVA中 所有的数据结构都是对象 通过运算符new为它们分配内存堆 通过new得到对象的处理权 而实际分配给对象的内存可能随程序运行而改变 JAVA对此自动进行管理并且进行垃圾收集 有效地防止了由于程序员的误操作而导致的错误 并且更好地利用了系统资源 数组界限检查 若程序中有数组访问 JVM就会检查数组访问是否越界 从而防止了由数组越界引起的错误 检查null引用 若使用的引用为null JVM就会抛出 个例外 类载入器结构 类载入器结构在沙盒模型中起了重要作用 在虚拟机中 类载入器负责引入 定义运行程序的类和接口的二进制数据 在虚拟机中可能有不止 个类载入器 个JAVA程序能使用 种类型的类载入器 原始的类载入器和类载入器对象 原始的类载入器是JVM实现的 部分 它通常从本地硬盘载入安全的类 包括JAVA API的类 运行时 JAVA应用程序安装类载入器对象 类载入器对象使用JAVA语言编写 编译成类文件后 载入到虚拟机 像其他的对象一样初始化 类载入器对象用于以自定义的方式载入类 例如通过网络下载类文件 JVM把通过原始的类载入器载入的任何类都视为安全的 无论这个类是否是JAVA API的 部分 而将通过类载入器对象载入的类视为可怀疑的 缺省情况下视为不安全的 JAVA的结构可以在 个应用程序中创建多个命名空间 命名空间是由 个特定的类载入器载入的类名的集合 JVM为每 个类载入器维持 个命名空间 这个命名空间里有由那个类载入器载入的所有类的名字 由不同类载入器载入的类在不同的命名空间里 没有程序的直接允许 这些类不能彼此访问 编写程序时 可以将来源不同的类放在不同的命名空间里 用这种方式 就可以使用JAVA的类载入器结构控制来源不同的代码间的相互作用 就可以防止不安全代码访问 破坏安全代码 对于Applet 也是同样的道理 通过将来源不同的Applet类文件放在不同的命名空间 防止不安全代码破坏安全代码 在 沙盒 结构中 类载入器结构是防止不安全代码的第一道围墙 它的作用主要有 方面 防止不安全代码访问 破坏安全代码 防止不安全代码冒充安全的类 这 方面作用是通过下述方法实现的 将代码分放在多个命名空间中 并在不同命名空间的代码之间设置 屏障 类载入器结构是通过命名空间来防止不安全代码访问 破坏安全代码 命名空间在载入到不同命名空间中的类之间设置了 个 屏障 在JVM中 同一命名空间中的类可以直接相互作用 不同命名空间中的类甚至不能检测到对方的存在 除非程序允许它们相互作用 保护可信任类库(像JAVA API)的边界 如果类载入器载入 个类 这个类用它的名字来冒充是JAVA API的 部分(例如 类名为java lang virus) 类载入器就传递请求给原始类载入器 如果原始类载入器不能载入这个类 类载入器就抛出安全例外 并拒绝载入这个类 类文件校验器 每一个JVM都有 个类文件校验器 用来保证载入的类文件具有正确的内部结构 如果类文件校验器发现类文件有错误 它就抛出 个例外 类文件校验器能帮助检查出类使用起来是否安全 因为类文件是由二进制数据构成的 JVM不知道这个类文件是否是由黑客产生的 是否有可能破坏虚拟机的完整性 所以虚拟机对引入的字节码进行校验是很重要的 类文件校验器校验的过程可以分为 个阶段 阶段 发生在类刚载入以后 类文件校验器检查类文件的内部结构 包括校验所含的字节码的完整性 阶段 发生在字节码执行的时候 字节码校验器确定符号引用的类 域和方法是否存在 内部检查 在阶段 类文件校验器检查类文件是否正确组成 内部是否一致 是否遵循JAVA编程语言的限制 含有的字节码是否能由JVM安全执行 如果类文件校验器检查出错误 它就会抛出 个错误 类文件就不再被程序使用 检查格式和内部一致性 在阶段 校验器除了检查字节码的完整性 还要检查类文件的格式和内部一致性 例如 每一个类文件都必须以同样的 字节数字 xCAFEBASE开头 这样类文件校验器可能检查的第一件事就是引入的文件是否以 xCAFEBASE开头 类文件校验器还要校验类文件的长度是否与类文件中所记录的长度一致 也即校验类文件是否完整 是否被截去一部分或者被添加 类文件校验器还要检查类是否遵循Java语言的规定 如除了Object类 所有的类都必须有 个父类等 字节码校验 一旦类文件校验器成功地完成格式和内部一致性的检查 就开始对字节码进行校验 通过对代表类方法的字节码流进行数据流分析 进行操作码是否有效及操作码是否有有效的操作数等的检查 以验证字节码流是否可以由虚拟机安全执行 符号引用的校验 符号引用是给出了引用项的名字和其它信息的字符串 这些信息足以用来区分类 域或方法 符号引用的校验用来验证引用是否有效 如果引用无效(例如 如果类不能载入 或者类存在但不含有要引用的域或方法) 类文件校验器就会抛出 个错误 安全管理器和JAVA API 安全管理器定义了 沙盒 的外部边界 安全管理器是类java lang SecurityManager的子类 它是自定义的 JAVA API类在采取一些行动时 通常需要安全管理器检查这个行动是否安全 这些行动包括 接受来自于特定主机的socket连接 修改线程(改变线程优先级 结束线程等) 开放对于特定主机的socket连接 创建 个新的类载入器 删除特定的文件 创建新的过程 程序退出 调用含有本地方法的动态库 等待连接 从特定的包载入类 给特定的包中添加 个新类 访问或修改系统特性 访问特定的系统特性 读文件 写文件 由于在执行上述动作前需要安全管理器进行检查 JAVA API不执行安全管理器建立的安全措施所禁止的任何动作 JAVA API执行 个可能不安全活动的过程 通常分为 步 首先 JAVA API代码检查安全管理器是否已安装 如果没有安装 就无法进行第 步的检查 则直接执行可能不安全的代码 如果安装了 就继续执行第 步的检查 调用安全管理器中合适的检查方法对动作进行检查 如果动作被禁止 检查方法就 lishixinzhi/Article/program/Java/gj/201311/27554
为什么java的安全性比较高
java的安全性体现在两个方面:
1、语言层次的安全性主要体现在:
Java取消了强大但又危险的指针,而代之以引用。由于指针可进行移动运算,指针可随便指向一个内存区域,而不管这个区域是否可用,这样做是危险的,因为原来这个内存地址可能存储着重要数据或者是其他程序运行所占用的,并且使用指针也容易数组越界。
垃圾回收机制:不需要程序员直接控制内存回收,由垃圾回收器在后台自动回收不再使用的内存。避免程序忘记及时回收,导致内存泄露。避免程序错误回收程序核心类库的内存,导致系统崩溃。
异常处理机制:Java异常机制主要依赖于try、catch、finally、throw、throws五个关键字。
强制类型转换:只有在满足强制转换规则的情况下才能强转成功。
底层的安全性可以从以下方面来说明
Java在字节码的传输过程中使用了公开密钥加密机制(PKC)。
2、在运行环境提供了四级安全性保障机制:
字节码校验器 -类装载器 -运行时内存布局 -文件访问限制
为了保证软件的安全性,Java采用了那些措施?
Java的安全性主要体现在以下几个方面:
使用引用取代了指针,指针的功能强大,但是也容易造成错误,如数组越界问题。
拥有一套异常处理机制,使用关键字 throw、throws、try、catch、finally
强制类型转换需要符合一定规则
字节码传输使用了加密机制
运行环境提供保障机制:字节码校验器-类加载器-运行时内存布局-文件访问限制
不用程序员显示控制内存释放,JVM 有垃圾回收机制
JAVA的安全性究竟怎样体现出来
java的安全性主要体现在:下载到本地的java applet只限制在java运行环境中,而不允许它访问计算机的其他部分。
这是由于java编译器输出的并不是可执行代码,而是字节代码(bytecode),java的运行系统就是java虚拟机,每个java程序的运行都是在java虚拟机的控制之下。java虚拟机可以包含这个程序并且阻止它在系统外产生副作用。通过java语言中的适当限制增强了安全性。
java的安全性体现在哪里
Java最基本的安全性有三个。
第一个就是garbage collection,garbage collector会让你的程序不容易出现内存泄露。内存泄露是很危险的,在内存泄露的时候黑客可以黑你的电脑。
第二个就是exception,你有没有发现你想用呗null赋值的东西会出Exception?这个就是exception的好处。出现exception的时候程序员可以让程序停止运行,这样的话就不会被黑客黑了。
第3个就是指针,JAVA里面没有指针!这样的话人们就不能access不该access的内存了。C的话就非常危险了,黑客可以让C的程序stack overflow, 然后在overflow的内存地址跳到一个不该跳的地方。
这些就是Java里面的最基本的安全性。
java安全举荐的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于Java安全性、java安全举荐的信息别忘了在本站进行查找喔。
发布于:2022-12-27,除非注明,否则均为
原创文章,转载请注明出处。