-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1
Java 安全体系,博大精深,这个体系按照 Sun 的 Java 安全白皮书,基本上可以分为 5 个部分:
1. Java 平台
Java 语言本身嵌入了安全特性,其中包括编译器 /JVM对强数据类型的支持,自动的内存管理,字节代码的验证机制以及独特的安全类加载方式,这些特性都是SPAN lang=EN-US>Java 语言本身所赋有的,本文不打算作深入的探讨这些基础概念,建议阅读。
2. Java 密码体系
Java 密码 [1] (Cryptography) 体系依赖于 JCA 和 JCE 。 J ava Cryptography Architecture (JCA) 和 Java Cryptography Extension (JCE) 是两个非常重要的框架,他们提供了非常简洁通用的 API 接口,接口跟实现是完全分离的,即 Java 开发者可以采用 Sun 的接口 +Sun 的实现的方式,也可以接受 Sun 接口 +BouncyCastle 实现的方式。换言之,这是一种 Provider 方式的体系,如何替换 Provider 可以参考 java.security 文件的配置,非常简单。
JCA 包括了数字签名和消息摘要的 API , JCE 扩展了 JCA ,提供了更多的安全 API , Java 针对下面一些常用的算法提供了接口和实现:
l 对称的分组加密算法,如 DES, RC2 和 IDEA
l 对称的流加密算法,如 RC4
l 非对称流加密算法,如 RSA
l 基于密码的加密 (PBE)
l 密钥交换协议,如 Diffie-Hellman
l 信息认证码 (MAC)
上面的算法仅仅是密码学领域的冰山一角,但已经能够满足普通应用的安全需求,在算法的层次之上,往往是密码学协议,使用 Java 简单的 Diffie-Hellman 虽然能够满足简单的密钥交换,但是如果节点多于SPAN lang=EN-US style="mso-font-kerning: 0pt">2 个,这个时候, Diffie-Hellman 便不再适用,此时我们必须使用更复杂 / 更高级的密码协议,成为 Group Diffie-Hellman(GDH) 。因此,初学者不要误认为凭借现有的 Java 密码实现,我们可以做任何事情,在安全领域,事情远远不是我们所想象的那么简单。
3. Java 认证与授权
Java 认证与存取控制模型长成现在这个模样跟 Sun 的宫力有很大关系,这部分涵盖了一个非常重要的部分 JAAS , JAAS 是第一个出色地将认证实接口和实现分离的思想,另外, Java 的存取模型也是一个非常重要的部分,但从 JDK1.2以来并没有什么太大的变化,在 AOP 降临到这个世界之后, Spring 的拦截方式已经逐渐被人们接受,现在已经很少再看到如何应用 Java 的 Access Manager 的文章了,或者人们已经厌倦了“独”模式,他们似乎更喜欢 Acegi 的方法拦截来控制存取,以致 Charles.gay 经常说要将 JGuard AOP 化,可见, Java 的存取控制模型已经有点过时了。
4. 安全通信
该部分主要规范了标准安全通讯协议( SSL , TLS , Kerberos , SASL 等)的 API 和实现。这一节难度比较大,涉猎面广,同时也最能体现了 Java Security 的优势——易用性,扩展性和可移植性,大部分用的最多的是 SSL(IETF 标准化 SSL 3.0 为 TLS 1.0) ,其次是 Kerberos 。
因为微软将 Kerberos 作为整个 Windows 的首个重要的认证协议 (NTLM 已经过时 ) 。 Kerberos 至今依然健壮, MIT 的大师真实卓越非凡,让一个如此简单的协议依然能够独领风骚 30 年而没有做过大的改动, Kerberos 的思想对我们的影响很大,我觉得现有的很多 SSO 协议都能够看到 Kerberos 思想的影子,尤其是 CAS 协议。
5. PKI ( Public Key Infrastructure )体系
Java PKI 规范提供了管理 Key 和证书的 API ,它很好地实现的协议:
l X.509 规范
l CRL( 证书撤消列表 )
l PKCS#11, PKCS#12
l PKIX (RFC 3280),
l 在线证书状态协议 (OCSP)
PKI 的核心是数字证书, Java 提供了友好的数字证书对象 (CertificateFactory , Certificate , X509Certificate , X509Extension 等 ) ,通过这些对象,我们可以毫不费力地处理各种类型的数字证书,包括 cer, pem 等。 Java 提供了很多有用的管理证书工具,包括日常中必不可少的 Keytool, JarSigner 等,而某些开源的图形化界面也封装了 Keytool 和 JarSigner ,包括 KeytoolGUI( 基于 Swing ,已经停止开发,商业版本是 KeyStore Explorer) , SecureX( 基于 SWT 的 Shell ,以 Eclipse Plugin 发布 ) 。
其他协议如 CRL , PKCS#11, PKIX , OCSP ,在 Java 中都在不断地增强 JDK 1.5 的重要改造之一就是体现在对这些协议的增强上。< /SPAN>
Java 跟 .Net 的一个最大的不同是,在证书处理上, .Net 使用了 Windows 本地证书库而 Java 使用了它自己的证书库格式 (JKS) 来保证移植性。 Windows 本地证书库是通过 Windows CryptoAPI 接口去提取的, CryptoAPI 是无法跨平台的,因此, Java 没有使用 CryptoAPI 。
Java 证书库是一个独立的本地文件,它是通过密码保护来保证其中的私钥 / 证书在未经授权的情况下不能被其他人提取,私钥本身也有密码保护,因此安全性是可以相信的。
[1] 密码学的门理论门槛与实践门槛都非常高,虽然我们在应用密码、摘要、数字签名等算法的时候,得益于SPAN lang=EN-US style="FONT-SIZE: 9pt">JCA/JCE 模型的简易性和可扩展性,但是,密码学涉猎面非常广,它远远不止 JCA/JCE 框架所描写的那么简单。
-----BEGIN PGP SIGNATURE-----
Version: PGP Desktop 9.0.5 - Enterprise license
Comment:
http://security.blogjava.net
iQA/AwUBRRFuXE2j31FcBpdPEQJeUgCg8yeWvTWV43aHliN5X2+mIsQS000AoJj6 to/nxmwV688WafhnXdrt8CZ8 =P2yf
-----END PGP SIGNATURE-----