本文へジャンプ

ソフトウェア > Lotus > Lotus Developer Domain > 

Iris Today Archives

アプリケーションでのフィールド暗号化の利用


Lotus Software
by Richard Schwartz
レベル:中級者
対象:Domino 5.0
原文の掲載:2001年9月4日

Iris Today Archivesの原文(英語)

インデックス
シークレット・キーの暗号化理論
パブリック・キーの暗号化理論
ノーツの暗号化
アプリケーションでのフィールド暗号化の実行
シークレット・キーの作成と展開
アプリケーションの展開
アプリケーションの使用
Web アプリケーションでの暗号化
まとめ

10年以上前の最初のリリースから、ロータス ノーツは、組織環境下での情報共有の最も有効な解決方法になっています。当初から アイリス・アソシエイツは、情報共有がより良く機能するためには、共有の制限を適切に行える強固なセキュリティー・システムが必要であることを認識していました。

これはいくぶん矛盾しているように聞こえるかもしれません。しかし、基本的には、現実を反映していることなのです。システムは単に善良な人々に、情報を提供してくれるものだと信じていない場合、ユーザーはシステム上に情報を置くことはできません。ノーツの開発者たちのキー・コンセプトは次の文章からわかります。プログラマー、システム管理者たちがとても冷静で、正直で、そして重要な人々であるにもかかわらず、何人かのユーザーは、必ずしもそれらの開発に関わる人々に全情報を公開したいとは思っていません。この問題を解決するために、アイリスの開発者は、古くからあるテクノロジー「暗号化」を現代の形にしました。

この記事では、暗号化の基礎理論について述べています。ご使用中のアプリケーションで簡単に暗号化できるように、文書ライブラリー・テンプレートをもとに、ドミノのフィールド暗号化機能の実行方法について説明します。この記事は、ドミノデザイナーとドミノのアプリケーション開発について理解されている、中級レベルの方を対象に書かれています。

シークレット・キーの暗号化理論
暗号化(Encryption)は、かみくだいて言えば、情報を保存したり送ったりする際に情報を隠すために、アプリケーションをデータに変換させることです。暗号化技術の研究とそれに関連するテクノロジーは、暗号学として知られています。RSA Security (英語)は、複雑な数学的変換に基づいた、一般に言われている「パブリック・キー(公開鍵)」という暗号化技術を売り出す先駆けとなった会社です。そして商業用アプリケーションとして、この技術を最初にロータス ノーツに大々的に採用しました。今日では、パブリック・キー・インフラ(PKI: Public Key Infrastructure)をベースにした顧客を、世界で最も多くかかえているのがロータスです。

ノーツとドミノは、いくつかの異なる方法で暗号化を使用しています。本論では、フィールドの暗号化に焦点をしぼり説明します。Iris Today の記事、Notes from Support: Notes encryption: Locks for a digital world(英語) には、ノーツとドミノが使用している、この記事とは別の暗号化の方法が記載されています。

ノーツのフィールド暗号化の詳細について述べる前に、暗号化とは何かということを少し詳しく見ていきます。(より詳しくお知りになりたい場合は、ブルース・シュナイアー(Bruce Schnier)氏の Applied Cryptography(応用暗号学)を参照してください。ですが、この本は数学が苦手な人にとってはとても難解な本です。)暗号化について、"the application of transformations to data in order to hide information (情報を隠すためにアプリケーションをデータに変換させること)"と述べました。この定義について少し考えて頂きたいので、代わりに次のものを示します。

uif bqqmjdbujpo pg usbotgpsnbujpot up ebub jo psefs up ijef jogpsnbujpo

これは、文字置換暗号(a character substitution cipher)という、暗号化で最も簡単な形式の例です。本来の文の一文字一文字を、アルファベットの並びでその文字の後にくる文字に置き換える方法です。ここで、「z」は、一回り回って「a」に置き換わります。次のような変換表を使って、手書きでかなり簡単にできる方法です。

元の文字 a b c d e f g h i j k l m
暗号文字 b c d e f g h i j k l m n
元の文字 n o p q r s t u v w x y z
暗号文字 o p q r s t u v w x y z a

暗号化の方法は、上の行(元の文字)から該当する文字を見つけて、下の行(暗号文字)の対応する文字に置換するという方法です。復号化(暗号解読)方法は、その逆を行うことになります。おそらく、即座に復号規則から、この方法をそれほど時間をかけすに理解できます。このタイプの暗号化は、実に簡単で子供のゲームのようなものです。この方法はあまりにも簡単すぎて暗号と呼べるようなものではありません。ですが、これは2つの良い実例を示してくれています。まず第一に、データのセキュリティーは、キーの隠匿性によって決まるということを示しています。変換表の文字の並びを、メッセージを復号化する人は必ず知っている必要があります。しかし、その他の人には絶対漏れてはいけないものです。

第二に、ここで示した文字置換暗号の例は、暗号化がコンピューターにとても適した作業であるということです。コンピューターは、つねに文字をビットの組み合わせで表現しています。一般的にその多くは、文字を表現するのに、「ASCII」かあるいはその他のいくつかの良く知られたキャラクター・セットを使用しています。しかし、異なる暗号表現ができるようにするために、ソフトウェアは簡単に記述されています。この例には、説明したような文字置換方法としてロータス スクリプト・コードがあります。変換表の2つの行のズレを決めるパラメーターを、1から 26 までの範囲で用いると、この暗号化は一般化できます。(例えば、上記の変換表では、keynum (キー数字)パラメーターは「1」のアルゴリズムです。)

   Dim i As Integer
   Dim c As String
   Dim n As Integer

   For i = 1 To Len(ptext)
     c = Lcase(Mid(ptext,i,1))
     If c < "a" Or c > "z" Then
       ctext = ctext & c
     Else
       n = Asc(c) - Asc("a")
       c = Chr( ((n + keynum) Mod 26) + Asc("a") )
       ctext = ctext & c
     End If
   Next i

コードを示した主な目的は、この簡単な暗号化方法は、対称的暗号化(symmetric encryption)アルゴリズムとして知られているものだということを示すためです。上記のコードで入力データは、「plain text」を意味する ptext 変数です。「ptext」は、暗号使用者が、暗号化されていないデータに使用する言葉です。出力データは、「ciphertext」を意味する ctext 変数です。keynum 変数は、1から 26 の整数です。さらに詳しくこのコードを見ると、文字を0から 25 の範囲の整数に置き換えて、1回の処理で1つの文字を処理していることが読み取れるます。そして簡単な整数を追加し、剰余を求め、最後に文字に戻しています。この方法を対称的と呼ぶ理由は、全ての処理を逆に行うことができるからです。同じ「keynum」変数の値は、復号化アルゴリズムに用いられています。復号化アルゴリズムは、入力として暗号化テキストと同じキーを用いて、上記の逆の処理を行ってプレーン・テキスト(平文)を復元させます。対応する復号化アルゴリズムを次に示します。

Sub decipher(keynum As Integer, ctext As String, ptext As String)

   Dim i As Integer
   Dim c As String
   Dim n As Integer

   For i = 1 To Len(ctext)
     c = Lcase(Mid(ctext,i,1))
     If c < "a" Or c > "z" Then
       ptext = ptext & c
     Else
       n = Asc(c) - Asc("a")
       c = Chr( ( (26 + n - keynum) Mod 26) + Asc("a") )
       ptext = ptext & c
     End If
   Next I

End Sub

「ptext」、と「ctext」変数の違いのほかに、暗号解読コードと暗号コードとの間にはたった2つの違いしかありません。このように文字置換の方向は逆ですが、最も重要な違いは、それぞれの文字の値「n」に keynum 変数が加えられている代わりに、keynum 変数が引かれるということです。その他の違いは、26 の加算です。これは、負の整数値を、剰余処理(Mod)の入力値としないためです。

対称的暗号化が上記のような簡単な例であることを心配される場合、2、3世紀の間、これよりはるかに安全な対称的暗号化技術があるので、安全であると断言できます。この例は、まさに暗号化のレベルの低いものです。暗号化の安全性を評価する決定的な要因の1つは、キーの長さです。この例では、1から 26 のキー値が5ビットの数値で表せるので、キーの長さは5ビットです。ノーツは、フィールド暗号化に対して、より長いキーを利用すると共に、はるかに安全性の高い対称的暗号化アルゴリズムを使っています。長いキーを使用して、十分安全に機能する、いくつかの洗練された対称的アルゴリズムは、一般に多く使われています。それらのアルゴリズムは、とても高度なデータのセキュリティーを提供しています。
 
上に戻る
 
パブリック・キーの暗号化理論
もし非対称的暗号化が存在しないのであれば、対称的暗号化について多くを語ることは意味のないことになります。実際に非対称的暗号化は存在するのです。非対称的暗号作成の背景にある基本原則は、「a」と「b」というような一組の数学的な関連付けをもったキーやパブリック・キーを作成するということです。しかし、たとえ一組のキー・アルゴリズムの関係を知っていたとしても、「b」を見いだすことは極めて難しいことです。ということは、簡単な非対称アルゴリズムでさえも、しばしば「one-way trap door function (一方通行のトラップ・ドア機能)」という、ある種の数学問題に基づいて考えていく必要があります。このような機能は、2つの素数のかけ算であり、積の合成関数の結果と同じようなものです。積の回数を多くするのと同様に、多くの因数を選べば、高速コンピューターが、それを元の2つの素数へ因数分解するのには、たいへん長い時間を要します。

非対称的暗号化は、ホイットフィールド・ディフィ(Whitfield Diffie)とマーティン・ヘルマン(Martin Hellman)によって 1970 年代に民間企業で発明されて、後に、ロン・リヴェスト(Ron Rivest)、アディ・シャミア(Adi Shamir)、レン・エイドルマン(Len Adelman)やその他の人達によって改良されました。多くの専門家は、NSA (National Security Agency)とイギリス情報部の両方の団体が、10 年以上前から、非対称の暗号化を開発するための知識と能力を持っていたと確信しています。そして、おそらく、他のいくつかのセキュリティー・サービスにもそのようなものがあったと推測されます。しかし、最初に誰が本当にそれを開発したかという(かなりはっきりした)確固たる証明がありません。

残念なことに、ロータス スクリプトで非対称的暗号化の実例を示すことは、そう簡単なことではありません。トラップ・ドア機能の性質そのものを、説明することは困難です。現実的な例として、ロータス スクリプト処理を実行するより、たくさんの数で演算をしてみることです。非対称的暗号化を背景とする数学的簡潔な説明は、「数論とパブリック・キー暗号作成法」(Number Theory and Public Key Cryptography(英語))の中にある、ウィリアムス・ストリングスによる「暗号作成法およびネットワーク・セキュリティー使用のためのノーツの講義」(Lecture Notes for Use with Cryptography and Network Security by Williams Stallings(英語))に掲載されています。非対称的暗号化を実装する場合の Java ソース・コードの例は、コードの実例(Cracking the Code(英語))を参照してください。

実際の暗号化は、秘密にしておく必要がないキーをいつも使用するので、非対称的暗号化は、一般にパブリック・キー暗号として知られています。ユーザーは、パブリック・キーを公開しますが、数学的に関連付けられたプライベート・キーは秘密にしておきます。パブリック・キー暗号化のとても優れた点は、決して他の誰かに開示する必要がないため、それぞれのユーザーは、自らのプライベート・キーを秘密にしておくことができるという点です。対称的暗号化では、すべてのユーザーが、一つのシークレット・キーを適切に守っていることが前提になります。そして、一つの不正行為が、全てのユーザーのセキュリティーを崩壊させます。
 
上に戻る
 
ノーツの暗号化
ノーツでは、対称的暗号化は、シークレット・キー(秘密鍵)暗号として知られています。そして、ドミノデザイナーには、簡単に文書のフィールドを暗号化できるという特徴があります。ユーザーは、シークレット・キーを作成して、これらのキーに名前を付与することができます。アプリケーションは、SecretEncryptionKeys という特別なフィールドにある名前で、キーを参照しています。文書が保存されるとき、このフィールドで指定したキーが、ユーザー ID ファイルから取り出されます。そして、特別なプロパティーが付与された全フィールドは、それらのキーにより暗号化されます。

ノーツは、電子メールにパブリック・キー暗号を使用しています。そして、ドミノ・デザイナーもまた開発者に、文書フィールドの暗号化のため、パブリック・キー暗号機能を提供しています。パブリック・キーは、つねにユーザーに関連付けられています。アプリケーションは、PublicEncryptionKeys という特別なフィールドにあるユーザー名で、キーを参照しています。文書が保存されるとき、このフィールドにある全ユーザー名は、ドミノ・ディレクトリーあるいはユーザーの個人アドレス帳に置かれます。そして、特別なプロパティーが付与された全フィールドは、対応するキーが取り出されて、そのキーにより暗号化されます。
 
上に戻る
 
アプリケーションでのフィールド暗号化の実行
シークレット・キーとパブリック・キーの両方を用いたフィールド暗号化の例として、ドミノと一緒に出荷されている標準の文書ライブラリー・テンプレートの暗号化の実例を示します。次の機能を参照してください。
  • 「文書」、「返答」、および、「返答への返答」にある Body フィールドは、暗号化することができます。
  • 暗号化には、パブリック・キーまたはシークレット・キーのどちらか一方を使うことができます。
  • シークレット・キーは、プロファイル文書に格納されたリストから選ばれます。
エンド・ユーザーにとって好ましいことは、フィールド暗号化が解かりやすいものであり、フィールド暗号化を使用してデータベースの展開が簡素化できることです。Iris Sandbox(英語) から完成したテンプレートのコピーを1つダウンロードして試してみることができます。

ステップ1:文書ライブラリー・テンプレートのコピーの作成
ドミノ・デザイナーで、まず、データベースの Doc Library - Notes & Web (R5.0)(日本語版では "文書ライブラリー R5.0")[doclbw50.ntf] を開きます。次に、メニューから [ファイル] - [データベース] - [コピー] を選択して新しいコピー・ファイルを作成します。そして、異なるファイル名とタイトルでそのコピー・ファイルを保存します。例えば、データベース名として Encrypted Doc Library Template(暗号化文書ライブラリー) 、そしてファイル名は cryptlib.ntf に変更します。

Saving template with a new name

文書ライブラリー R5.0 のテンプレートを閉じます。それから、2つのテンプレートが、同じ設計テンプレート名になっていないことを確認するために、たった今作成したテンプレートを開き、データベースのプロパティーを開いて [設計] タブを表示させ、[テンプレートのデータベース] チェック・ボックスにチェック・マークを入れ、[テンプレート名] を変更します。例えば、EncryptedR50DocLib といったテンプレート名にします。

Changing the template name

ステップ2:プロファイル文書のフォームの設計
次のステップでは、プロファイル文書を作成するために、新規フォームをまず作ります。

テンプレートのコピーに変更を加え始めるとき、次のようなメッセージが表示されます。「指定したデータベースまたはテンプレートは、ロータス ノーツ Mail のユーザーが使用できますが、このアクションはその権限を無効にします。操作を続行しますか。(This database has been authorized for use by Lotus Notes Mail Users. This action will invalidate the authorization. Are you sure that you would like to proceed?)」 メッセージは、起動した doclb50w.ntf テンプレートに、ロータスが適用した特別なライセンス・スタンプにより表示されています。[はい] をクリックして、安全に処理を続けることができます。

そして、フォームの先頭に、「見出し」、「暗号化プロファイル」を配置することから、フォームの設計を開始します。2行2列の表を見出しの下に作ります。これらは単に、設計上の使いやすさのためのものです。要求された機能の一部分ではありません。しかし、良いレイアウトにすることは、設計上の有用性、および安全性に役立ちます。

フォーム上の表の左上セルの中に、EncType という名前のチェック・ボックス・フィールドを追加します。このフィールドは、個々のデータベースに応じて2つの暗号化のどちらかを適用させるために、オン/オフを切り替えて使用します。このチェック・ボックスの選択 プロパティーに2つの値、「シークレット・キー | S」と「パブリック・キー | P」を設定します。 (これは、キーワード・フィールドのエイリアスの例です。ノーツ・クライアントでは、意味表示としてテキスト文字を縦棒「|」の左側に、保存用の値として1文字を縦棒の右側に用いています。他のフォーム・コードでは、プロファイル文書のこのフィールドの「S」あるいは「P」という値を検索します。)

アプリケーションで使用される大部分の暗号化タイプは、シークレット・キーの暗号化が一般的になっているので、EncType フィールドに Default Value として、"S" を設定します。そして作成した表の右上セルに、フィールドの目的を説明する簡単なコメントを次のように入力します。「チェック・ボックスを確認して、どちらかの暗号化にチェック・マークを入れてください。シークレット・キー暗号化は、ユーザ ID ファイルに保存されているキーを使います。パブリック・キー暗号化は、ドミノ・ディレクトリー、あるいは、個人アドレス帳のユーザー文書に保存されているキーを使います。(Check one or both boxes to enable encryption. Secret key encryption uses keys stored in user id files. Public key encryption uses keys stored in person documents in the Domino Directory or your personal address book.)」

Adding the EncType field

次に、表の左下セルに、SecretKeyList という名前の、編集可能なテキスト・フィールドを作成します。必ずフィールド・プロパティー・ボックスの「複数値も可」チェック・ボックスにチェック・マークを入れます。このフィールドの Input validation の式は次のようにします。

@If(EncType = "S" & SecretKeyList = "" & @IsDocBeingSaved;

   @Failure("You must supply the name of at least one secret key");
   @Success)

データベースのテンプレートから作成した文書の暗号化を行う全シークレット・キーのリストを設定するために、このフィールドを使います。シークレット・キー暗号化が、EncType フィールドで選択されている場合、Input validation の式がそのフィールドが空白でないことを確認します。アプリケーションのユーザーがあいまいなキー名を思い出す必要がなく、また誤って、権限のないユーザーに意図しないアクセスを実行させてしまうような不適切なキーを使うことがないといったことが、リストの作成で可能になるので、これは便利な方法です。

表の右下セルには、コメントを次のように入力れます。「ユーザー ID ファイルに保存されているキーの名前を入力します。これらのキーがないユーザーは、シークレット・キー暗号化が実行されている文書を読むことができません。(Enter the names of keys that are stored in user id files. Users who do not have these keys will not be able to read documents that are stored using secret key encryption.)」

Adding the SecretKeyList field

そして、「暗号プロファイル | Crypto」という名前でフォームを保存します。作成メニューに表示されないように、フォーム・プロパティーのフォーム情報タブの [表示] - [メニューに含む] のチェックをはずします。

ステップ3:エージェント作成
作成したフォームは、データベースのビューが表示されないプロファイル文書を、1つ作るのに使用します。もし、作成メニューからフォームを開いたならば、プロファイル文書でなく、通常の文書が作成されます。そのため、エージェントを使って、代わりにプロファイル文書を作成します。新しいエージェントを作り、次の処理を行います。
  • エージェントの「名前」の欄に「Set Up Encryption Profile (暗号化プロファイル文書の設定)」を入力します。
  • 共有エージェントのチェック・ボックスにチェックを入れます。
  • 「指定したエージェントの実行時期」の欄に、「アクション・メニューから手動で」を選択します。
  • 「実行する文書」の欄に、「@コマンド使用時に1回実行」を選択します。
  • 「実行」ドロップダウン・リストから「式」を選択します。
  • 式入力欄に、「@Command([EditProfile];"Crypto") 」を入力します。
Creating the setup encryption profile agent

ステップ4:3つのサブフォーム作成
次に行うことは、3つのサブフォームの作成です。3つのサブフォームは、ほとんど似たようなものですが、完全に一致したものではありません。データベースのフォームは、文書、シークレット・キーで暗号化した文書、およびパブリック・キーで暗号化した文書と、この3つの文書のプレーン・テキスト(平文)のサブフォームを利用しています。

これらの新しいサブフォームは、doblb50w.ntf テンプレートのフォームにすでにある小さいセクションと置き換わっています。したがって、カット・アンド・ペーストの操作から始めます。文書のフォームを開いて、「内容説明」ラベルと Body フィールドを含む2行を選びます。クリップボードにそれらを切り取ります。

そして、新しいサブフォームを作成し、クリップボードの内容をそこに貼り付けます。Body フィールドの下に、Default Value を "0" にして CryptoFlag という名前の、編集可能なテキスト・フィールドを作成します。ノーツまたはブラウザーで表示されないように、このフィールドの非表示タブで、段落非表示 の両方にチェック・マークを入れます。

Creating the PlainBody subform

「プレーン・テキスト Body | PainBody」という名前でこのサブフォームを保存します。

もうひとつ新しいサブフォームを作成し、クリップボードの同じ内容をそこに貼り付けます。このサブフォームの Body フィールドを選択し、このフィールドのプロパティー・ボックスを開きます。詳細タブのセキュリティー・オプションから 「このフィールドを暗号化する」を選択します。

Security tab settings

Body フィールドの下に、「Select secret encryption keys(暗号化シークレット・キーの選択)」という名前でテキスト・フィールドによりラベルを作成します。その下に、「SecretEncryptionKeys」という名前のチェック・ボックス・フィールドを追加します。このフィールドのプロパティー・ボックスの制御タブにある選択セクションで、「式で選択肢を設定」を選び、選択の式を次のように入力します。

@GetProfileField("Crypto";"SecretKeyList")

サブフォームの一番最後に新しい行を追加します。そして、Default Value を "1" にして「CryptoFlag」という名前の、編集可能なテキスト・フィールドを作成します。ノーツまたはブラウザーで表示されないように、このフィールドの非表示タブで、段落非表示の両方にチェック・マークを入れます。

Creating the SecretKeyBody subform

「シークレット暗号化 Body | SecretKeyBody」という名前でこのサブフォームを保存します。

同様の新しいサブフォームを作成するために、「シークレット暗号化 Body」のサブフォームのビューに戻り、ビュー全体を選び、それをコピーして新しいサブフォームに貼り付けます。(キーボードの操作で、Ctrl-C のキー操作をした後、Ctrl-V のキー操作を行うと、コピーと貼り付けが簡単に行えます)。そして次のようなメッセージが表示されます。「暗号化文書ライブラリー・テンプレートの元のデータベースは、「EncryptedR50DocLib」 という名前のテンプレートです。貼り付けた後、「EncryptedR50DocLib」のサブフォームが変更されたときこれらのサブフォームを自動的に更新しますか。(The source database 'Encrypted Doc Library Template' is a Design Template named 'EncryptedR5DocLib'. After being pasted, would you like these Subforms to be automatically updated when those in 'EncryptedR50DocLib' change?' )」。ここでは、[いいえ] をクリックし、同じテンプレートにサブフォームを貼り付けます。

新しくコピーで作成したサブフォームを開いて、サブフォームのプロパティー・ボックスをさらに開き、サブフォームの名前を「パブリック暗号化 Body | PublicKeyBody」に変更します。次に、SecretEncryptionKeys フィールドを選び、このフィールド・プロパティー・ボックスを開き、フィールドの名前を「PublicEncryptionKeys」に変えて、種類を名前に変えて、複数値も可のチェック・ボックスにチェックを入れます。

PublicEncryptionKeys field properties

フィールドのプロパティー・ボックスの制御タブにある、選択セクションでアドレス帳から選択を選び、オプション・セクションでエントリー補助ボタンの表示にチェックを入れます。最後に、Default Value に次の行を追加します。

@Name([CN];@Username)

Setting the field's default value

サブフォームへのこれらの変更を保存します。

ステップ5:フォームの更新
次に、新しいサブフォームを使用するために、テンプレートの既存フォームを更新する必要があります。文書のフォームを開いて、内容説明ラベルと Body フィールドの位置にカーソルを置きます。(もしその位置を忘れてしまった場合は、フォーム上のヘッダー・セクションの下に空白行が2行あるところが目印です。)メニューの [作成] - [サブフォームの挿入] をクリックし、サブフォームの挿入ダイアログ・ボックス上の、式の定義によりサブフォームを挿入 チェック・ボックスにチェックを入れ、[OK] をクリックします。計算結果(サブフォーム)の Default Value に、次のコードを入力します。

options := @GetProfileField("Crypto";"EncType");
oldSubform := @If(CryptoFlag = "0";

     "PlainBody";
   @IsAvailable(SecretEncryptionKeys);
     "SecretKeyBody";
   @IsAvailable(PublicEncryptionKeys);
     "PublicKeyBody";
   options = "";
     "PlainBody";
   ""
   );

respList := @Trim("No Encryption" :

   @If(options = "S";"Secret Key Encryption";"") :
   @If(options = "P";"Public Key Encryption";"")
   );

response := @If( oldsubform !="";

     "";
   @Prompt([OKCANCELLIST];"Encryption Options";
     "Please select how you want this document encrypted";
     "No Encryption";
     respList)
   );

subformList := @Trim("PlainBody" :

   @If(options = "S";"SecretKeyBody";"") :
   @If(options = "P";"PublicKeyBody";"")
   );

@If( oldSubform != "";

   oldSubform;

   response = "";
     "PlainBody";
   @Replace(response;respList;subformList)

)

上記のコードの記述により、新しい文書の暗号化を行うかどうかということと、どのタイプの暗号化を行うのかをユーザーに尋ねてくるようになります。アプリケーションのプロファイル文書で、暗号化はこのコードの処理によってのみ、ユーザーは暗号化タイプを選ぶことができます。既存文書については、その文書が作成されたときの CryptoFlag フィールドの値をコードが判断して決定します。また、文書が作成されたときに、シークレット・キー暗号化が行われた場合は SecretEncryptionKeys フィールドの値、パブリック・キー暗号化が行われた場合は PublicEncryptionKeys フィールドの値というように、コードはその状況に応じてどちらかの値を採用します。

これらの同じオプションを、アプリケーションの別のフォームに入れるため、計算結果(サブフォーム)をクリップボードへコピーします。そして、「返答」のフォームと「返答への返答」のフォームを開きます。その各フォームから内容説明ラベルと Body フィールドを削除し、代わりにクリップボードの計算結果(サブフォーム)を挿入し、そして上記のコードも貼り付けます。

ドミノ・デザイナーで開いた全ての設計要素を保存して閉じます。これで、テンプレートのコーディングが終了しました。
 
上に戻る
 
シークレット・キーの作成と展開
シークレット・キー暗号化を行うとき、最初にすることは、アプリケーションで使いたいキーを作成することです。キーは、ノーツ ID ファイルに保存されます。

ノーツ・クライアントで、[ファイル] - [ツール] - [ユーザ ID] を選択すると、ユーザ ID ダイアログ・ボックスが表示されます。このダイアログ・ボックスで、暗号化アイコンをクリックして、次に新規ボタンをクリックします。「暗号キーの作成」ダイアログ・ボックスが表示されます。ここで、暗号キーの名前 として、例えば、「My Personal Key」といった名前を入力します。アプリケーションに応じて複数のキーを使いたい場合は、再び新規ボタンをクリックし、暗号キーの名前に「My Workgroup Key」という名前を入力して、2つ目のキーを作成します。

Specifying encryption keys

個人利用のために、データを非公開にしておく場合は、他の人に公開しないキーを使います。そのキーを用いそして、誰にも知られていないパスワードで ID ファイルを安全に保てば、サーバー管理者がそのデータを読んでいるかどうかを心配せずに、サーバー上に個人情報を保存しておくことができます。

データをある一部の人と共有したい場合は、その人たちに、アプリケーション・データを共有するために必要なシークレット・キーを公開するかどうかは、個人の意志次第です。他の人にキーを公開するかどうかにかかわらず、新しいキーを作成するときはいつも、ID ファイルのバックアップを安全な場所に必ずとっておくことが大切です。もしキーのすべてのコピーが失われれば、そのキーで暗号化されたすべてのデータは、読めなくなります。関係者以外に知られていないパスワードで ID ファイルを安全に保つこともまた、キーを公開した人を含めキーを知っている全ての人にとって、とても重要なことです。

ユーザー ID ダイアログ・ボックスの「暗号化」には、暗号キーの「メール」と「書き出し」という2つの公開オプションがあります。より簡単な公開方法は、「メール」です。キーをメールで送信するとき、ノーツ・クライアントは、自動的にパブリック・キー暗号化を行い、シークレット・キーを保護します。そして、メール受信者はクリック1つで、メール受信者の ID ファイルにキーが追加されます。かわりに「書き出し」の方法を使う場合は、フロッピー・ディスクにキー・ファイルをコピーして、公開したい人にそのフロッピー・ディスクを手渡しします。そしてそのフロッピー・ディスクを受け取った人は、ユーザー ID ダイアログ・ボックスの、「暗号化」の「呼び出し」ボタンをクリックして、コンピューターに取り込みます。

手動で「書き出し」と「呼び出し」ボタンをクリックして、キーの受け渡しを行う理由は2つあります。第一に、ノーツ・メールのユーザーだけが、電子メールを介してキーを受け取ることができます。しかし、何人かのユーザーは、ノーツ・メールを使っていないことがあります。第二に、システム管理者が、個人の ID やパスワードにアクセスできないように制限しているにもかかわらず、シークレット・キーと同じくらい取り扱いを慎重にすべきものに対して、メール・システムに十分信頼がおけないと心配する場合です。

パブリック・キー暗号化の最大の利点の1つは、ユーザー ID ファイルが作成される時に、すべてのノーツ・ユーザーへ自動的に、パブリック・キーが送信されるということです。通常は、新しいファイルが作られることはありません。したがって、ユーザーにシークレット・キーを自動送信することは、議論の余地があります。
 
上に戻る
 
アプリケーションの展開
キーを配布したならば、これまでに作成した「暗号化文書ライブラリー」テンプレートを基に、新しいデータベース・ファイルを、メニューの [ファイル] - [データベース] - [作成] を順にクリックして作成します。(代わりに、Iris Sandbox(英語) からダウンロードしたサンプルの暗号化テンプレートを基に、データベースを作成することもできます。)新しいデータベースを開いて、アクション・メニューから「Set Up Encryption Profile」を選択します。

Encryption profile document

1つあるいは複数のシークレット・キーを使用したい場合、「Secret Key(シークレット・キー)」チェック・ボックスにチェックを入れます。そして、ユーザーが選びたいキーの名前を入力します。またユーザーに、パブリック・キー暗号化の使用を許可するときは、「Public Key(パブリック・キー)」チェック・ボックスにチェックを入れます。そして文書を保存します。

その他に行わなければいけないことは、データ共有者がデータベースにアクセスできるようアクセス制御リストを設定することと、別のサーバーに、データベースのコピーを作成しておくことです。
 
上に戻る
 
アプリケーションの使用
もし標準の文書ライブラリー・テンプレートを基にしたアプリケーションの作成に慣れているのであれば、その他の知識はほとんど必要ありません。「文書」、「返答」、および、「返答への返答」の文書を作成するときにはいつも、使用する暗号化のタイプを選択するよう入力を促されます。

Encryption options dialog box

シークレット・キー暗号化を選択した場合、文書にチェック・ボックスが表示されます。使いたいキーと一致するチェック・ボックスにチェック入れます。文書が保存される際に、選ばれたキーは、Body フィールドを暗号化するために使われます。

secret key options in the document

パブリック・キー暗号化を選べば、本人の名前が登録された名前選択フィールドが表示されます。ドミノ・ディレクトリー、あるいは個人アドレス帳から名前を選びたい場合、フィールドの隣りの補助ボタンから、標準のノーツのアドレス帳ダイアログ・ボックスが起動できます。このフィールドに他のユーザーの名前を追加します。文書が保存される際に、これらのユーザーのパブリック・キーが、文書の Body フィールドを暗号化するために使われます。

public key options in the document

もし文書に適切なシークレット・キーを適用しているか、あるいは、ユーザーの名前が文書に記載されていれば、編集を行うために、保存済みの文書を開いたり、新しいキー、新しい名前、または追加したキー、追加した名前を選んで、文書を再び保存できます。文書が保存されるとき、ノーツは自動的に Body フィールドを再び暗号化します。

このテンプレートで暗号化されるのは、Body フィールドだけです。注意することは、Subject フィールドは暗号化されないということです。サーバー上の Indexer タスクは、ビュー表示作成のために、キーにアクセスする必要があります。したがって、ビュー表示されるフィールドは暗号化の対象にはできません。そして、サーバーにキーを置くことは、暗号化の安全性を失うことになります。

背後の処理
非表示の処理についてもう少し詳しく見てみます。暗号化フィールドのあるフォームを利用して文書を作成するとき、2つの非表示フィールドが文書に追加されます。そのフィールドは、$Seal と $SealData です。

$Seal field information

これらのフィールドを、文書にあるときはいつも、ノーツは、どの暗号化タイプを適用し、どのキーを使うかを決めるため、SecretEncryptionKeys フィールドと、PublicEncryptionKeys フィールドを確認します。

暗号化と復号化は、ノーツ API ルーチンによってすべて自動的に処理されます。暗号化の処理は、 RSA と RC2 の2つのアルゴリズムにより行われます。シークレット・キー暗号化が実行されるときには、ノーツ API ルーチンが、次の項目を文書に保存します。
  • $SealData
    ランダムに作成された 64 ビット・キーにより、RC2 で暗号化されたフィールド・データがここにあります。このランダムなキーは、「Bulk 暗号キー」です。
  • $Seal
    名前が SecretEncryptionKeys フィールドと合致する現在の ID ファイルにおいて、ランダムに作成された 64 ビット・キーにより、RC2 で暗号化された Bulk 暗号キーがここにあります。
ノーツ API は、データベースの設計者に対して、SecretEncryptionKeys フィールドの複数のキーの指定を許可するので、ランダム・キーは、実際のフィールドの暗号化に使用されます。文書には、ふつう 64 ビット・データより大きなデータがあるので、ランダム・キーの暗号化を何度も実行することは、実際のデータを何度も暗号化するより簡単なことです。

パブリック・キー暗号化が実行されるときには、ノーツ API ルーチンが、次の項目を文書に保存します。
  • $SealData
    ランダムに作成された 64 ビット・キー、つまり、Bulk 暗号キーにより、RC2 で暗号化されたフィールド・データがここにあります。
  • $Seal
    名前が PublicEncryptionKeys フィールドと合致するユーザーのドミノ・ディレクトリーにある 630 ビットのパブリック・キーにより、RSA で暗号化された Bulk 暗号キーがここにあります。
ノーツの暗号化技術について詳しくお知りになりたい場合は、IBM Redbook − Lotus Notes and Domino R5.0 Security Infrastructure Revealed(英語) を参照してください。
 
上に戻る
 
Web アプリケーションでの暗号化
残念なことに、フィールド暗号化は、Web アプリケーションでは実行できません。暗号化サポートは、ノーツ・クライアントの機能です。シークレット・キーは、ノーツ ID ファイルに保存されています。パブリック・キーは、ドミノ・ディレクトリーに保存されています。しかし、パブリック・キーにより暗号化されたデータを復号化するためのプライベート・キーも、ノーツ ID ファイルに保存されます。ブラウザーには、この組み込みサポートがありません。そして、ブラウザーのユーザーには、ノーツ ID ファイルがありません。

理論上は、ブラウザーで実行されている Java アプレットや ActiveX コンポーネントは、暗号化と同様の機能を持っています。ノーツ ID ファイルに相当するブラウザー・ユーザーのキーを安全に格納しているファイルは、Java や ActiveX のコードで使用されています。実際には、Java や ActiveX のコードで暗号化が行われる場合、予想以上に難しいことが明らかになります。ブラウザー間の互換性、JVM の互換性、そしてプラットフォームのセキュリティーといった問題が、ブラウザーでの実行を難しくしています。今のところ、この解決方法はありません。
 
上に戻る
 
まとめ
暗号化について覚えておいて頂きたいことが、2、3あります。まず第一に、故意であれ、どのような目的であれ、ドミノの暗号化は破られることがありません。そのことは、良い点と悪い点の両面あります。ID ファイルに正当なキーがない限り、誰もデータを読むことができません。しかし、それはまた、もしキーを失えば、誰もデータを読むことができないということになります。ID ファイルに新しいシークレット・キーを追加する時はいつでも、必ず ID ファイルのバックアップを取るようにしてください。

また、暗号化されたフィールドは、ビューに表示されないということも覚えておいて頂きたいことです。これは、設計上の制限によるものです。仮に、サーバーの Indexer が、通常行わない正当なキーへアクセスした場合、サーバー上でビューをソートするときやクライアント上でビューを表示させるときなどに、データの復号化が実行されると重大な影響があります。これは、暗号化を使うときの設計上の大きな妥協点です。

本当にデータを保護する必要があるときに、暗号化はとても効果的なセキュリティー・ツールになります。ドミノデザイナーでは、暗号化を簡単に実行できます。それ以外の開発ツールは、ドミノデザイナーほど簡単なものではありません。本論で作成したサンプル・コードを、容易に、ご自分のアプリケーションで動作するように拡張することができます。



著者について
リチャード・シュワルツは、ロータス、アイリスを含め多くの大手企業に対して、ノーツとドミノのコンサルタントを行う、ロータスのビジネス・パートナーの RHS コンサルティング社の創業者です。ドミノ 4.6 のいくつかのテンプレートやサンプルの設計をしました。彼は、ロータスが認める技術者であり、ノーツとドミノ関連のさまざまな出版物を、数多く書いた執筆者です。彼はまた、ロータス プレミアム・ビジネス・パートナーの Penumbra グループの創業者です。そして、インターネット上のノーツに関連するさまざまフォーラムでの彼の活動は、1995 年1月にロータス ビジネス・パートナーのビーコン賞で表彰されました。1983 年から 1991 年まで、ワン研究所のなかで、彼は、電子メール、ディレクトリー、その他のネットワーク・アプリケーション製品開発の重要な貢献者でした。そして、彼には 18 年以上のグループウェア・テクノロジーの実践経験があります。
 
上に戻る