Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
ISO/IEC 26300-2是办公应用开放文档格式(ODF)v1.3标准的第2部分,规定了将ODF内容、元数据和相关资源封装到单个文件中的包格式。第1部分定义了XML内容模式(包内以XML文件形式表示的实际文档结构),第2部分则定义了这些XML文件如何组装到基于ZIP的容器中,并附带清单条目、元数据流和数字签名支持。理解包层面对于从事文档处理、归档或互操作性工作的任何工程师来说都是必不可少的。
ODF包格式建立在ZIP存档规范之上,并增加了确保跨实现可预测处理的额外约束:
| 包元素 | 必需 | 位置 | 用途 |
|---|---|---|---|
| mimetype条目 | 是 | ZIP中第一个条目,不压缩 | 媒体类型标识(例如 application/vnd.oasis.opendocument.text) |
| META-INF/manifest.xml | 是 | META-INF目录中的标准XML文件 | 文件列表、媒体类型、加密信息和版本元数据 |
| META-INF/signatures.xml | 否 | META-INF目录中的可选文件 | 用于文档完整性和身份验证的XML数字签名 |
| 内容文件 | 是 | 根目录或子目录 | content.xml、styles.xml、meta.xml、settings.xml和嵌入资源 |
| META-INF/manifest.key | 否 | META-INF目录中的可选文件 | 密码保护文档的加密密钥派生数据 |
mimetype条目是包中约束最严格的元素。它必须是ZIP存档中的第一个条目,不压缩存储,且恰好包含媒体类型字符串后跟一个换行符(0x0A)。这种设计允许文件类型检测工具(如Unix的file命令)通过读取文件的前50-80字节来识别ODF文档,而无需解析完整的ZIP结构——显著提高了大型文档存档上的检测性能。
manifest.xml文件作为包的目录。包中的每个文件(除了mimetype条目本身)都必须在清单中列出,附带其媒体类型,以及可选的加密信息。清单还存储ODF版本和处理包内容所需的任何命名空间声明。
ISO/IEC 26300-2规定了基于信封和基于清单的数字签名机制。信封签名将整个包作为二进制大对象进行签名,而清单签名对包内的各个文件进行签名,通过其清单条目路径进行标识。
信封签名更简单但灵活性较差:签名检测包中任何文件的任何修改。这适用于文档完整性至关重要的归档用例。然而,当应用程序需要向包添加元数据(如打印时间戳)而不使原始签名无效时,信封签名就会失效。
基于清单的签名通过独立签名各个文件解决了这一灵活性问题。应用程序可以向包添加新文件(例如扩展元数据流),并仅对该新文件进行签名,而不影响现有内容文件的签名。清单跟踪哪些文件已签名以及每个文件由哪个签名覆盖。
数字签名格式使用XML签名语法和处理规范(XML-DSig,W3C推荐标准),支持X.509证书、基于HMAC的密钥和引用签名格式。ODF v1.3增加了对长期验证(LTV)配置的支持,使签名在签名证书过期数十年后仍可验证——这是电子记录管理的关键要求。
构建稳健的ODF处理工具需要仔细关注包层面的细节,而这些细节经常被专注于XML内容的开发者忽视:
流式处理与随机访问处理:对于大型ODF包(例如嵌入视频的演示文稿,或包含数千张图像的电子表格),随机访问ZIP读取至关重要。清单提供了每个条目的字节偏移量,使阅读器可以直接定位到特定文件,而无需解压缩整个包。当性能至关重要时,请使用支持条目级随机访问的ZIP实现,而不是顺序解压缩。
加密处理:ODF v1.3支持包级加密(整个内容被加密)和文件级加密(包内的单个文件被加密)。文件级加密更加灵活,但需要仔细的密钥管理。manifest.xml存储每个加密文件的加密算法、密钥派生方法(具有可配置迭代次数的PBKDF2)和初始化向量。实现必须至少支持CBC模式下的AES-128,使用SHA-256作为密钥派生的哈希算法。
向后兼容性:ODF v1.3包设计为可由ODF v1.2实现读取,前提是v1.2实现忽略了清单和内容文件中的未知元素。然而,v1.3特定功能(新的元数据元素、增强的数字签名、额外的媒体类型)会被v1.2处理器静默忽略。应用程序应始终在清单中声明覆盖其使用功能的最小ODF版本。