13.1 Java安全概述
构建安全的程序是一项复杂的系统工程,涉及操作系统、应用开发平台和程序自身等各个不同层次上的多个组件。安全性相关的约束在各个层次上都需要正确地应用。底层出现的安全问题会对上面层次的组件造成影响。如果由于底层操作系统上的漏洞导致系统管理员账号被窃取,那么在应用开发平台和程序中添加的安全性约束就形同虚设。程序自身也可以被划分成多个不同的层次,在每个层次的实现中,不应该盲目依靠其他层次的安全性约束。在一个Web应用中,在浏览器端和服务器端都需要进行安全性相关的约束检验,只依靠浏览器端的检验是不够的。正因为如此,在程序中的各个部分都会看到与安全性相关的代码,一方面要保证安全性的约束检验在每个需要的地方都被正确添加,另外一方面要避免安全性约束的检查代码的出现对阅读和理解程序中的业务逻辑实现代码造成影响。对于这种横切的需求,使用面向方面编程的思想是一个不错的选择。
安全性相关的内容大概可以分成3个部分:认证(authentication)、授权(authorization)和审计(audit)。认证的作用是验证系统的使用者具有合法的身份标识。这个身份标识可以由系统进行分配,也可以由用户自行注册。每个身份标识通常与安全凭证关联在一起,如用户注册时填写的密码。如果在认证过程中提供的身份标识和安全凭证是正确的,系统认为当前用户是认证时所声称的用户。通过认证并不意味着当前用户所执行的任何操作都是合法的,很多系统对用户的权限有自己的分配方式,即对用户进行授权。普通用户和系统管理员所能执行的操作肯定是不同的,因此在执行操作之前,需要根据系统当前的权限控制设置来进行判断,系统会拒绝不合法的操作。最后一个功能是审计。对于与安全相关的操作,如认证和授权等操作,都应该保留详细的日志来记录。这么做的好处是在发现安全问题时可以查找相关历史记录来进行追踪,还可以从用户的访问模式中找到潜在的安全漏洞。对于审计相关的功能,本章并没有进行详细的介绍。一般来说,只需要使用Java提供的日志API在合适的地方进行记录即可。
Java平台所提供的对构建安全程序的支持是很丰富的。由于版本更新的历史原因,Java平台的安全相关API分散在不同的组件中,包括进行认证和授权的Java认证和授权服务(Java Authentication and Authorization Service, JAAS)、提供加密和解密相关功能的Java密码框架(Java Cryptography Architecture, JCA)、处理公钥和数字证书验证的公钥基础设施(Public Key Infrastructure, PKI)及使用安全套接字连接进行通信的Java安全套接字扩展(Java Secure Socket Extension, JSSE)。这些不同的API都使用类似的服务提供者架构,可以很方便地进行扩展。开发人员既可以使用Java平台提供的默认实现,也可以使用由第三方提供或自己开发的实现。