JAVA 可扩展安全架构基本简介

概述

Java平台使用基于标准的安全的API技术提供可扩展的安全架构体系,通过标准的和可扩展的API技术来支持包括语言安全,加密算法,公钥私钥基础,认证,安全通信和访问控制。

JCA是JAVA安全平台的一个主要部分,包含一个基于可配置的“Provider”体系结构和一组用于数字签名,消息摘要(哈希),证书和证书验证,加密(对称/非对称,块/流密码),密钥生成 管理和安全随机数生成等API。 这些API允许开发人员将应用的安全性轻松集成到应用程序代码中。 JCA架构是围绕以下原则设计的:

实现独立性
应用程序不需要自己实现安全性。 相反,可以从Java平台请求安全服务。安全服务在Provider中实现,通过标准接口接入Java平台。 应用程序可能依靠多个独立的提供者来提供安全功能

实现互操作性
Provider可以跨应用程序进行互操作。 具体而言,应用程序不绑定到特定的安全服务提供者,而提供者也不绑定到特定的应用程序

算法可扩展性
Java平台包含许多内置的Provider,这些Provider实现了当今广泛使用的一组基本的安全服务。但是,一些应用程序可能依赖尚未实施的新兴标准或专有安全服务。 Java平台支持安装实现这些服务的定制提供安全服务程序

JDK中的其他密码服务库使用JCA提供程序体系结构,如Java安全套接字扩展(JSSE),安全套接字层(SSL)和传输层安全性(TLS)实现的访问。 Java通用安全服务(JGSS)(通过Kerberos)API以及简单身份验证和安全层(SASL),Java认证和授权服务(Java Authentication and Authorization Service)用来验证用户或设备的身份以确定其真实性和可信度,然后根据其身份提供访问权限,它有助于采用可插入的认证机制和基于用户的授权等。

JCE 加密扩展介绍
JCE(Java Cryptographic Extension)是采用遵循美国出口控制条例的加密服务来增强JCA功能,同时支持加密、解密操作,支持密钥的生成和协商以及支持消息验证码算法(Message Authentication Code)等。
在JDK 1.4之前,JCE是一个非捆绑产品,因此,JCA和JCE在 JDK1.4  之前是独立的。 但在JDK1.4之后,JCE被捆绑在JDK中,所以区别变得不明显。 由于JCE使用与JCA相同的体系结构,所以JCE应该更适合作为JCA的一部分。
JDK中的JCA包含两个安全服务组件:

定义和支持安全服务Provider为其提供实现的加密服务的框架。 这个框架包含了诸如java.security,javax.crypto,javax.crypto.spec和javax.crypto.interfaces等软件包

Sun,SunRsaSign,SunJCE等实际包含了实际的加密实现的提供方

设计原则

JCA是围绕这些原则设计的:

实现独立性和互操作性
算法独立性和可扩展性

实现独立性是使用基于安全服务“Provider”的体系结构实现的。 术语 Cryptographic Service Provider (CSP)是指实现一个或多个密码服务(如数字签名算法,消息摘要算法和密钥转换服务)的包或一组包。 程序可以简单地请求实现特定服务(例如DSA签名算法)的特定类型的对象(例如签名对象),并从一个安装的安全服务提供者获得实现。 如果需要的话,程序可以改为请求来自特定提供者的实现。

实现互操作性意味着各种实现可以相互协作,使用彼此的密钥,或者验证彼此的签名。 这就意味着,对于相同的算法,由一个提供者生成的密钥可以被另一个提供者使用,并且由一个提供者生成的签名可以被另一个提供者验证。

算法可扩展性意味着可以容易地添加适合于所支持的引擎类之一的新算法。通过定义密码引擎服务的类型,并定义提供这些密码引擎的功能的类来实现算法独立性。 这些类被称为引擎类,例如MessageDigest,Signature,KeyFactory,KeyPairGenerator和Cipher类。

身份认证需求

JCA提供JAVA API 用于身份验证目的,其主要目标是允许Java应用程序从网络加载类 并确保:

?可以验证加载类的站点的标识(身份验证);是否来自于可以信任的站点;
?在网络的传输过程中,没有被修改(数据身份验证);

为了验证Java 应用或用到的类是从可以信任的网络加载的,那么,必须有方法来验证该类实际来自于它所说声称的站点。 此时,身份验证来自与Java应用附带的数字签名 – 该数字签名是该Java  应用确实来自于它所生成网站的电子验证。

通过公共网络发送数据时,可以使用该数据的数字指纹(Digital Fingerprint)来确保数据在网络传输时不会被修改。 数据指纹足以防止某些网络黑客将脏数据替换为传输中的原始数据。但是,此类身份验证不会阻止某些程序或黑客读取网络传输中的数据; 经过身份验证的数据不是加密数据。 如果担心网络上可能读取数据,数据身份验证提供的安全性就不充足。 数据身份验证可防止写入篡改数据但不会防止读取数据。如果要防止读取数据,就需要用到数据加密。下面,我们讲简单概要的介绍JAVA 可扩展安全架构的加密引擎。

加密引擎介绍(Cryptographic Engines)

从本质上讲,JCA中所有加密操作的结构都与下图的表示类似。 核心是加密算法本身,称为引擎; 术语“算法”(algorithm)指对加密操作的特定实现。 引擎获取一些输入数据和密钥(密钥是可选的),并产生一组加密后的输出数据。 需要注意的是, 有些引擎不需要密钥作为输入的一部分。 此外,并非所有加密引擎都产生对称输出(Symmetric Output) ,也就是说,并不是总可以从输出的数据中重新还原原始文本。 此外,输出的大小通常与输入的大小不同。 在消息摘要和数字签名的情况下,输出大小是小的并且固定大小的字节数; 在加密引擎的情况下,输出大小通常略大于输入大小。

用于加密的加密引擎


在Java安全包中,有两个标准加密引擎:消息摘要引擎和数字签名引擎。 此外,对于某些用户,可以使用可选加密引擎来执行加密(JCE)。 密钥是使用大多数这些加密引擎的核心,在Java Security 包中,存在对密钥进行操作的类,包括可用于生成某些类型密钥的引擎。

密钥分类

密钥分为两种:对称密钥与非对称密钥

对称密钥加密,又称私钥加密或会话密钥加密算法,即信息的发送方和接收方使用同一个密钥去加密和解密数据。它的最大优势是加/解密速度快,适合于对大数据量进行加密,但密钥管理困难。

非对称密钥加密系统,又称公钥密钥加密。它需要使用不同的密钥来分别完成加密和解密操作,一个公开发布,即公开密钥,另一个由用户自己秘密保存,即私用密钥。信息发送者用公开密钥去加密,而信息接收者则用私用密钥去解密。公钥机制灵活,但加密和解密速度却比对称密钥加密慢得多。

所以在实际的应用中,人们通常将两者结合在一起使用,例如,对称密钥加密系统用于存储大量数据信息,而公开密钥加密系统则用于加密密钥。

密钥主要概念

1、密钥对,在非对称加密技术中,有两种密钥,分为私钥和公钥,私钥是密钥对所有者持有,不可公布,公钥是密钥对持有者公布给他人的。

2、公钥,公钥用来给数据加密,用公钥加密的数据只能使用私钥解密。

3、私钥,如上,用来解密公钥加密的数据。

4、摘要,对需要传输的文本,做一个HASH计算,一般采用SHA1,SHA2来获得。

5、签名,使用私钥对需要传输的文本的摘要进行加密,得到的密文即被称为该次传输过程的签名。

6、签名验证,数据接收端,拿到传输文本,但是需要确认该文本是否就是发送发出的内容,中途是否曾经被篡改。因此拿自己持有的公钥对签名进行解密(密钥对中的一种密钥加密的数据必定能使用另一种密钥解密。),得到了文本的摘要,然后使用与发送方同样的HASH算法计算摘要值,再与解密得到的摘要做对比,发现二者完全一致,则说明文本没有被篡改过。

上面实际上介绍了加密解密和数字签名两个概念和实现过程,二者的过程正好是相反的。

公钥和私钥是通过一种算法得到的一个密钥对(即一个公钥和一个私钥),将其中的一个向外界公开,称为公钥;另一个自己保留,称为私钥。通过这种算法得到的密钥对能保证在世界范围内是唯一的。

使用这个密钥对的时候,如果用其中一个密钥加密一段数据,必须用另一个密钥解密。比如用公钥加密数据就必须用私钥解密,如果用私钥加密也必须用公钥解密,否则解密将不会成功。

JAVA 可扩展安全架构基本简介

发表评论

邮箱地址不会被公开。 必填项已用*标注

五 × = 35

滚动到顶部