デジタル署名
情報セキュリティ国際評価基準 (CC: Common Criteria) のデジタル署名プラクティスの適用ガイドライン
Jack Davis
手書きで署名された紙のドキュメントからデジタル署名された電子ファイルへの移行は早いペースで進んでいます。デジタル署名付きの電子ドキュメントが、ユーザーのニーズと証明書要件を満たすには、手書きで署名された紙のドキュメントと同等の機能とセキュリティを提供する必要があります。この記事では、ソフトウェア開発者がこれを実現する方法について説明します。具体的には、ISO/IEC 15408 情報セキュリティ国際評価基準 (CC: Common Criteria) の要件を満たすデジタル署名機能が組み込まれたアプリケーションをデザインします。
ドキュメントとデータ ファイルに関して、デジタル署名によってもたらされる主な機能は次の 2 つです。
- ドキュメントまたはファイル コンテンツの発信者 (署名者) の身元を特定する
- 署名された情報が、署名の適用後に改変されていないことを確認する
ソフトウェア開発者と UI デザイナーは、デジタル署名をサポートするアプリケーションを作成する場合、"見たものが署名の対象" (WYSIWYS: What You See Is What You Sign) という基本原則だけでなく、その他にもセキュリティやユーザーについていくつか考慮すべき事項があることを認識しておく必要があります。また、証明書の要件を満たすうえで、製品に影響する可能性があるセキュリティの問題についても理解することが必要です。ISO/IEC 15408 CC セキュリティ用などの証明書は、ユーザビリティ標準とセキュリティ標準のテストが完了している製品を、組織やユーザーが識別するための信頼できる手段を提供します。最近では、独立機関のセキュリティ証明書が添えられていることが、購入決定の前提要件となるケースが増えてきています。
この記事を読み終えるまでには、デジタル署名関連の問題の範囲、およびユーザーに明確かつ正確に情報を開示することが本質的なニーズであることをよりよく理解されるでしょう。
ISO/IEC 15408 CC セキュリティ証明書
国際標準化機構 (ISO) および国際電気標準会議 (IEC) の支持を受けている CC は、情報テクノロジ製品のセキュリティ機能のアクセスと承認のための方法論をまとめたものです。CC セキュリティの手法は、ISO/IEC 標準 15408 と 18045 で公開されています。
この記事の執筆時点では、26 か国が CC セキュリティ標準を承認および採用しています。CC メンバーの一覧については、commoncriteriaportal.org/members.html (英語) を参照してください。
Office Open XML と Open Packaging Conventions
ISO/IEC は、2008 年に Office Open XML (OOXML) をオープン国際標準として承認、採用しました。OOXML の Open Packaging Conventions (OPC) コンポーネントは、業界標準のコンテナー ファイル テクノロジを提供します。OPC は ZIP と XML を組み合わせて使用し、オープンで簡単にアクセスできるファイル形式をアプリケーションが定義できるようにします。OPC では、デジタル署名、メタデータのプロパティ、およびコンテンツの関係をサポートする機能も定義します。アプリケーション データと OPC 要素へのアクセスは、共通の API セットにより実現されます。
Microsoft Word (.docx)、Excel (.xlsx)、PowerPoint (.pptx)、および XML Paper Specification (.xps) は、OPC ベースのファイル形式の例で、それぞれ特定のアプリケーションに関連付けられている一意のコンテンツ構成 (スキーマ) を採用しています。各 OPC ファイル形式では、デジタル署名についての独自の署名ポリシーを定義することもできます。あるファイル形式の署名ポリシーでは、デジタル署名の設定プロセスまたは検証プロセスの一環として、署名が必要なコンテンツ項目、任意で署名をできる項目、署名をすべきではない項目を指定します。
この記事では、デジタル署名された電子ドキュメントに格納されている署名情報を検証および表示する方法について、さらに詳しく説明します。これらのデザイン上の考慮事項は、ISO/IEC 29500 および ECMA 376 Office Open XML 標準の OPC コンポーネントによって提供されるデジタル署名機能を基にしています。特定の OPC ベースのファイル形式のデジタル署名ポリシーには、この記事で説明する署名オプションのサブセットしか採用されていないことに留意してください。
デジタル署名
OPC ファイル形式 (OOXML で規定されているファイル形式など) では、X.509 証明書と XML デジタル署名 (W3C、2008 年) のテクノロジを使用して、以下の 2 つのセキュリティ機能を提供します。
- ID 否認: 署名者である個人またはグループを安全に識別します。
- コンテンツ検証: すべての署名付きコンテンツが存在し、署名後にいかなる方法でも変更されていないことを安全に保証します。
デジタル署名の一部またはそのデジタル署名によって署名されているコンテンツが変更されると、署名の検証中に検出され、署名が破損していることを示すエラー メッセージがユーザーに通知されます。
この記事の図の一部は、ユーザーに表示されるサンプル通知または状態メッセージの例です。署名の検証の合否を確認する場合でも、ユーザーが認識すべき特別な機能に注意を喚起する場合でも、このようなメッセージには明確で具体的な表現を使用します。アプリケーションでは、ユーザーにこれらのデジタル署名の状態メッセージを表示するタイミングと場所を定義します。 デジタル署名の検証は、署名済みドキュメントを開くときには常に自動で実行されるように設定されている場合があります。このような場合、ユーザーがドキュメントを開くときに、メッセージが表示されます。ユーザーがメニューを選択して手動でデジタル署名の検証を実行する必要がある場合は、ポップアップ ダイアログ ボックスを使用して署名の状態を表示することができます。ソフトウェア開発者や UI デザイナーは、このようなユーザー メッセージのタイミングと場所をある程度自由に決めることができますが、できる限り直感的でわかりやすいものにすることを心がけてください。
署名のカテゴリ
署名と署名付きコンテンツの整合性の検証時に、アプリケーションから合否を報告することは、デジタル セキュリティで保護されたプログラムを作成する第一歩に過ぎません。アプリケーションが扱うさまざまな種類のコンテンツについて考慮する必要もあります。
包括的な署名と呼ばれる最も簡単な署名方式では、ユーザーがある 1 ドキュメント内のすべてのコンテンツに自身の署名を適用します。このデジタル署名と署名付きコンテンツは後で検証されて、有効か無効かが報告されます。図 1 は、ユーザーに表示されるデジタル署名の状態メッセージの例です。
図1 包括的な署名のユーザー メッセージの例
混乱や、信頼性についての誤った憶測が生まれないように、次の 4 つのカテゴリのドキュメント要素も考慮する必要があります。
- 未署名コンテンツ
- 署名付きコンテンツのグループ
- 外部参照コンテンツ
- 動的コンテンツ
包括的な署名
紙のドキュメントや契約書に署名をすることは、ほとんどの人がごく普通に行っています。個人のイニシャルを各ページに記したり、ドキュメントの最後に署名したりして、署名者の身元を明確にし、レビュー、承認、および受け入れを行ったことを認めます。
前述のとおり、デジタル ドキュメントでの最も簡単で単純な署名方法は、包括的な署名です。このタイプの署名として分類されるには、ドキュメント ファイルに関連付けられているすべてのコンテンツが、次の 4 つの条件を満たしている必要があります。
- すべてのコンテンツ項目が、同一のドキュメント パッケージ内に存在する。
- すべてのコンテンツ項目が静的である。
- 外部コンテンツへのリンクや参照がない。
- ドキュメント パッケージ内のすべてのコンテンツ項目が、署名されている。
ドキュメントが完全に静的であるには、マクロや外部ソースからの入力によって作成されるテキストなど、動的に変更可能な項目がコンテンツ要素に含まれていてはなりません。静的ドキュメント ファイル内のすべてのコンテンツ要素に署名されているときは、署名とそれに関連する署名付きコンテンツが有効か無効かを報告する概要結果を使って、デジタル署名と署名済みコンテンツの両方を確認できます。
図 2では、Signature 1 により文書パーツ r、s、および t に署名されています。後で署名の検証が実行されると、Signature 1 は完全かつ有効であり、この署名に関連する署名済みパーツ (r、s、および t) は署名後に変更されていないことを確認できます。
図 2 1 つの署名により署名されたコンテンツ
図 3 は、また別の署名方法として、ドキュメントに 2 つ (以上) の署名を適用する例を示しています。複数の個人が、ドキュメントのレビュー後にそれぞれの承認および受け入れを示す必要があるレビューと承認サイクルでは、複数の署名が使用されることがよくあります。この方式では、各署名は関連する署名済み文書パーツと併せて、個別に確認できます。
図 3 複数の署名により署名されたコンテンツ
署名を確認し、署名の各署名者と署名付きコンテンツの検証シナリオを特定するには、次のメソッドとプロパティを使用できます。
- PackageDigitalSignatureManager.VerifySignatures メソッド: 署名が有効であり、パッケージ内の署名済みパーツが変更されていないことを確認します。
- PackageDigitalSignature.Signer プロパティ: 署名者を特定する X.509 証明書のコピーを返します。
未署名コンテンツ
未署名コンテンツは、署名により示される信頼の関連付けにとってリスクとなる可能性があります。紙のドキュメントでは、一般に、各ページに署名またはイニシャルを記すことで、署名者の身元を明確にし、署名者がレビューおよび承認したことを認めます。未署名のページ (または後で署名しないで追加されたページ) には、署名者との正式な関連付けや法的効力がありません。
デジタル ドキュメントでは、デジタル署名とその関連コンテンツの検証により、ユーザーがその署名とそれに関連する署名付きコンテンツの両方を信頼できることが証明されます。ただし残念ながら、多くの非技術系ユーザーには、デジタル署名、署名付きコンテンツ、未署名コンテンツ、およびドキュメント コンポーネントがパッケージされるコンテナーの区別をできるだけの専門知識がありません。デジタル署名とその署名付きコンテンツが有効なことを示す検証結果のみが表示された場合、ユーザーは、信頼されている署名と関連付けがあると考えてはならない未署名コンテンツも含めて、パッケージ全体が検証されているものと、誤った推測をする可能性があります。未署名コンテンツは発信者を特定できる情報を持たず、ドキュメント パッケージ内の他のコンポーネントが署名または変更された後に追加できます。
署名による信頼の関連付けは、すべてのユーザーにとって明確なものでなければなりません。パッケージに未署名コンテンツが含まれていることをユーザーが認識できるようにし、未署名コンテンツと信頼できる署名付きコンテンツを明確に区別できるような手段を用意する必要があります。図 4 は、ユーザーが受け取るべきメッセージの例です。このメッセージでは、有効なデジタル署名付きドキュメントに未署名コンテンツが含まれていることをユーザーに通知しています。
図4 未署名コンテンツについてのユーザー メッセージの例
図 5 では、文書パーツ m と n は Signature 1 により署名されていて、検証可能です。ただし、この同じドキュメント パッケージには、x と y という未署名パーツも含まれていて、これらは検証できません。パーツ x と y は独立していて、暗黙的にも、Signature 1 との関連付けはありません。
図 5 未署名パーツを含む署名付きドキュメント
未署名パーツを含むパッケージの識別には、次のプロパティ、メソッド、および擬似コードを使用できます。
- PackageDigitalSignature.Signer プロパティ: 署名者を特定する X.509 証明書のコピーを返します。
- Package.GetParts メソッド: パッケージに含まれるすべてのパーツのコレクションを返します。
- PackageDigitalSignature.SignedParts プロパティ: 特定の署名によって署名されているすべてのパーツのコレクションを返します。
次の擬似コードは、ドキュメント パッケージに含まれるパーツに未署名のパーツがあるかどうかを確認します。
PackageDigitalSignatureManager dsm = new PackageDigitalSignatureManager(package);
PackagePartCollection partCollection = Package.GetParts();
foreach (PackagePart part in partCollection)
foreach (PackageDigitalSignature signature in dsm.Signatures)
{
// Search if "part" is included in signature.SignedParts.
// If "part" is included in signature.SignedParts
// then it is a signed part
// else it is an unsigned part
}
署名付きコンテンツのグループ
複数の署名付きコンテンツのグループを含むドキュメントも、関連付けにより示される暗黙の信頼にとってリスクとなります。紙のドキュメントでは、1 人目がページ上のあるセクションに、2 人目がページ上の別のセクションに署名できます。1 人目が署名する署名とページは、2 人目が署名するページとは正式な関連付けはありません。同様に、2 人目が署名する署名とページは、1 人目が署名するページとは正式な関連付けはありません。両人によって連署されたページのみが、共同の関連付けを表します。署名付きコンテンツのグループの例としては、ある 1 人が本文を執筆して署名し、別の何名かが参考に追加された付録を執筆して署名しているドキュメントが挙げられます。
一部のファイル形式では、コンテンツ要素ごとに署名者が異なる可能性があります。複数の署名が異なるコンテンツのグループに関連付けられている場合は、署名が互いに独立していること、および各署名とコンテンツのグループを個別に検証する必要があることをユーザーに伝える必要があります。図 6 は、署名付きコンテンツのグループを含むドキュメントに付随するユーザー メッセージの例です。
図6 署名付きコンテンツのグループについてのユーザー メッセージの例
図 7 では、文書パーツ r、s、および t は Signature 1 によって署名および検証され、文書パーツ x、y、および z は Signature 2 によって署名および検証されています。この 2 つの署名とそれらに関連するコンテンツのグループは、独立していて、同じドキュメント内に含まれていても互いに関連付けはありません。
図 7 2 つの署名付きグループ
図 7 のバリエーションとして、図 8 は、1 つ以上の文書パーツが 2 つ以上の署名によって連署されている状況を示しています。Signature 1 と Signature 2 は 1 つ以上の共通の項目 (グループ C) に連署していますが、Signature 1 と Group A との関係と、Signature 2 と Group B との関係は、やはり独立していて互いに関連付けはありません。ユーザーに提示する署名情報を記述する場合、独立しているコンテンツと連署されているコンテンツの署名の関連付けを明示的および明確に説明する必要があります。
図 8 署名付きグループと連署グループ
次のプロパティと擬似コードを使用すると、複数の署名付きコンテンツのグループを含むパッケージを識別できます。
- PackageDigitalSignature.Signer プロパティ: 署名者を特定する X.509 証明書のコピーを返します。
- PackageDigitalSignature.SignaturePart プロパティ: 署名を含むパーツ名を返します。
次の擬似コードは、パッケージに含まれる署名付きコンテンツのグループの一覧を作成します。
PackageDigitalSignatureManager dsm =
new PackageDigitalSignatureManager(package);
foreach (PackageDigitalSignature signature in dsm.Signatures)
{
// Add to list(signature.SignaturePart, signature.Signer);
}
// Upon completion the list will contain one entry for each signature
// along with the X.509 certificate that identifies the signer.
// If the list contains more than one entry and different signers,
// the package contains multiple signed content groups.
複数の署名付きコンテンツのグループのセキュリティを確保する
複数の署名付きコンテンツのグループが含まれていると、既存の署名とコンテンツに誤った関連付けを確立する目的で、不正な署名付きコンテンツがドキュメントに追加される可能性が高まるため、ファイル形式の署名ポリシーは複雑さを増します。この脅威からアプリケーションを保護するには、パッケージの signature-origin-relationships パーツの署名にユーザーの署名を要求できます (signature-origin-relationships パーツはパッケージに含まれる特殊なファイルで、\package\services\digital-signatures\_rels\origin.psdor.rels という名前です)。コンテンツと signature-origin-relationships パーツの両方が署名されている場合、後で署名を追加すると、signature-origin-relationships パーツが変更されて、元の署名が検証に合格せず、パッケージが無効であると報告されます。
外部参照コンテンツ
外部参照コンテンツも、関連付けによる誤った信頼のシナリオにつながる可能性があります。署名付きコンテンツ内の項目に、別の外部ドキュメントへの参照が含まれることがあります。参照先の他のドキュメントも署名されていない限り、外部参照は単なる情報と見なされ、署名付きドキュメントと正式な関連付けはありません。
外部リンクからアクセスするコンテンツや、ドキュメント パッケージ外部の参照は、いつでも変更される可能性があります。理想的には、署名対象のコンテンツには、ドキュメント パッケージ外の資料へのリンクや参照が含まれないようにします。外部資料へのリンクや参照を含むコンテンツの署名と検証が必要になる可能性がある状況を、ユーザーが明確に特定および理解できるようにする必要があります。図 9 は、外部参照コンテンツがドキュメントに含まれることを示すメッセージの例です。
図9 外部参照コンテンツについてのユーザー メッセージの例
外部資料へのリンクを含む署名付きコンテンツを検証する場合は、次のガイドラインに従ってください。
- 外部資料への参照とリンクが含まれることをユーザーに通知します。この通知では、外部資料が署名や署名による信頼との関連付けがなく、未署名であることを明示する必要があります。
- 署名付きの静的コンテンツと、未署名の外部資料とを明確に区別する手段をユーザーに提供します。たとえば、署名付きコンテンツをユーザーが検証および表示するときに、他の署名付きコンテンツへの内部リンクのみを表示し、外部リンクや外部コンテンツへの参照は非表示にします。
図 10 では、文書パーツ r、s、および t は Signature 1 によって署名され、検証可能です。しかし文書パーツ s には、パーツ t に対する内部の署名付き参照へのリンクと、未署名コンテンツ x およびコンテンツ y に対する 2 つの外部参照が含まれています。アプリケーションが検証時にユーザーに署名情報を示す場合、リンク x と y は Signature 1 との関連付けのない未署名コンテンツを参照していて、その他の検証済みコンテンツ要素 (パーツ r、s、および t) とは関係がないことを、明示的かつ明確にユーザーに通知する必要があります。
図 10 外部参照コンテンツ
外部コンテンツを参照する項目は、特定の OPC ファイル形式のスキーマを基に識別されます。この記事に付属の資料では、Word (.docx)、Excel (.xlsx)、および PowerPoint (.pptx) 用の Microsoft Office ファイル形式のファイル内の外部参照コンテンツの識別に使用できるメソッド、プロパティ、および擬似コードを提供しています。
動的コンテンツ
未署名の動的コンテンツも、関連付けによる誤った信頼を引き起こす可能性があります。動的で変更可能なコンテンツは、紙のドキュメントには例がありません。紙のドキュメントでは署名後に変更された場合、その署名は法的に無効になります。署名済みの紙のドキュメントに対する変更が法的効力を持つには、元の署名者によるレビュー、承認、および再署名が必要です。
署名による信頼という観点では、動的に追加、削除、または変更できるコンテンツは、まさにその性質上、署名できません。関数やマクロを実行することで作成されるテキストなどの動的コンテンツは、WYSIWYS という基本原則に反します。動的コンテンツは、一般に、"本日の日付" や "最終保存日" などの可変テキストを挿入する関数、Sum などの数式、参照フィールド、またはカスタム マクロの実行時に作成される他のコンテンツから生じます。
カスタム マクロを実行した結果として作成される動的コンテンツは、不正な目的で使用される可能性があり、セキュリティ上の脆弱性を生みます。実行可能な操作が含まれると、状況が複雑になり、ユーザーが動的コンテンツを明確に理解できにくくなります。WYSIWYS の原則を適用するには、署名が必要なドキュメントには動的コンテンツを含めず、静的コンテンツのみを含めるようにします。
動的コンテンツを含むドキュメントの署名と検証が必要な状況では、オープンで、明確かつ正確に、情報をユーザーに通知する必要があります。動的コンテンツを含むドキュメントへの署名が避けられない場合は、次のガイドラインに従ってください。
- 動的コンテンツが含まれることをユーザーに通知する。この通知では、動的コンテンツは未署名であり、いかなる署名とも関係がなく、署名による信頼のいかなるレベルとも関連付けられないことを明示する必要があります。
- 署名付き静的コンテンツと、未署名の動的コンテンツとを明確に識別および区別する手段をユーザーに提供します。たとえば、署名付きコンテンツを検証および表示する場合、動的コンテンツは非表示にし、静的コンテンツのみが署名者に表示されるようにします。
図 11 は、動的に計算されるコンテンツについてユーザーに警告するメッセージの例です。
図11 動的コンテンツについてのユーザー メッセージの例
図 12 では、文書パーツ r と s は Signature 1 により署名されていて、検証可能です。ただし、このドキュメント パッケージには、動的コンテンツであるパーツ z も含まれていて、これは署名も検証もできません。パーツ z は独立していて、暗黙的にも、Signature 1 との関連付けはありません。
図 12 動的コンテンツ
動的コンテンツを含む項目は、特定の OPC ファイル形式のスキーマを基に識別されます。この記事に付属のオンライン資料では、Word (.docx)、Excel (.xlsx)、および PowerPoint (.pptx) 用の Microsoft Office ファイル形式のファイル内の動的コンテンツの識別に使用できるメソッド、プロパティ、および擬似コードを提供しています。
透明性を維持する
繰り返しになりますが、デジタル署名をサポートするアプリケーションを作成するときは、手書き署名により得られるのと同じ機能性と透明性をユーザーに確実に提供する必要があります。ソフトウェア開発者や UI デザイナーは、署名証明書 (X.509) と署名付きコンテンツ (暗号ハッシュ) の検証という基本操作に注意するだけでなく、ユーザーが直感的にわからない可能性がある状況について目を光らせる必要があります。
まとめると、以下のことが原因で、問題が発生する可能性があります。
- 未署名コンテンツの存在と識別
- 複数のコンテンツのグループの各署名者間の関連付け
- 未署名の外部参照資料の存在と識別
- 未署名の動的コンテンツの存在と識別
このようなコンテンツを仕様上アプリケーションから除外できない場合は、隠さず、正確にユーザーにその旨を通知する必要があります。繰り返しますが、デジタル署名情報の明確で正確な開示は、根本的なユーザー ニーズであり、ISO/IEC 15408 CC セキュリティ証明書の要件です。
電子ドキュメントへの移行が進む中、セキュリティを気にかける団体や個人は、ISO/IEC 15408 CC など、独立機関の証明書にますます依存するようになるでしょう。自社製品が現在の市場で成功を収められるようにするには、十分に時間をかけてユーザーおよびセキュリティ証明書の標準を満たすソフトウェア アプリケーションを作成してください。
詳細および各種標準へのリンクについては、この記事に付属のオンライン資料を参照してください。Microsoft Office ドキュメントに含まれる動的コンテンツや外部参照コンテンツを識別する方法の概要も、この中に含まれています。
Jack Davis は、Windows OPC "パッケージ" チームのプログラム マネージャーです。以前に MSDN マガジンの記事の執筆経験があり (2007 年 8 月号の「OPC: データのパッケージ化のための新しい標準」)、Microsoft パッケージ チームの Web サイト (blogs.msdn.com/opc、英語) にブログ記事を投稿しています。連絡先は jack.davis@microsoft.com (英語のみ) です。
「情報セキュリティ国際評価基準 (CC: Common Criteria) のデジタル署名プラクティスの適用ガイドライン」のための Web コンテンツ
デジタル署名を使用するための承認プラクティスに従ってアプリケーションが開発されていることを保証するために必要な情報へのリンクを以下に示します。
- ISO/IEC 15408「情報セキュリティ国際評価基準」(Common Criteria) の 3 部構成の資料は、ISO および Common Criteria Web サイトで公開されています。
- ISO: http://standards.iso.org/ittf/PubliclyAvailableStandards/index.html (英語)
- CC: http://www.ipa.go.jp/security/jisec/cc/index.html
- パート 1: 概説と一般モデル (改訂第 2 版、2005 年)
http://www.ipa.go.jp/security/jisec/cc/documents/CCPART1V3.1R1-J1.2.pdf - パート 2: セキュリティ機能コンポーネント (改訂第 2 版、2005 年)
http://www.ipa.go.jp/security/jisec/cc/documents/CCPART2V3.1R2-J2.0.pdf - パート 3: セキュリティ保証コンポーネント (改訂第 2 版、2006 年)
http://www.ipa.go.jp/security/jisec/cc/documents/CCPART3V3.1R2-J2.0.pdf
- ISO/IEC 18405「Methodology for IT Security Evaluation)」(IT セキュリティ評価のための方法、英語)
http://standards.iso.org/ittf/PubliclyAvailableStandards/c030830_ISO_IEC_18045_2005(E).zip - ISO/IEC 29500「Office Open XML File Formats」(Office Open XML ファイル形式、英語) の 4 部構成の資料は、ISO Web 標準サイト
(http://standards.iso.org/ittf/PubliclyAvailableStandards/、英語) で公開されています。
- ISO/IEC 29500-1、パート 1: Fundamentals and Markup Language Reference (基本原理およびマークアップ言語リファレンス、英語) http://standards.iso.org/ittf/PubliclyAvailableStandards/c051463_ISOIEC%2029500-1_2008%28E%29.ziphttp://standards.iso.org/ittf/PubliclyAvailableStandards/c051463_ISOIEC%2029500-1_2008_Electronic_inserts.zip
- ISO/IEC 29500-2、パート 2: Open Packaging Conventions (Open パッケージ化規則、英語)
http://standards.iso.org/ittf/PubliclyAvailableStandards/c051459_ISOIEC%2029500-2_2008%28E%29.ziphttp://standards.iso.org/ittf/PubliclyAvailableStandards/c051459_ISOIEC%2029500-2_2008_Electronic_inserts.zip - ISO/IEC 29500-3、パート 3: Markup Compatibility and Extensibility (マークアップの互換性と拡張性、英語)
http://standards.iso.org/ittf/PubliclyAvailableStandards/c051461_ISOIEC%2029500-3_2008%28E%29.zip - *ISO/IEC 29500-4、パート 4: Transitional Migration Features (推移期における移行機能、英語)
http://standards.iso.org/ittf/PubliclyAvailableStandards/c051462_ISOIEC%2029500-4_2008%28E%29.ziphttp://standards.iso.org/ittf/PubliclyAvailableStandards/c051462_ISOIEC%2029500-4_2008%28E%29_Electronic_inserts.zip
- Microsoft Open XML 形式 SDK、https://msdn.microsoft.com/ja-jp/library/bb226703.aspx
- Microsoft .NET System.IO.Packaging Open Packaging Conventions API
https://msdn.microsoft.com/ja-jp/windows/default.aspx
Web アドレスは変更される可能性があるため、上記の Web サイトに接続できない場合があります。
Office ドキュメント内の動的コンテンツおよび外部参照コンテンツを識別する
要素が動的コンテンツや外部参照コンテンツであるかどうかは、特定の OPC ファイル形式のスキーマを基に識別されます。ここでは、Word (.docx)、Excel (.xlsx)、および PowerPoint (.pptx) 用の Microsoft Office ファイル形式のファイル内の動的コンテンツと外部参照コンテンツを識別する方法について概説します。この概説は包括的なものではないため、その他の詳細については、OOXML ファイル形式標準の ISO/IEC 29500-3 「Part 3: Markup Compatibility and Extensibility」(パート3: マークアップの互換性と拡張性) を参照してください。
Office ドキュメントの構造
Word、Excel、 PowerPoint ドキュメント用の OOXML ファイル形式では、コンテンツの保存に共通の構造を採用しています。
- /[Content_Types].xml ファイル
- /_rels/ フォルダー
- /docProps/ フォルダー
- /<ドキュメントの種類>/ フォルダー。/<ドキュメントの種類>/ は次のものが該当します。
- Word 文書 (.docx) の場合: /word/
- Excel ドキュメント (.xlsx) の場合: /xl/
- PowerPoint ドキュメント (.pptx) の場合: /ppt/
[Content-Types].xml パーツには、パッケージに含まれるすべてのパーツの MIME (Multipurpose Internet Mail Extension) の種類が含まれます。コンテンツの種類のマークアップには、次の 2 種類の要素を定義できます。
- Default Extension 要素: パーツ (ファイル名) 拡張子と指定された MIME コンテンツの種類との既定の関連付けを定義します。次に例を示します。
<Default Extension="png" ContentType="image/png" />
- Override PartName 要素: 特定のパーツと指定された MIME コンテンツの種類との関連付けを定義します。次に例を示します。
<Override PartName="/word/footnotes.xml"
ContentType="application/vnd.openxmlformats-
officedocument.wordprocessingml.footnotes+xml" />
[Content-Types].xml パーツに含まれる要素の ContentType 属性を使用すると、パッケージに格納されている項目の種類 (マクロで使用される Visual Basic プロジェクト ファイルなど) を識別できます。
OOXML ファイル形式のマークアップのその他の情報については、ISO/IEC 29500「Part 1: Fundamentals and Markup Language Reference」(パート 1: 基本原理およびマークアップ言語リファレンス) を参照してください。
Word 文書
フィールド
Word 文書にはフィールドを含めることができます。フィールドには、時刻、日付、文書のプロパティ、リンク、外部コンテンツへの参照、フォーム フィールドなど、さまざまなオブジェクトを定義できます。このような方法で使用されるフィールドで、動的コンテンツを指定できます。フィールドには、単純なフィールド (simple-field) と複雑なフィールド (complex-field ) の 2 種類があります。
次の擬似コード (p-コード) は、simple-field 要素を識別する方法を示しています。
Package pkg = Package.open(filepath);
PackagePartCollection parts = pkg.GetParts();
foreach(PackagePart part in parts)
Stream str = part.GetStream(); // Returns a Stream containing the part content
if str contains (‘<w:fldSimple *> * </w:fldSimple>’)
then
a simple-field exists
複雑なフィールドは、開始ステートメント、フィールド記述、終了ステートメントから成る複数行で記述されます。次の p-コード は、complex-field 要素を識別する方法を示しています。
Package pkg = Package.open(filepath);
PackagePartCollection parts = pkg.GetParts();
foreach(PackagePart part in parts)
Stream str = part.GetStream(); // Returns a Stream containing the part content
if str contains (‘<w:fldChar fldCharType="begin" * />’)
then
a complex-field exists
マクロ
マクロは、動的コンテンツを提供できるメカニズムの 1 つです。マクロは、Visual Basic ファイルとして Word 文書に格納されます。マクロを使用する Word 文書では、その文書の /[Content_Types].xml ファイルに、Visual Basic プロジェクトへの MIME コンテンツの種類の参照が含まれます。次の p-コード は、マクロの使用の有無を識別する方法を示しています。
Package pkg = Package.open(filepath);
PackagePartCollection parts = pkg.GetParts();
foreach(PackagePart part in parts)
Stream str = part.GetStream(); // Returns a Stream containing the part content
if str contains (‘*vbaProject’)
then
a macro exists
外部参照
Word 文書では、ハイパーリンク、サブ文書、OLE オブジェクト、または差し込み印刷要素を利用して、外部参照を定義できます。次の p-コード は、文書に外部参照が使用されているかどうかを識別する方法の 1 つを示しています。
Package pkg = Package.open(filepath);
PackagePartCollection parts = pkg.GetParts();
foreach(PackagePart part in parts)
Stream str = part.GetStream(); // Returns a Stream containing the part content
if str contains (‘href’ or ‘Hyperlink’ or ‘External’)
then
an external reference exists
Excel ドキュメント
集計フィールド
Excel ドキュメント内の動的コンテンツは集計フィールドに格納されます。集計フィールドは、値が関数によって計算されるフィールドです。次の p-コード は、Excel ドキュメントに集計セルが使用されているかどうかを識別する方法を示しています。
Package pkg = Package.open(filepath);
PackagePartCollection parts = pkg.GetParts();
foreach(PackagePart part in parts)
Stream str = part.GetStream(); // Returns a Stream containing the part content
if str contains (‘<f *> * </f>’)
then
a calculated field exists
日付と時刻
ヘッダーやフッター内などの日付と時刻の情報は、(たとえば印刷時に) 自動的に更新されるように定義できます。動的な日付と時刻の情報は、シートの記述ファイル \xl\worksheets\sheetX.xml (X はシート番号) で定義します。シート記述ファイルには、関連するコンテンツを定義するヘッダーおよびフッター要素 (headerFooter) を記述できます。コンテンツ値 &C、&D、および &T は、動的な日付と時刻の値のプレースホルダーとして機能します。XML マークアップ内では、&C は Current、&D は Date、&T は Time を表します。&C は常に &D と &T の前に置かれ、どちらとも連結して &C&D&T や &C&T&D のような文字列を作成することも可能です。
マクロ
Word 文書と同様に、マクロは、Visual Basic ファイルとして Excel ドキュメントに格納されます。マクロを使用するドキュメントでは、/[Content_Types].xml ファイルに、Visual Basic プロジェクトへの MIME コンテンツの種類の参照が含まれます。Excel 内のマクロの使用の有無を検出する p-コードは、Word と同様です。前述の「Word 文書」の「マクロ」に記載している p-コードを使用して、Excel 内のマクロの使用の有無も検出できます。
外部参照
Excel 内の外部参照は、Word と同じ方法で実装されます。Excel 内の外部参照の識別の詳細については、「Word 文書」の「外部参照」を参照してください。
データベースや外部データ ソースからのデータ
Excel ではさらに、データベースやその他の外部データ ソースからドキュメントにデータを動的に取得できます。外部データ ソースは、その外部ソースへの接続の定義によって参照されます。接続の定義は、パッケージに格納される /xl/connections.xml パーツに指定されます。利用できるデータ ソース接続の種類には次のものがあります。
- ODBC ベースのソース
- DAO ベースのソース
- ファイルベースのソース
- Web クエリ
- OLE DB ベースのソース
- テキストベースのソース
- ADO レコード セット
- データ セット プロバイダー (DSP)
データ ソースのその他の情報については、ISO/IEC 29500-1「Fundamentals and Markup Language Reference」(パート 1: 基本原理およびマークアップ言語リファレンス) のセクション 12.3.4「Connections Part」(接続パーツ) を参照してください。次の p-コード は、Excel ドキュメント内の外部データ接続を識別する方法を示しています。
Package pkg = Package.open(filepath);
PackagePart connPart= pkg.GetPart("/xl/connections.xml");
if connPart is not null // file "/xl/connections.xml" exists
then
an external data source exists
揮発性データ
揮発性データは、Excel が外部データ ソースに接続するまた別の方法です。揮発性の依存関係は、リアルタイム データ (RTD) を基盤とするデータ キャッシュによって実現されます。RTD 接続では、ローカル コンピューターにインストールされている COM オブジェクトが、Excel ドキュメントに目的のデータを提供します。揮発性データのその他の情報については、ISO/IEC 29500-1「Fundamentals and Markup Language Reference」(パート 1: 基本原理およびマークアップ言語リファレンス) のセクション 18.15「Volatile Dependencies」(揮発性の依存関係) を参照してください。次の p-コード は、Excel ドキュメント内の RTD データ接続を識別する方法を示しています。
Package pkg = Package.open(filepath);
PackagePartCollection parts = pkg.GetParts();
foreach(PackagePart part in parts)
Stream str = part.GetStream(); // Returns a Stream containing the part content
if str contains (‘<volTypes *>’)
then
volatile data exists
PowerPoint ドキュメント
日付と時刻
PowerPoint プレゼンテーション内のスライドにも、動的な日付と時刻の要素を含めることができます。動的な日付と時刻の情報は、各スライドの記述ファイル \ppt\slides\slideX.xml (X はスライド番号) で定義します。動的な日付と時刻の要素を含むスライドには、type 属性の値が datetime に設定されている date 要素があります。次の p-コード は、PowerPoint ドキュメントに動的な日付と時刻の要素が使用されているかどうかを識別する方法を示しています。
Package pkg = Package.open(filepath);
PackagePartCollection parts = pkg.GetParts();
foreach(PackagePart part in parts)
Stream str = part.GetStream(); // Returns a Stream containing the part content
if str contains (‘datetime’)
then
a date-time element exists
マクロ
Word 文書や Excel ドキュメントと同様に、マクロは、Visual Basic ファイルとして PowerPoint ドキュメントに格納されます。マクロを使用するドキュメントでは、/[Content_Types].xml ファイルに、Visual Basic プロジェクトへの MIME コンテンツの種類の参照が含まれます。PowerPoint 内のマクロの使用の有無を検出する p-コードは、Word 文書や Excel ドキュメントと同じです。
外部参照
PowerPoint 内の外部参照は、Word や Excel と同様に実装されます。