7.11 外部数据

来自其它系统的数据就是相对于当前系统的外部数据,简称外部数据。通常情况下,外部数据需要完整性或者机密性的保证。信任系统间的数据交换就是外部数据的交换。Key分发系统建立了系统间信任关系,分配的key,可以用来签名或者加密应用数据。这里提供一个外部数据表示模块,完成这样的任务。


  • 7.11.1 编程接口

    • limax.key.ed.Transformer

      数据转换对象,编码解码外部数据。

      构造函数:

      • Transformer(KeyAllocator keyAllocator)

        Key分配器的基础上创建Transformer对象。

      • Transformer(Map<URI, byte[]> keyAllocator)

        将Map对象keyAllocator看作是一个Key分配器,创建Transformer对象。提供这样的方法可以简化调试,也可以满足极其简单的环境下的应用需求。这里的Map对象不作拷贝,直接引用,所以创建Transformer对象之后,也可以修改Map,这种情况下建议使用ConcurrentHashMap,避免并发异常。

        特别的,这里的URI允许设置fragment部分配置外部数据超时,例如,G0#10s,约定了使用group G0编码的外部数据10s超时,许可的单位为s,m,h,分别为秒,分,小时,如果不带单位,默认为毫秒。fragment不存在或者解析失败则不作超时检测fragment不作为group一部分。解码外部数据时检测到超时抛出limax.key.KeyException,类型为ServerRekeyed。

      成员函数:

      • ByteArrayCodecFunction getEncoder(URI uri, KeyProtector keyProtector, Compressor compressor)

        获得一个编码函数对象,使用这个对象执行编码操作。编码原始数据data,首先使用compressor指定的算法执行压缩,然后使用uri指定的group分配key,最后使用keyProtector指定的算法加密或者签名。执行过程中的任何异常都转换为CodecException抛出。

      • ByteArrayCodecFunction getDecoder()

        获得一个解码函数对象,使用这个对象执行解码操作。uri,keyProtector,compressor相关信息在编码过程中已经打包在编码结果中了,所以获取解码器不需要任何参数。执行过程中的任何异常都转换为CodecException抛出。


    • limax.key.ed.Compressor

      枚举类型,指定压缩方法。如果压缩之后的数据尺寸没有减小,自动输出为不压缩的格式。

      • NONE

        不压缩

      • RFC2118

        使用limax.codec.RFC2118Encode,limax.codec.RFC2118Decode,执行压缩解压。

      • ZIP

        使用java.util.zip.Deflater,limax.util.zip.Inflater,执行压缩解压。


    • limax.key.ed.KeyProtector

      枚举类型,指定签名或者加密方法。

      • HMACSHA224

      • HMACSHA256

      • HMACSHA384

      • HMACSHA512

      • TripleDESCBC

      • AESCBC128

      解码时,如果检测到签名失败,抛出CodecException,其中包裹了SignatureException。


  • 7.11.2 应用考虑


    • 1. 多数系统共享数据时,需要标识数据来源。按照安全系统的设计惯例可以将证书链打包传输,提供来源标识。基于下述原因,这里并不提供证书链打包支持。

      • 1.1. 一份数据一份证书链,空间开销过大。

      • 1.2. 即便提供证书链也无法保证来源真实性,假如信任系统内,存在一个恶意系统,这个恶意系统至少可以将任何的数据来源替换为自己。(如果简单附带证书链,可以替换为任意证书链,如果设计上能够提供一个随机串的Challenge机制,使用私钥签名随机串,则只能替换为自己)

      • 1.3 从上一条叙述可以看出,实际上证书链提供的标识,在仅有2个参与者的信任系统中才是不可伪造的。

    • 2. 信任系统应该根据具体需求,仔细定义交换的数据格式,提供诸如来源标识,时戳,有效期之类的信息。

    • 3. 为了简单,KeyProtector中,签名与加密实现为二选一。现实应用,例如IPSEC,尽管AH/ESP支持同时使用,绝大多数时候没人这样使用。


上一页 下一页