可以说随着 J2EE Web 应用程序安全体系结构的引入,我们不断从近 10 年的反复试验有所收获,事实也表明了这一点。J2EE 安全框架由三个 API 组成:Java 认证和授权服务(JAAS)、Java 安全套接字扩展(JSSE)和 Java 加密扩展(Java Cryptography Extension,JCE)。虽然 JCE 是一个有意思和重要的 API,但是它与我们所关注的安全 Web 应用程序开发的“三大项”――认证、授权和传输――并不特别相关。所以在本月的专栏中我们将集中讲述 JAAS 和 JSSE。
JAAS 和 JSSE 概述
JAAS 提供了一种灵活的、说明性的机制,用于对用户进行认证并验证他们访问安全资源的能力。JSSE 定义了通过安全套接字层(SSL)进行安全 Web 通信的一种全 Java 的机制。通过结合这两种技术,可以使我们的应用程序:
验证用户就是他或者她所宣称的那个人(认证)。
保证允许他或者她访问所要求的资源(授权)。
通过安全网络连接进行完整的信息交换(传输)。
现在,我们来看每一个基础的功能组件。
用 JAAS 进行认证
JAAS 建立在一种称为可插入的认证模块(Pluggable Authentication Module,PAM)的安全体系结构之上。PAM 的体系结构是 模块化的,这意味着它设计为可以通过交换模块,支持从一个安全协议组件无缝地转换到另一个协议组件。这个框架中定义良好的接口使得无需改变或者干扰任何现有的登录服务就可以加入多种认证技术和授权机制。PAM 体系结构可以集成范围广泛的认证技术,包括 RSA、DCE、Kerberos 以及 S/Key,因而 JAAS 也可以集成这些技术。此外,这个框架与基于智能卡的认证系统和 LDAP 认证兼容。
就像许多 Java 2 平台技术一样,JAAS API 定义了应用程序代码与将要执行业务逻辑的物理实现之间干净的抽象。这个抽象层不用重新编译现有的应用程序代码就可以作为登录模块的运行时替代。特别是,应用程序写到 LoginContext API,而认证技术提供程序则写到 LoginModule 接口。在运行时, LoginContext 将读取配置文件以确定应使用哪一个(一些)登录模块对访问特定应用程序的用户进行认证。
JAAS 所使用的认证方案以两种非常重要的实体为基础:principal 和 subject。实际被认证的人或者服务称为 subject。 principal是一个惟一的实体,比如个人或者组的名字、帐号、社会安全号或者类似的惟一标识。为了惟一标识一个 subject(这是认证的关键部分),一个或者多个 principal 必须与这个 subject 相关联。最后,一个 subject 可能拥有安全相关的属性,称为 凭证(credential)。凭证可以是从简单的密码到复杂的加密密钥的任何东西。
应用程序通过实例化一个 LoginContext 对象开始认证过程。 LoginContext 查询一个配置文件以确定进行认证所使用的一种(或者多种)认证技术以及相应的一个(或者多个) LoginModule 。一个非常简单的 LoginModule 可能会提示输入用户名和密码并对它们进行验证。高级一点的可能会使用现有的操作系统登录身份进行身份验证。理论上,甚至可以将一个 JAAS LoginModule 构建成与指纹识别器或者虹膜扫描仪交互。
用 JAAS 进行授权
认证只是 Java 安全框架任务的一半。当用户的身份被确认后,必须对他或者她的访问权限进行检查。只有确认了适当的权限后,用户才可以访问安全的系统或者资源。
换一种说法,验证了用户或者服务的身份后,就创建一个 Subject 对象来表示经过验证的实体。然后 JAAS 将这个对象传递给任何为保护对敏感系统或资源的访问而建立的授权组件。
要确定授权,可以向 Java 2 Security Manager 提供 Subject 及其 Principal s,以及 Subject 要执行的特权操作(读/写到文件系统、数据库访问,等等)。Security Manager 会咨询与 Principal s 和权限相关联的策略文件。 如果一个 Subject 的 Principal s 具有执行指定操作的权限,那么就对这个 Subject 授权并允许操作,否则就会拒绝这项操作并抛出一个 SecurityException 。
用 JSSE 进行安全传输
有了 JAAS ,我们就可以识别访问系统的用户并限制他们只能访问授权使用的那部分系统。虽然 JAAS 是迈向安全 Web 应用程序坚实的第一步,但是如果没有安全传输,那么应用程序安全性仍然是不完整的。
这里,我们仍然是以明文形式――即 HTTP、TCP/IP、FTP等――传递安全信息(包括认证信息)。所以我们需要保证数据在传输时不会被未授权的人访问。我们还需要保证数据在到达之前,没有在传输过程中修改过,不管这种修改是有意的还是无意的。我们可以利用安全套接字层(SSL)和传输层安全性(Transport Layer Security,TLS)协议实现这两种功能。
SSL 和 TLS 不是特定于 Java 的协议,它们是为维护通过套接字的数据的完整性和私密性而设计的网络层协议。Java 安全套接字扩展(JSSE)利用 SSL/TLS 可以进行安全的 Internet 通信,它提供了一个具有完整功能的应用程序框架――一个 Java 版本的 SSL 和 TLS 协议,这些功能包括数据加密、服务器认证、消息完整性,等等。使用 JSSE,我们可以定义运行任意应用程序协议――包括 HTTP、TCP/IP、FTP,甚至 Telnet――的客户机与服务器之间的安全套接字连接。从数据加密的角度看,JSSE 结合了许多与 JCE 中使用的同样的概念和算法。不过更重要的是,在简单流套接字 API 背后,它会在必要时自动使用它们。
要利用 JSSE API,我们只需要做简单的几件事。首先我们需要获得 JSSE 提供程序(请参阅 参考资料)。其次,我们需要从一个 JSSE 套接字工厂而不是直接从 java.net.Socket 类获得套接字。客户端代码从 SSLSocketFactory 获取套接字,而服务器端代码从 SSLServerSocketFactory 获取套接字。通过从这些工厂获取套接字,我们就可以利用 JSSE 提供程序提供的框架,而不是像 java.net 包允许我们所作的那样,简单地创建标准的、不安全的套接字。
有关 JSSE 的更多细节,请参阅 参考资料。
结束语
Java 平台以其岩石般坚固的安全性闻名。每一年 Java 安全性框架都会变得更灵活和更健壮,JAAS 和 JSSE 的加入表明这个传统将会继续发扬光大。
分享到:
相关推荐
通过使用JAAS,开发者可以轻松地实现复杂的验证和授权逻辑,同时保持代码的清晰性和可维护性。无论是对于需要高度安全性还是需要灵活适应不同环境的应用程序来说,JAAS都是一种值得考虑的选择。
**J2EE探索者:Java企业级应用的深入解析** J2EE(Java 2 Platform, Enterprise Edition)是Java平台上用于构建分布式企业级应用程序的框架。这个强大的平台为开发人员提供了丰富的服务,包括数据持久性、事务管理...
Java Authentication and Authorization Service (JAAS) 是Java平台中用于实现用户认证和权限授权的一个核心组件。它为开发者提供了一种灵活的方式来实现安全控制,确保只有经过验证和授权的用户能够访问敏感资源或...
5. **集成其他安全框架**:JAAS可以与Java的其他安全组件,如Java Cryptography Extension (JCE) 和 Java Secure Socket Extension (JSSE),以及企业级应用服务器的安全框架无缝集成,提供全面的安全解决方案。...
JAAS(Java Authentication and Authorization Service),作为Sun Microsystems为增强Java 2平台安全性而推出的一项重要功能,成为了Java开发人员构建安全应用时不可或缺的工具。JAAS不仅为Java应用程序提供了一种...
Java Authentication and Authorization Service (JAAS) 是Java平台中用于实现用户身份验证和权限管理的核心组件。这个"Java JAAS安全认证 demo"是一个示例项目,旨在帮助开发者理解如何在Java应用中实施安全认证...
Java 2平台的安全框架主要关注代码来源的认证和控制,而JAAS则在此基础上增加了对代码执行者的认证和授权,从而实现了更加精细的访问控制。 随着互联网安全问题的日益凸显,JAAS作为一种强大的安全机制,在Java EE ...
Java 安全性编程概念是非常重要的,Java 平台提供了多种支持安全编程的特性和库扩展,如 JCE、JSSE、CertPath API 和 JAAS 等。学习这些概念和技术可以帮助开发者编写更加安全的 Java 应用程序。
文章提到,在 Borland 应用服务器的基础上,使用 JAAS 与 J2EE Web 容器的内置安全机制,并结合 Oracle 数据库的用户验证功能,实现了 Web 应用中对用户的验证和授权。这种方法的一个关键优势在于,它可以将用户能...
开发者需要了解如何设置和配置安全策略,以及如何使用如JCE、JSSE和JAAS这样的工具来增强应用程序的安全性。同时,掌握Java语言的强制安全规则也是保障代码安全的基础,因为这些规则在程序编译、装载和运行时都会...
首先,书中的内容可能涵盖了Java安全模型的基础知识,包括如何使用Java安全管理器(Security Manager)来控制程序的权限,以及如何通过Java加密API(如Java Cryptography Extension, JCE)实现数据加密和解密,保护...
在企业级Java应用程序开发中,安全性是至关重要的一个环节,特别是在构建J2EE(Java 2 Platform, Enterprise Edition)应用时。J2EE为大型分布式系统提供了强大的框架,但同时也面临着各种安全挑战,如数据泄露、...
2. **容器管理的身份验证和授权**:J2EE容器如Tomcat、WebLogic或WebSphere提供了内置的安全服务,包括JAAS(Java Authentication and Authorization Service)。开发者可以通过配置部署描述符(如web.xml或ejb-jar....
Java Authentication and Authorization Service (JAAS) 是Java平台中用于安全性的框架,主要用于用户身份验证和权限授权。在Java应用程序中,尤其是服务器端应用,确保只有合法的用户能够访问资源是至关重要的。...
Java Authentication ...通过其服务提供者接口和模块化的架构,JAAS降低了安全实现的复杂性,促进了代码的重用和系统的可扩展性。对于任何需要在Java环境中实现安全功能的开发者而言,理解和掌握JAAS都是至关重要的。
9. **EJB(可选)**:虽然小型项目可能不涉及,但EJB是J2EE中的高级组件,用于实现业务逻辑,提供事务管理和安全性等功能。如果系统中有复杂的业务处理,可能使用了EJB。 这个项目为初学者提供了一个全面了解J2EE...
**Java Authentication and Authorization Service(JAAS)** 是Java平台提供的一个强大的安全框架,用于实现用户身份验证和授权服务。随着服务导向架构(SOA)逐渐从概念阶段向实际应用过渡,那些早期采用者开始...
在J2EE工程实现中,确保系统的安全至关重要。...通过合理利用J2EE提供的各种安全机制和技术,可以有效地提升系统的整体安全性,保护用户数据和隐私,确保电子商务和电子政务等关键应用的稳定和安全运行。
Java Authentication and Authorization Service (JAAS) 是Java平台中用于安全性的核心组件,它为开发者提供了一种机制来处理用户身份验证和权限控制。这个服务允许应用程序执行基于角色的安全性,这意味着用户的...
_Jaas_Kerber_jaas_KERBEROS_kerberos_Java_login.a"压缩包文件包含了关于如何在Java环境中使用JAAS实现Kerberos登录和委托的示例代码。Kerberos是一种广泛使用的网络身份验证协议,它提供了强大的安全性,通过一次...