2019年12月22日日曜日

23: オフィスファイルをプログラムからオープンパスワードで暗号化する

<このシリーズの前の記事 | このシリーズの目次 | このシリーズの次の記事>

オフィスファイル(OpenDocument 'odt'、'ods'、'odp'ファイル、Microsoft Office 'doc'、'docx'、'xls'、'xlsx'、'pptx'ファイル)をあなたのプログラムから暗号化する。

話題


About: UNO (Universal Network Objects)
About: LibreOffice
About: Apache OpenOffice
About: Javaプログラミング言語
About: C++
About: Microsoft .NET Framework
About: Pythonプログラミング言語
About: LibreOffice Basic
About: Apache OpenOffice Basic
About: BeanShell
About: JavaScript

この記事の目次


開始コンテキスト



ターゲットコンテキスト



  • 読者は、オフィスドキュメントファイル(OpenDocument 'odt'、'ods'、'odp'ファイル、Microsoft Office 'doc'、'docx'、'xls'、'xlsx'、'pptx'ファイル)を読者のプログラムから、LibreOfficeまたはApache OpenOfficeおよびUNOを用いて、ファイルオープンパスワードで暗号化する方法を知る。
ト書き
Hypothesizer 7、Objector 23A、Objector 23Bがコンピューターの前にいる。


オリエンテーション


Hypothesizer 7
本記事では、オフィスドキュメントファイルを私たちのプログラムからファイルオープンパスワードで暗号化する方法を知ります。

Objector 23A
実のところ、私は、新たなオフィスドキュメントファイルをパスワード付きで格納したいわけ、既存ファイルにパスワードをセットするのではなく。

Hypothesizer 7
ようこそ、サー!本記事は、オープンされたオフィスドキュメントをファイル(そのファイルが既存であろうが新規であろうが)に、ファイルオープンパスワード付きで格納することについてのものです。もしも、ファイルが既存であれば、そのファイルは、まずオープンされ、次に格納されます。本記事は、コンバージョンのターゲットファイルにファイルオープンパスワードをセットすることにも適用できます、なぜなら、ファイルコンバージョンというのは、コンバート元ファイルをオープンして、そのドキュメントを指定したフォーマットで格納することだからです。

Objector 23A
「オフィスドキュメントファイル」とあなたは言っているが、どんなフォーマットを念頭においているのかね?

Hypothesizer 7
念頭に置いているのは、OpenDocument 'odt'、'ods'、'odp'フォーマット、Microsoft Office 'doc'、'docx'、'xls'、'xlsx'、'pptx'フォーマットです。

Objector 23A
'ppt'フォーマットを抜かしたが...

Hypothesizer 7
実は、Microsoft 'ppt'フォーマットは、本記事で紹介される、LibreOfficeまたはApache OpenOfficeおよびUNOを用いる方法ではサポートされていません。

Objector 23A
...LibreOfficeは'ppt'フォーマットをサポートしないのか?

Hypothesizer 7
LibreOfficeは'ppt'フォーマットを全然サポートしないというわけではありませんが、少なくとも、'ppt'フォーマットファイルにパスワードを設定することはサポートしません。

実際には、LibreOfficeまたはApache OpenOffice GUIのファイル保存ダイアログでパスワードをセットできる任意のドキュメントファイルに任意のパスワードを、私たちのプログラムからセットすることができます。

Objector 23A
えーと、任意のファイルオープンパスワードをセットすることについて話しているのか、それとも任意のパスワードをセットすることについてなのか?

Hypothesizer 7
私が「任意のファイルオープンパスワード」と言うときは、それは任意のファイルオープンパスワードであり、私が「任意のパスワード」と言うときは、それは任意のパスワードです、任意のファイル編集パスワードを含めて。

Objector 23A
それでは、本記事では、あなたはファイルオープンパスワードについてのみ話すのか?

Hypothesizer 7
はい。

Objector 23A
なぜだ?

Hypothesizer 7
なぜなら、ファイル編集パスワードを設定する方法はそれほど簡単ではない一方、ファイル編集パスワードを設定することにそれほど意義があるとは思われないからです。

Objector 23A
...どのように「それほど簡単ではない」のだ?

Hypothesizer 7
ファイル編集パスワードのハッシュを指定しなければなりません、パスワード文字列ではなく、したがって、ハッシュを生成するロジックを実装する必要があります。

Objector 23A
おお。...それでは、なぜ、「それほど意義があるとは思われない」のか?

Hypothesizer 7
あるドキュメントがファイルオープンパスワードで暗号化されている場合、そのドキュメントのコンテンツは、どのソフトウェア(またはハードウェア)によっても読まれることがありません、パスワードが知られない限り。

Objector 23A
それで?

Hypothesizer 7
あるドキュメントにファイル編集パスワードが設定されている場合、実際には、その保護は、そのドキュメントをオープンするのに使われたソフトウェアの自由裁量に委ねられます。

Objector 23A
...「自由裁量に委ねられ」るとは、どういう意味だ?

Hypothesizer 7
そのソフトウェアは、コンテンツを知っているので、そのコンテンツをユーザーにただ編集させることができます、ファイル編集パスワードをただ無視して。

Objector 23A
...

Hypothesizer 7
例えば、たとえ、Microsoft Wordプログラムが、ある'docx'ドキュメントの編集を許さないとしても、もしも、あるサードパーティ製ソフトウェア(例えば、LibreOffice)が、ファイル編集パスワードを無視してそのドキュメントの編集を許せば、そのドキュメントはそのサードパーティ製ソフトウェアによって編集できてしまいます。

Objector 23A
ああ...、もしも、その'docx'ドキュメントはMicrosoft製品でしかオープンできないというのであれば、Microsoftがそのドキュメントをコントロールできるかもしれないが、ファイル編集パスワードをただ無視するサードパーティ製プログラムがそのドキュメントをオープンできるので、保護は、サードパーティ製プログラムを使うことによって出し抜けることになるな...

Objector 23B
あなた、「UNO」って言った?

Hypothesizer 7
はい、マダム、そう申しました。

Objector 23B
あの、私は初心者なんだけど...

Hypothesizer 7
それは、全く問題ではありません。'開始コンテキスト'に挙げられている前提知識を学んで非初心者になればよいだけです。

Objector 23B
...初心者だと私は言ってるわけ。

Hypothesizer 7
...えーと、現在は初心者だという方の手助けはできると思いますが、学ぶことを拒んで初心者である続けようとされる方に何ができるかは私には分かりません。

Objector 23B
何ですって?私は客ですよ!

Hypothesizer 7
いかなるお客様も、宇宙の法則の上にはおられません。必要前提知識が、読者がお客様であるという理由によって、たとえそれがとても重要なお客様だとしても、必要前提でなくなるということはありません。

Objector 23B
でも多すぎるでしょうに!

Hypothesizer 7
必要前提であるものが、多すぎるという理由によって必要前提でなくなりはしないのですよ。

Objector 23B
...なんで、初心者に優しくできないわけ?

Hypothesizer 7
...お求めになっていることが理解できないのですが。「優しく」することで、必要前提であるものが必要前提でなくなりはしません。...全ての必要前提事項をここで繰り返すようお求めでしたら、それは非実際的でしょう(本記事は、本題に入る前にとても長くなってしまうでしょう)...

Objector 23B
なんで分からないわけ!

Hypothesizer 7
全くなぜでございましょう。

Objector 23B
必要前提知識を全く持たない誰にでも分かるように説明しなさい。

Hypothesizer 7
そんな御無体な。...初等算数を学ぶことを拒否しながら高等数学を教えろと要求するようなものです...

Objector 23B
具体的に私が何をすればよいかを示せば良いだけでしょう!

Hypothesizer 7
ご自分が何をしているかも、なぜそれをすべきかも理解せず、その方法を採択するべきかどうかもご自分で判断することなしにですか?...それは、奴隷制ですよ、私の意見では。

Objector 23B
...私がいいと言ってるんだから、それでいいんですよ。

Hypothesizer 7
あなたによくても、奴隷制に加担することは、私にはよくありません。それは、私の倫理的責務に反します。1人の奴隷が何を言うかの問題ではありません。

Objector 23B
じゃあ、あなたは神さまにほめてもらいたいだけってことね?

Hypothesizer 7
実のところ、倫理的に私が何らかの義務を負っているような神は存在しないと私は確信しております。

Objector 23B
...


本体


1: OpenDocument 'odt'、'ods'、'odp'ファイルまたはMicrosoft Office 'doc'、'xls'ファイルに対してセットすべきドキュメント格納プロパティ


Hypothesizer 7
本記事では、セットすべきドキュメント格納プロパティ群のみを紹介します。つまり、それらドキュメント格納プロパティ群の1つを使ってどのようにドキュメントをファイルに格納するかには立ち入りません。ドキュメントファイルをコンバートすることについての以前の記事(コンセプトあるJava実装あるC++実装あるC#実装あるPython実装あるLibreOffice Basic実装)に必要な情報が含まれています。

OpenDocument 'odt'、'ods'、'odp'ファイルまたはMicrosoft Office 'doc'、'xls'ファイルに対しては、名前が'Password'、値がファイルオープンパスワードのプレーン文字列であるプロパティを使用します。

Objector 23A
実は、そのプロパティを'docx'ファイルにセットしてみたのだが、期待する効果がなかったよ...

Hypothesizer 7
Microsoft 'docx'ファイルに対しては、次セクションで紹介されるプロパティをセットしなければなりません。


2: Microsoft Office 'docx'、'xlsx'、'pptx'ファイルに対してセットすべきドキュメント格納プロパティ


Hypothesizer 7
Microsoft Office 'docx'、'xlsx'、'pptx'ファイルに対しては、名前が'EncryptionData'、値が'com.sun.star.beans.NamedValue'配列(C++ではシーケンス,Pythonではリスト)であるプロパティを使用し、配列には、名前が'OOXPassword'で、値がファイルオープンパスワードのプレーン文字列である'com.sun.star.beans.NamedValue'値をセットします。

Objector 23A
はあ?

Hypothesizer 7
以下は、その'com.sun.star.beans.NamedValue'配列を用意するJavaコードです。

@Java ソースコード
import com.sun.star.beans.NamedValue;

			NamedValue [] l_encryptionDatumNameValuePairsArray = new NamedValue [1];
			l_encryptionDatumNameValuePairsArray [0] = new NamedValue ();
			l_encryptionDatumNameValuePairsArray [0].Name = "OOXPassword";
			l_encryptionDatumNameValuePairsArray [0].Value = "APassword";

以下は、その'com.sun.star.beans.NamedValue'配列を用意するC++コードです。ここで、'::theBiasPlanet::unoUtilities::stringsHandling::UnoExtendedStringHandler::getOustring (string const & a_utf8String)'は、指定したUTF-8 '::std::string'インスタンスからUNO文字列インスタンスを生成する、私のユーティリティクラスメソッドです(このクラスは、私のどのUNOサンプル(例えば、ファイルコンバーター)のZIPファイルにも含まれている'unoUtilitiesToBeDisclosed'プロジェクト内にあります)。

@C++ ソースコード
#include <com/sun/star/beans/NamedValue.hpp>
#include <com/sun/star/uno/Any.h>
#include <com/sun/star/uno/Sequence.hxx>
#include "theBiasPlanet/unoUtilities/stringsHandling/UnoExtendedStringHandler.hpp"

using namespace ::com::sun::star::beans;
using namespace ::com::sun::star::uno;
using namespace ::theBiasPlanet::unoUtilities::stringsHandling;

							Sequence <NamedValue> l_encryptionDatumNameValuePairsSequence (1);
							l_encryptionDatumNameValuePairsSequence [0] = NamedValue ();
							l_encryptionDatumNameValuePairsSequence [0].Name = UnoExtendedStringHandler::getOustring ("OOXPassword");
							l_encryptionDatumNameValuePairsSequence [0].Value = Any (UnoExtendedStringHandler::getOustring ("APassword"));

C#版を示す必要はないでしょう、Java版から容易に正しく推測できるでしょうから。

Objector 23A
ふーむ、その'EncryptionData'プロパティがそんなデータを受け付けると私はどのように知ると想定されているのかね?

Hypothesizer 7
私にも疑問です。実は、PGP署名データもそのプロパティに入りますが、それには本記事では立ち入りません。


3: 上記2ドキュメント格納プロパティ群は同時にはセットすべきではない


Hypothesizer 7
実は、Microsoft 'xls'に、上記2ドキュメント格納プロパティ群は同時にセットしてファイルオープンパスワードをセットしようとしました、無効な方はただ無視されるだろうと想定して。

それはうまくいきませんでした: 何らかのパスワードはセットされましたが、ファイルは意図したパスワードでオープンできませんでした。代わりにどんなパスワードがセットされているのか分かりませんでした。

したがって、上記2ドキュメント格納プロパティ群は同時にセットすべきではないようです。


4: 結びとその先


Hypothesizer 7
これで、OpenDocument 'odt'、'ods'、'odp'ファイルまたはMicrosoft Office 'doc'、'docx'、'xls'、'xlsx'、'pptx'ファイルを私たちののプログラムからLibreOfficeまたはApache OpenOfficeおよびUNOを使用してファイルオープンパスワードで暗号化する方法を知りました。

やらないといけないことは、適切なドキュメント格納プロパティを適切に設定することだけです。

LibreOfficeまたはApache OpenOfficeのドキュメント格納ダイアログでパスワードを設定可能な任意のファイルは、私たちのプログラムからパスワード付きで格納可能なはずですが、セットすべきプロパティは、本記事で紹介された2プロパティとは違うかもしれません。

ドキュメント格納ダイアログで見られるとおり、一部のドキュメントファイルは、PGPで暗号化することもできます。ご想像できるとおり、私たちのプログラムからそうすることができます。方法は、以降の記事で見ましょう。

ファイル編集パスワードをセットすることにはあまり意義があるとは思われないと申しましたが、ドキュメントにファイル編集パスワードをセットする方法も、以降の記事((OpenDocumentフォーマット群用MicrosoftバイナリーWordおよびExcelフォーマット用Office Open XMLフォーマット用))で見ましょう。

PDFファイルパスワード(オープン用、編集用)も、私たちのプログラムからセットできますが、方法は、以降の記事で見ましょう。


参考資料


<このシリーズの前の記事 | このシリーズの目次 | このシリーズの次の記事>