Java安全——提供者相关的体系架构

标签(空格分隔): Java 安全



[toc]


安全提供者

Java的安全软件特性,是通过安全软件包的概念透出的。换句话说,安全领域常见的鉴别、加密、签名等概念,在Java中的支持是通过安全软件包来实现的。Java对于安全软件包的定义其实是一组抽象接口。Sun作为Java的作者,提供了一组实现。而安全软件包是由安全提供者、算法和引擎组成的。引擎可以理解为一组操作,算法定义了操作如何执行,而安全提供者则负责实现这两个抽象概念。

比如说,消息摘要是一个引擎,它是程序员能执行的一个操作。消息摘要的思想与如何计算消息摘要没有关系,所有的消息摘要具备同样的特性,因此抽象出来的接口就是引擎。而实现消息摘要可以有MD5和SHA等算法,算法由具体类实现。而安全提供者就是二者的桥梁,用来管理引擎和算法。安全提供者的目的就是提供一个简单的机制,从而可以方便的改变或替换算法及其实现。因此,通过安全提供者,程序员只需要使用引擎的接口,而不需要关系具体哪个类实现了算法,算法由哪个安全提供者提供。

体系结构

Java安全软件包的体系结构可以总结为四个部分:

引擎

JVM提供引擎类,是Java核心API的一部分。

算法

针对每一种引擎,都会有一组算法实现。Java提供了一组默认的算法实现(由Sun提供),第三方的机构可以提供其他实现。

提供者

算法类是由提供者来管理的,提供者知道如何将算法与实现的具体类对应起来。

安全类

安全类保存提供者列表,可以通过安全类查看有哪些提供者,以及它们提供的算法支持有哪些。

安全提供者体系的一个流程如下:

业务类->引擎: 调用某个接口
引擎->安全类: 询问
安全类->提供者: 找到提供者
提供者->算法: 找到对应算法
算法->业务类:返回计算结果

以MessageDigest的getInstance()方法为例,发现其实是调用Security.getImpl()方法实现的,而内部又是通过

GetInstance.getInstance
                (type, getSpiClass(type), algorithm, params, provider).toArray();

这样的语句来做的。而这个GetInstance会返回一个Instance对象,其类声明如下:

public static final class Instance {
        public final Provider provider;
        public final Object impl;

        private Instance(Provider arg0, Object arg1) {
            this.provider = arg0;
            this.impl = arg1;
        }

        public Object[] toArray() {
            return new Object[] {this.impl, this.provider};
        }
    }

可见就是一个Provider和Object(具体算法)的封装。

提供者选择

JVM在启动时,会去$JREHOME/lib/security/java.security中注册提供者。以我个人电脑中的文件为例:

#
# List of providers and their preference orders (see above):
#
security.provider.1=sun.security.provider.Sun
security.provider.2=sun.security.rsa.SunRsaSign
security.provider.3=sun.security.ec.SunEC
security.provider.4=com.sun.net.ssl.internal.ssl.Provider
security.provider.5=com.sun.crypto.provider.SunJCE
security.provider.6=sun.security.jgss.SunProvider
security.provider.7=com.sun.security.sasl.Provider
security.provider.8=org.jcp.xml.dsig.internal.dom.XMLDSigRI
security.provider.9=sun.security.smartcardio.SunPCSC
security.provider.10=apple.security.AppleProvider

JVM启动时会将这些provider注册进去,其实就是Security
初始化时会读这个文件。开发自定义的安全提供者,需要将类放到系统类路径下。其实看看Provider类的代码,就知道Provider本质上是一个Properties文件,里面的kv存储着引擎名和具体算法类的实现。

可以通过下面的程序示例查看具体的提供者引擎和算法:

package com.taobao.cd.security;

import java.security.Provider;
import java.security.Security;
import java.util.Enumeration;

public class ProviderTest {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Provider[] providers = Security.getProviders();
        for (int i = 0; i < providers.length; i++) {
            System.out.println("" + (i + 1) + ":" + providers[i]);
            for (Enumeration e = providers[i].keys(); e.hasMoreElements();) {
                System.out.println("\t" + e.nextElement());
            }
        }
    }

}

其输出如下,(截取部分)

1:SUN version 1.8
    Alg.Alias.Signature.SHA1/DSA
    Alg.Alias.Signature.1.2.840.10040.4.3
    Alg.Alias.Signature.DSS
    SecureRandom.SHA1PRNG ImplementedIn
    KeyStore.JKS
    Alg.Alias.MessageDigest.SHA-1
    MessageDigest.SHA
    ...

引擎类的结构设计

值得一提的是引擎类的结构设计。如上所说,引擎类除了给业务开发人员提供接口,还有一个任务就是要为第三方提供者使用。引擎为提供者提供了一个接口——SPI(security provider interface)。

还是以MessageDigest为例(这是消息摘要引擎)。MessageDigest继承了MessageDigestSpi。MessageDigestSpi抽象类定义了消息摘要引擎要做的事情。MessageDigest内部持有一个Delegate委托类,MessageDigest的核心方法就是getInstance()获取类的实例,实现见下:

public static MessageDigest getInstance(String algorithm, String provider)
        throws NoSuchAlgorithmException, NoSuchProviderException
    {
        if (provider == null || provider.length() == 0)
            throw new IllegalArgumentException("missing provider");
        Object[] objs = Security.getImpl(algorithm, "MessageDigest", provider);
        if (objs[0] instanceof MessageDigest) {
            MessageDigest md = (MessageDigest)objs[0];
            md.provider = (Provider)objs[1];
            return md;
        } else {
            MessageDigest delegate =
                new Delegate((MessageDigestSpi)objs[0], algorithm);
            delegate.provider = (Provider)objs[1];
            return delegate;
        }
    }

通过Security.getImpl()反射获取到对应的provider和算法实现类,并通过类型判断和else委托逻辑保证返回一个MessageDigest实例。

再具体一点,以Sun security提供的MD5算法实现为例。虽然MD5并没有直接实现MessageDigestSpi,但MD5的父类DigestBase继承了MessageDigestSpi。所以实际上还是满足这个架构的设计。DigestBase做了消息摘要通用的实现,留了三个abstract接口:

 abstract void implCompress(byte[] arg0, int arg1);

    abstract void implDigest(byte[] arg0, int arg1);

    abstract void implReset();

这几个代码在MD5中具体实现:(截取部分)

void implDigest(byte[] arg0, int arg1) {
        long arg2 = this.bytesProcessed << 3;
        int arg4 = (int) this.bytesProcessed & 63;
        int arg5 = arg4 < 56 ? 56 - arg4 : 120 - arg4;
        this.engineUpdate(padding, 0, arg5);
        ByteArrayAccess.i2bLittle4((int) arg2, this.buffer, 56);
        ByteArrayAccess.i2bLittle4((int) (arg2 >>> 32), this.buffer, 60);
        this.implCompress(this.buffer, 0);
        ByteArrayAccess.i2bLittle(this.state, 0, arg0, arg1, 16);
    }

最后补充一个类图说明下类的结构:

时间: 2024-09-04 08:41:18

Java安全——提供者相关的体系架构的相关文章

BI的体系架构及相关技术

一个BI系统为了满足企业管理者的要求,从浩如烟海的资料中找出其关心的数据,必须要做到以下几步: 1)为了整合各种格式的数据,清除原有数据中的错误记录--数据预处理的要求. 2)对预处理过数据,应该统一集中起来--元数据(Meta Data).数据仓库(Data Warehouse)的要求: 3)最后,对于集中起来的庞大的数据集,还应进行相应的专业统计,从中发掘出对企业决策有价值的新的机会--OLAP(联机事务分析)和数据挖掘(Data Mining)的要求. 所以,一个典型的BI体系架构应该包含

WebLogic集群体系架构(原创)

WebLogic Server集群概述  WebLogic Server 群集由多个 WebLogic Server 服务器实例组成,这些服务器实例同时运行并一起工作以提高可缩放性和可靠性.对于客户端而言,群集是一个WebLogic Server 实例.构成群集的服务器实例可以在同一台计算机上运行,也可以位于不同的计算机上.可以通过向现有计算机上的群集中添加更多的服务器实例来增加群集的容量,也可以向群集中添加计算机以承载递增的服务器实例.群集中的每个服务器实例必须运行同一版本的 WebLogic

《BI那点儿事》SQL Server 2008体系架构

原文:<BI那点儿事>SQL Server 2008体系架构 Microsoft SQL Server是一个提供了联机事务处理.数据仓库.电子商务应用的数据库和数据分析的平台.体系架构是描述系统组成要素和要素之间关系的方式.Microsoft SQL Server系统的体系结构是对Microsoft SQL Server的主要组成部分和这些组成部分之间关系的描述.Microsoft SQL Server 2008系统由4个主要部分组成,这4个部分被称为4个服务,这些服务分别是数据库引擎.分析服

Oracle数据库体系架构概要

Oracle数据库系统是一个复杂的软件系统.所谓Oracle的体系架构,是指Oracle数据库管理系统的的组成部分和这些组成部分之间的相互关系,包括内存结构.后台进程.物理与逻辑结构等.     下图为Oracle数据库体系总体图:     Oracle数据库的体系很复杂,复杂的原因在于它最大限度的节约内存,从上图可以看出,它在整体上分实例和数据库文件两部分.     一.实例(Instance):指数据库服务器的内存及相关处理程序,它是Oracle的心脏.与Oracle性能关系最大的是SGA(

技术文档:基于云计算的物流公共信息平台体系架构与设计

基于云计算的物流公共信息平台体系架构与设计 曹立明 随着云计算的兴起和物流产业的发展,云计算在物流公共信息平台的应用备受各界关注.采用文献分析方法总结了云计算和物流公共信息平台的相关理论与技术;从软件工程的角度给出了基于云计算的物流公共信息平台的逻辑结构;结合物流信息云平台业务实际需求,研究提出了云平台的体系架构,分析指出了云平台系统设计要求,探讨了云平台体系各层面的系统设计与功能实现问题. 基于云计算的物流公共信息平台体系架构与设计

云计算数据中心安全体系架构浅析

建立数据中心的目的是为了更好地利用数据.挖掘数据,向数据要效益.在数据中心中应用云计算技术则是一个必然的趋势.而从数据中心获得效益就必须有一个相对安全稳定的环境作为支撑,因此研究云计算数据中心的信息安全体系架构具有重要意义. 一.云计算综述 (一)云计算简介 在世界著名市场研究咨询机构Gartner评选的对多数组织最具战略意义的十大技术和趋势中,云计算技术位列第一. 云计算指IT基础设施的交付和使用模式,指通过网络以按需.易扩展的方式获得所需资源.从更深层次的角度来看,也可以不局限于IT基础设施

从空间角度诠释安全体系架构:花瓶模型V3.0

["防护-监控-信任"体系:"五边界"."五控点"."三验证"] 入侵就是要意想不到,出现在你不注意的角度与方位:若你还没有看清楚入侵者是谁前就盲目动作,往往步步被动,被对手牵着走."用空间赢得时间"是安全设计的常用理念,空间换取的是你可以反应和准备的响应时间.在现实生活中这很容易理解,但在"虚拟的网络上",如何建立网络空间的概念,如何设计安全体系架构呢? 花瓶模型(V2.0)是从时间维

MySQL的体系架构概述

做DBA三年多,接触过很多主流数据库产品,但唯独没机会碰触MySQL,今天开始决定自学MySQL,给自己 冲冲电,先从MySQL的体系架构开始学起. MySQL数据库的体系架构如下图所示: 从上 图中可以看出,MySQL主要分为以下几个组件: 连接池组件 管理服务和工具组件 SQL接口组件 分析器组件 优化器组件 缓冲组件 插件式存储引擎 物理文件 有其它数据库基础的人可以马上发现,MySQL最大的特色是其可插拔的插件式存储引擎,存储引擎是底层 物理架构的实现,每个存储引擎开发者都可以按照自己的

防火墙体系架构的演变

为了满足用户的更高要求,防火墙体系架构经历了从低性能的x86.PPC软件防火墙向高性能硬件防火墙的过渡,并逐渐向不但能够满足高性能,也需要支持更多业务能力的方向发展. 防火墙在经过几年繁荣的发展后,已经形成了多种类型的体系架构,并且这几种体系架构的设备并存互补,并不断进行演变升级. 防火墙体系架构"老中青" 防火墙的发展从第一代的PC机软件,到工控机.PC-Box,再到MIPS架构.第二代的NP.ASIC架构.发展到第三代的专用安全处理芯片背板交换架构,以及"All In O