Java安全
Java语言安全
Java语言安全结构
- 面向对象的一个设计突出点就是允许数据的隐藏和数据的封装。
- 数据封装确定了数据的访问只能通过公共接口访问操作。而一般的操作是直接管理对象的数据元素。
- 对于开发大型的,健壮性的面向对象的系统的重要性。
java实体的访问级别
- public:公共的访问级别,所有的类、接口、枚举都可以访问。也就是说,如果将一个实体设为public,那么所有其他类都可以访问它。
- protected:保护的访问级别,只有当前类、同一包中的类和子类可以访问。如果将一个属性或方法设置为protected,则只有在当前类、同一包中的类和子类中才能访问它。
- 默认访问级别:默认访问级别是指如果没有设置任何修饰符,那么该实体的访问级别就为默认访问级别。默认访问级别只允许当前包中的类访问。
- private:私有的访问级别,只有当前类能够访问。如果你想要一个属性或方法只在当前类中使用,那么就可以将其设置为private访问级别。
总之,访问级别设置是Java中非常重要的一个概念,能够限制实体的访问范围,确保代码的安全性和可维护性。需要在设计程序时合理地运用访问级别设置。
确保内存访问对象的访问权限的限制和这些实体不应该被破坏
-
必须严格遵循访问方法的要求
- 不能任意处理私有实体,必须更具程序指定的访问级别进行操作
- 编译器错误和序列化错误
-
程序不能访问任意的内存地址
- java中没有指针的概念
-
不能对已经被声明为final的实体进行改动
- final修改在运行时的可能?
-
变量在初始化之前不能使用
- 初始化是为了防止通过该手段非法访问内存
- 实例变量一般初始化默认值
-
对于所有的数组访问都必须进行越界检查(bound check)
- 尽可能减少程序的错误,更健壮
- 在安全方面带来的好处
- 在内存中如果一个整形数组后紧接着存储的是一个串(字符数组),那么只要对整形数字的写操作越界,则可以修改串的值,覆盖传的开始位置,如果紧邻内存的话
-
对象不能任意强制转换为其他类型的对象(没有继承关系的)
- java技术保证只有获得访问权限才能对内存进行读写
对象序列化和内存完整性
关于保护型访问,在java中还有一个例外——对象序列化
- 对象序列化是将一个对象以字节为单位的方式转换,当在其他地方用到时可以将字节转换成指定的对象,并且保有对象的状态。
- 用途
- RMI过程中的对象传输(客户端和服务端的对象交换)
- 可将对象序列化后保存到磁盘上
- 对象序列化API可以访问私有保护的对象,从而保证对象状态能够正确的得以保存和恢复
- 在重建序列化对象的时候,还可以将这些值还原给私有保护的变量进行数据赋值
Java语言规则的实施
编译的实施
字节码校验器
Java字节码校验器是Java虚拟机中的一个子系统,用于验证Java字节码是否具有正确的格式和含义。Java字节码校验器主要由以下两个部分组成:
- 类文件验证器:用于验证Java类文件是否符合Java字节码的格式和规范,例如检查字节码的魔数、版本号、常量池、字段、方法等信息是否完整、合法和正确。
- 字节码验证器:用于验证Java字节码是否符合Java虚拟机的语义规范,例如检查变量是否被初始化、操作数类型是否正确、分支跳转是否正确等。
Java字节码校验器的内部组成如下:
- 解析器:用于解析Java字节码文件,并将其转化为内存中的Java类模型。
- 符号表:用于存储在字节码中所使用的变量、常量、方法等的相关信息。
- 数据流分析器:用于分析类文件中的字节码的执行流程,并检查这些字节码的操作是否符合Java虚拟机的规范。
- 操作数栈:用于存储在Java字节码中的操作数。
- 运行时常量池:用于存储Java字节码中的常量,以及常量池中的运行时信息。
- 类型检查器:用于验证Java字节码中的类型是否正确,以及类型转换和自动装箱、拆箱是否符合Java虚拟机的规范。
Java字节码校验器的主要原理是基于数据流分析,通过对程序代码进行解析、检查和验证等操作,确定程序的正确性、安全性和可靠性。Java字节码校验器可以帮助开发人员捕获和避免程序中的潜在错误和安全隐患,提高程序的健壮性和安全性。
字节码校验器的内部组成
- 是java虚拟机的一个内部组成部分,没有任何接口,程序员也无法直接与其交互或者访问
- 当虚拟机的类加载器将字节码校验器内建到类对象中时,字节码校验器就自动完成了对大部分字节码的检查
- 字节码校验器通常被认为是一个小型的定理证明(theorem prover),通过执行该段代码证明给定的字节码是这一组合法的指令
推迟的字节码校验
exam 检查一些字节码的正确性之后等待推迟的字节码检验(verify)
Java字节码校验器中的推迟字节码校验(Lazy Bytecode Verification)是一种Java虚拟机优化技术。当Java虚拟机加载一个类文件时,它会将类文件读入内存并放入方法区,然后依次进行类加载、连接和初始化等过程。在类连接过程中,Java虚拟机会对类文件进行字节码校验,以确保类文件的正确性和安全性。但是,在某些情况下,Java虚拟机可能会推迟对字节码的校验,以提高类文件的加载性能。
具体来说,Java虚拟机在特定情况下会对字节码的校验进行推迟,而不是在类加载和连接过程中立即对字节码进行校验。Java虚拟机会从未验证的代码中选取一部分代码,以未经过校验的方式运行它们。如果这些代码成功执行,那么Java虚拟机就推定这些代码是可靠的,并在运行时保留它们;如果这些代码执行出现异常,那么Java虚拟机就会在运行时将它们标记为“不可靠代码”,并要求程序员对这些代码进行调试和验证。
Java字节码校验器中的推迟字节码校验技术可以提高Java类文件的加载性能,减少字节码校验所需的时间,同时也能够动态地适应程序执行环境,保证程序的稳定和安全性。但是,它也会带来一些不确定性和风险,因为不被立即校验的代码可能存在一些不可预测的错误和漏洞,这对程序的稳定性和安全性会带来潜在的威胁。因此,在实际应用中,需要按照场景和需求来选择是否开启推迟字节码校验功能,以确保程序的可靠性和安全性。
运行时的规则实施
-
数组越界检查
- 字节码检查器检查
- 运行时检查
-
对象类型转换
- 检查转换是否合法
Java运行时的规则是基于Java虚拟机规范(Java Virtual Machine
Specification)实施的,该规范定义了Java虚拟机(Java Virtual
Machine,JVM)的行为和执行Java程序的方法。以下是Java运行时的规则实施的一些说明:Java程序的运行依赖于Java虚拟机,而不是底层操作系统和硬件平台。这意味着Java程序可以在不同的操作系统和硬件平台上运行,只需要在各个平台上安装适当的JVM即可。
在Java程序执行之前,Java源代码需要经过编译器转换为Java字节码(Java
bytecode),然后再被送到JVM执行。Java字节码是一种中间格式,它包含了Java程序的执行逻辑和指令序列。
JVM在执行Java程序时会按照Java字节码中的指令序列逐步执行,直到程序结束或遇到异常情况。在执行过程中,JVM负责管理Java程序的内存分配、对象创建和释放、线程管理、异常处理等任务。
Java程序的性能和可靠性受到JVM的影响,因此JVM的实现对Java程序的运行效率和稳定性至关重要。不同的JVM实现可能会有不同的性能和特性,需要根据具体要求进行选择。
Java运行时的安全性是Java平台的一大优势。Java程序在执行时受到严格的安全限制和控制,可以防止恶意代码的执行、数据泄漏等安全问题。同时,Java平台还提供了许多安全特性和工具,如安全管理器、安全策略、数字证书等,使得Java程序可以在安全的环境中运行。
语言层面的安全结构设计
Java语言在安全结构设计方面有以下特点和机制:
-
安全管理器(Security Manager):Java提供了一个安全管理器,用于管理和控制Java程序的安全访问。安全管理器负责对Java程序的各种操作(如文件读写、网络访问等)进行权限控制和限制,以保护系统免受恶意代码的攻击。
-
安全策略文件(Policy File):Java使用安全策略文件来定义和配置安全权限。策略文件指定了哪些代码可以执行哪些操作,可以限制访问敏感资源或者限制对某些功能的使用。
-
访问控制:Java通过访问控制机制来限制代码对敏感资源的访问。通过使用访问修饰符(如private、protected、public)和访问控制关键字(如final、static),可以控制类、方法和变量的可见性和访问权限。
-
异常处理:Java的异常处理机制可以帮助程序在出现异常情况时进行安全处理。通过捕获和处理异常,可以防止程序崩溃或泄露敏感信息。
-
加密和安全通信:Java提供了丰富的加密和安全通信的API,如Java Cryptography Architecture(JCA)和Java Secure Socket Extension(JSSE)。这些API可以用于实现数据加密、数字签名、身份验证等安全功能。
-
类加载器(ClassLoader):Java的类加载器机制可以帮助保护系统免受恶意代码的攻击。类加载器可以限制代码的访问权限,防止恶意代码加载和执行。
-
安全性注解(Security Annotations):Java提供了一些安全性注解,可以在代码中标记敏感操作或资源,以便进行更细粒度的安全控制和验证。
simply put
Java language has several security mechanisms and features at its core for designing secure applications. Here are some key points:
-
Security Manager: Java provides a Security Manager that controls and manages the security policies of Java applications. It enforces restrictions on various operations performed by the application, such as file access, network communication, and system properties access, to protect against malicious activities.
-
Policy File: Java uses a policy file to define and configure security permissions. The policy file specifies which code is allowed to perform specific actions, restricting access to sensitive resources or functionalities.
-
Access Control: Java employs access control mechanisms to restrict access to sensitive resources. Access modifiers (e.g., private, protected, public) and access control keywords (e.g., final, static) are used to control the visibility and accessibility of classes, methods, and variables.
-
Exception Handling: Java’s exception handling mechanism aids in secure application design. By catching and handling exceptions appropriately, it prevents program crashes and leakage of sensitive information.
-
Encryption and Secure Communication: Java provides robust APIs for encryption, digital signatures, and secure communication through Java Cryptography Architecture (JCA) and Java Secure Socket Extension (JSSE). These APIs enable the implementation of secure data transmission, authentication, and integrity checks.
-
Class Loader: Java’s class loader mechanism helps protect against malicious code execution. Class loaders can restrict code access and prevent the loading and execution of malicious classes.
-
Security Annotations: Java offers security annotations that allow developers to mark sensitive operations or resources within the code. These annotations enable more fine-grained security control and validation.