天天看点

Java核心技术卷二笔记9

第九章 安全

对Java而言,安全机制是一个不可分割的组成部分。Java提供以下三种确保安全的机制:

语言设计特性,如对数组的边界检查。

访问控制机制,如文件访问。

代码签名,代码的使用者可以知道谁创建了代码以及是否被修改。

每个Java程序至少拥有三个类加载器

引导类加载器,用于加载系统类,没有ClassLoader对象

扩展类加载器。从jre/lib/ext目录加载标准的扩展

系统类加载器,加载应用类

类加载器有一种父子关系,除了引导类加载器之外,每个类加载器都有一个父类加载器。加载时会先加载父类,只有当父类加载器加载失败后才会加载给定类。

每一个线程都一个对类加载器的引用,称为上下文加载器。主线程的上下文类加载器是系统类加载器。当新线程被创建时,它的上下文类加载器就是创建该线程的上下文类加载器。因此所有线程的默认上下文加载器是系统类加载器。

同一个虚拟机中可以有类名和包名完全相同的两个类。

自定义类加载器只需要将其继承ClassLoader类,覆盖findClass方法。ClassLoader类本身的超类的loadClass方法将类的加载操作委托给其父类加载器进行,只有该类及其父类都未加载该类时才调用findClass方法。

实现findClass方法,首先要为来自本地文件及其他各个来源的类加载其字节码,其次要调用ClassLoader超类的defieClass方法,向虚拟机提供字节码。

当类加载器将自己吗传递给虚拟机时,字节码要先接受校验器的校验。校验器负责检查那些指令无法执行的有明显破坏性的操作。除了系统类外的所有类都要被校验,校验器有以下校验内容。

变量在使用前需初始化。

方法调用和对象引用类型之间要匹配。

访问私有数据和方法的规则没有被违反。

对本地变量的访问都落在运行时堆栈内。

运行时堆栈没有溢出。

安全管理器是一个负责控制u具体操作是否允许执行的类。

从Java1.2之后,Java平台的安全策略建立了代码来源和访问权限集之间的映射关系。

代码来源由一个代码位置和证书集组成,权限是指由安全管理器负责检查的任何属性。

每个类都有一个保护域,它是用于封装类的代码来源和权限集合的对象。

策略管理器要读取对应的策略文件,这些文件包含了将代码来源映射为权限的指令。

Windows驱动器名前面的斜杠是可有可无的。

登录时要对登录的主体Subject进行认证,该主体可以有多个特征principal。特征描述了主体的某些属性,比如用户名、组ID、角色等。特征管制着各个权限。

消息摘要是数据块的数据指纹。如SHA1可将任意长度数据块压缩为160位的序列。它具有两个基本属性。

如果数据改变了,消息摘要也将改变。

拥有给定消息的伪造者无法创建与原消息具有相同摘要的假消息。

MessageDigest类是用于创建封装了指纹算法的对象的工厂以及作为所有消息摘要算法的超类,它的静态方法getInstance返回了继承MessageDigest类的某个类的对象,其中的update方法需要在整个对字节的循环中反复调用。如果字节存放在数组中则可以省去循环,一次性完成整个数组的更新。随后调用的digest方法会议字节数组的形式返回消息摘要。

消息发送者对摘要进行私钥加密形成签名,消息接收者对签名使用公钥解密,如果解密成功则说明消息确实来自于该发送者。

通过一个受信任的中间人对发送者的公共密钥进行私钥加密,接收方再对该加密后的公钥使用中间人的公钥进行解密,确保发送方的公钥的可靠性。

Cipher类是所有加密算法的超类。通过getInstance方法获取一个密码对象,再对其设置模式和密钥进行初始化。

非对称密码的关键在于使用接收者的公钥将发送者的对称密钥进行加密,该加密后的对称密钥只能被接收者用自己的私钥解密。只有获取解密后的发送者的对称密钥,才能将加密后的明文解密。